Hi thầy .
Thầy cho e xin đoạn code với nội dung bên dưới được không thầy.
Khi run VBA , code sẽ tự tìm 10 file trùng với tên của dữ liệu tại cột A , từ A1 => A10 với đuôi là xlsm và đính kèm vào mail outlook. ( 10 file này đã tồn tại với đuôi là .xlsm )
Trường hợp 1 : dữ liệu chỉ có từ A1 => A9, A10 trống thì code vẫn chạy và đính kèm 9 file . ko báo lỗi
Trường hợp 2 : dữ liệu có đủ từ A1 =>A10 nhưng file tồn tại chỉ có 9 thì code vẫn chạy và không báo lỗi .
Em cảm ơn thầy
Chào bạn bạn cần lặp forder rồi so sánh với địa chỉ ô nhé nếu đúng bạn đưa ra 1 vị trí nào đó, nếu sai đưa ra vị trí khác dạng như sau.
for i = 1 to n
if dieukien then
kết quả dúng
else
kết quả sai
end if
next i
bạn xuất kết quả đúng và sai ra từng vùng hoặc làm điều kiện nào đó trong code này nhé.
Chào thầy . Em có viết đoạn code bên dưới . Nhưng nếu 1 file không tồn tại ( ví dụ file số 5 ) thì code vẫn run nhưng không cho ra kết quả . Thầy sửa giúp em làm thế nào để khi có 4 file thì sẽ đính kèm 4 file ( trong khi code của mình là đính kèm 5 file )
Option Explicit
Sub guimail_dinhkem()
Dim rng As Range
Dim OutApp As Object
Dim OutMail As Object
Dim sName1 As String
Dim sName2 As String
Dim sName3 As String
Dim sName4 As String
Dim sName5 As String
sName1 = Sheets("Form bao cao chuyen tai").Range("C4").Value
sName2 = Sheets("Form bao cao chuyen tai").Range("C5").Value
sName3 = Sheets("Form bao cao chuyen tai").Range("C6").Value
sName4 = Sheets("Form bao cao chuyen tai").Range("C7").Value
sName5 = Sheets("Form bao cao chuyen tai").Range("C8").Value
If sName5 = "" Then
Else
End If
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
If Sheet9.Range("B2").Value <> "" Then
Else
MsgBox " Khong co data "
Exit Sub
End If
Dim MailBody As String
Dim DongCuoi As Long
DongCuoi = Sheet9.Range("B" & Rows.Count).End(xlUp).Row
Set rng = Nothing
On Error Resume Next
Set rng = Sheet9.Range("A1:L" & DongCuoi).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rng Is Nothing Then
MsgBox "The selection is not a range or the sheet is protected" & _
vbNewLine & "please correct and try again.", vbOKOnly
Exit Sub
End If
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
MailBody = "Dear team!" & vbNewLine & _
"(Pls xem file dinh kem )"
With OutMail
.To =
.CC = ""
.BCC = ""
.Subject = "Tally sheet done " & Sheet4.Range("B1").Text
On Error Resume Next
.Attachments.Add ThisWorkbook.Path & "\" & sName1 & ".xlsm"
.Attachments.Add ThisWorkbook.Path & "\" & sName2 & ".xlsm"
.Attachments.Add ThisWorkbook.Path & "\" & sName3 & ".xlsm"
.Attachments.Add ThisWorkbook.Path & "\" & sName4 & ".xlsm"
.Attachments.Add ThisWorkbook.Path & "\" & sName5 & ".xlsm"
.HTMLBody = MailBody & RangetoHTML(rng) & "Thank you "
.Display
End With
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
Set OutMail = Nothing
Set OutApp = Nothing
End Sub
Function RangetoHTML(rng As Range)
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook
TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
rng.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
On Error GoTo 0
End With
With TempWB.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=TempFile, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.readall
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
"align=left x:publishsource=")
TempWB.Close savechanges:=False
Kill TempFile
Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function
Ở đây bạn không nên giới hạn số lượng file, mà nên dùng 1 biến xác định tổng số file, sau đó thực hiện add file theo vòng lặp.
Bạn dùng FileDialog với FilePicker, dựa vào .SelectedItems.Count sẽ thống kê được bạn sẽ cần chọn bao nhiêu file.
Dùng biến i trong vòng lặp For:
For i = 1 to .SelectedItems.Count
...
Next i
(cách làm này tương tự với phương pháp dùng vòng lặp để gom dữ liệu từ nhiều file vào 1 file tại bài 6 chương 10)
Cảm ơn thầy . để em vào chương 10 xem lại