Nguyễn Hoàng 
Nguyễn Hoàng 
Thảo luận 4 thảo luận
Vỗ tay 0 vỗ tay
Lượt xem 250 lượt xem

cho e xin đoạn code với nội dung bên dưới được không Khi run VBA

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



Thảo luận 4 câu trả lời
Lượt xem 250 lượt xem
Vỗ tay vỗ tay
Nguyễn Hoàng  13:02 - Feb 24, 2021

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é.

Vỗ tay vỗ tay
Nguyễn Hoàng  21:02 - Feb 24, 2021

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











Vỗ tay vỗ tay
Nguyễn Hoàng  09:02 - Feb 25, 2021

Ở đâ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)

Vỗ tay vỗ tay
Nguyễn Hoàng  12:02 - Feb 25, 2021

Cảm ơn thầy . để em vào chương 10 xem lại

Vỗ tay vỗ tay
Câu hỏi liên quan
© 2020 - Bản quyền của Công Ty Cổ Phần Công Nghệ Giáo Dục Gitiho Việt Nam
Giấy chứng nhận Đăng ký doanh nghiệp số: 0109077145, cấp bởi Sở Kế hoạch và Đầu tư TP. Hà Nội
Giấy phép mạng xã hội số: 588, cấp bởi Bộ Thông tin và Truyền thông