搜索唯一值并调用 sub,如果没有则转到下一个单元格

Searching for unique value and call sub, if not go to next cell

我正在尝试根据唯一值创建子自动调用。

E 列 The order is in column E

Sub FindDate()

Dim Cell As Range


'For Each Cell In ActiveSheet.Range("A1:A50")
'    If Cell.Value = [Today()] Then
'    Cell.Select
'ActiveCell.Offset(0, 4).Select
'    End If
'Exit For
'Next



For Each Cell In ActiveSheet.Range("E2:E100")

If ActiveCell.Value = "" Then


End If
Exit For
Next

For Each Cell In ActiveSheet.Range("E2:E100")
If ActiveCell.Value = ActiveCell.Offset(-1, 0) Then

ActiveCell.Offset(1, 0).Select

        
           Call EmailOrder
    
           ' ElseIf ActiveCell.Value <> ActiveCell.Offset(-1, 0) Then Call EmailOrder
            'ElseIf ActiveCell.Value = "" Then Exit Sub
            End If
        
Next Cell


End Sub

目前使用这段代码(我知道它真的很乱,但我只是一个 VBA 初学者)当我 select 第二个 PAU21001316(从图片中)然后它正在调用我的 EmailOrder 是 PAU21001316 和 PAU21001318 的子项,但不是 PAU21001319 和 PAU21001320 的子项。

代码应该这样做:如果我 select 一个单元格,比方说 PAU21001309 查看上面(或下面)的单元格是否具有相同的值,如果不相同则将下面的一个单元格移动运行 调用 EmailOrder 之后移动到下一个单元格并执行相同操作。 Then If a cell is empty to stop.

重点是 运行 每个唯一值同时存在。

我试图做的另一件事(第一个代码作为注释)是转到今天的日期并将 4 列移动到第一个订单号。它正在移动活动单元格,但之后什么都不做,只是循环。

如果有人能帮助我完成我的代码,我将不胜感激。

Sub EmailOrder(c As Range)


    Dim ActiveC As Variant
    Dim DirFile As String
    Dim OutApp As Outlook.Application
    Dim OutMail As Outlook.MailItem
    Dim strbody As String
    Dim SigString As String
    Dim Signature As String
    Dim xOutMsg As String
    Dim Timenow As String
    
    Dim signImageFolderName As String
    Dim completeFolderPath As String
    
   Dim colFiles As New Collection

'GetFiles "C:\xxx\", ActiveC & ".pdf", True, colFiles
'If colFiles.Count > 0 Then
'    'work with found files
'End If

    
    If Time < TimeValue("12:00:00") Then
Timenow = "Good Morning"
ElseIf Time > TimeValue("12:00:00") And Time < TimeValue("17:00:00") Then
Timenow = "Good Afternoon"
Else
Timenow = "Good Evening"
End If
   
    xOutMsg = Timenow & ", <br> <br> xxx<br/>"


ActiveC = Application.ActiveCell.Value

Dim sRes As String
Dim po As Range
Dim rg As Range
Dim b2 As Range

Set po = ActiveCell.Offset(0, 3)

    
    Set rg = Sheets("Email").Range("B1:D200")
    Set b2 = po
    
    sRes = Application.VLookup(b2, rg, 3, True)


'Optimize Code
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  Application.DisplayAlerts = False



DirFile = "C:\xxx\" & ActiveC & ".pdf"
     If Dir(DirFile) = "" Then
  MsgBox "File does not exist", vbCritical
    
  End If
  
  
  Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(olMailItem)


    'Change only Mysig.htm to the name of your signature
    SigString = Environ("appdata") & _
                "\Microsoft\Signatures\xxx.htm"
                
                signImageFolderName = "xxxfiles"
                completeFolderPath = Environ("appdata") & "\Microsoft\Signatures\" & signImageFolderName


    If Dir(SigString) <> "" Then
        Signature = GetBoiler(SigString)
        
        Signature = VBA.Replace(Signature, signImageFolderName, completeFolderPath)
    Else
        Signature = ""
    End If

'Create Outlook email with attachment
  On Error Resume Next
  
    With OutMail
    
     .To = sRes
     .CC = ""
     .BCC = ""
     .Subject = "xxx " & ActiveC
     .HTMLBody = xOutMsg & "<br>" & Signature
     .Attachments.Add "C:xxx\" & ActiveC & ".pdf"
     .Display
     
    End With
    
    Call FindDate
    
    On Error GoTo 0
    Set OutMail = Nothing
    Set OutApp = Nothing
   
End Sub

Function GetBoiler(ByVal sFile As String) As String
'Dick Kusleika
    Dim FSO As Object
    Dim ts As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set ts = FSO.GetFile(sFile).OpenAsTextStream(1, -2)
    GetBoiler = ts.readall
    ts.Close
End Function

这是主要代码,由不同的代码组成。主要目的是获取活动单元格的值并查看文件 name.pdf 的文件夹(我无法查看子文件夹)并将其附加到电子邮件。另一部分是在 H 列中查找供应商名称,并 VLOOKUP 到供应商电子邮件的另一个 sheet“电子邮件”,并将其添加到“收件人”部分。另一个代码用于电子邮件的签名和正文。

代码有效,但仅当我 select 特定单元格时有效。但是如果每天自动做每个PO会更快。

试试这个:

Sub Tester()
    Dim f As Range, c As Range
    
    Set f = Range("A1:A50").Find(Date)  'Look for today's date
    If f Is Nothing Then Exit Sub       'Today not found....
    
    Set c = f.Offset(0, 4) 'move over to Col E
    Do While Len(c.Value) > 0
        If c.Offset(1, 0).Value <> c.Value Then
            EmailOrder c       'pass cell directly to your called sub
        End If
        Set c = c.Offset(1, 0) 'move down one row
    Loop
End Sub

Sub EmailOrder(c As Range)
    Const FLDR As String = "C:\xxx\" 'start search here

    Dim ActiveC As Variant
    Dim OutApp As Outlook.Application
    Dim OutMail As Outlook.MailItem
    Dim strbody As String
    Dim SigString As String
    Dim Signature As String
    Dim sRes As String
    Dim po
    Dim rg As Range, b2 As Range
    Dim signImageFolderName As String, completeFolderPath As String
    
    Dim colFiles As Collection

    ActiveC = c.Value
    po = c.Offset(0, 3).Value
    Set rg = Sheets("Email").Range("B1:D200")
    
    sRes = Application.VLookup(po, rg, 3, True) 'False?
    
    Set colFiles = GetMatches(FLDR, ActiveC & ".pdf") 'find any matches
    If colFiles.Count = 0 Then
        MsgBox "File '" & ActiveC & ".pdf' does not exist", vbCritical
        Exit Sub
    End If
    'what to do if >1 files found?
    
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(olMailItem)
    
    'Change only Mysig.htm to the name of your signature
    SigString = Environ("appdata") & "\Microsoft\Signatures\xxx.htm"
    signImageFolderName = "xxxfiles"
    completeFolderPath = Environ("appdata") & "\Microsoft\Signatures\" & signImageFolderName
    If Dir(SigString) <> "" Then
        Signature = VBA.Replace(GetBoiler(SigString), signImageFolderName, completeFolderPath)
    End If

    With OutMail
        .To = sRes
        .CC = ""
        .BCC = ""
        .Subject = "xxx " & ActiveC
        .HTMLBody = TimeGreeting & ", <br> <br> xxx<br/>" & Signature
        .Attachments.Add colFiles(1).Path 'assuming you only want the first match if >1
        .Display
    End With
    
    Call FindDate
    
End Sub

Function TimeGreeting() As String
    If Time < TimeValue("12:00:00") Then
        TimeGreeting = "Good Morning"
    ElseIf Time > TimeValue("12:00:00") And Time < TimeValue("17:00:00") Then
        TimeGreeting = "Good Afternoon"
    Else
        TimeGreeting = "Good Evening"
    End If
End Function

文件搜索功能:

'Return a collection of file objects given a starting folder and a file pattern
'  e.g. "*.txt"
'Pass False for last parameter if don't want to check subfolders
Function GetMatches(startFolder As String, filePattern As String, _
                    Optional subFolders As Boolean = True) As Collection

    Dim fso, fldr, f, subFldr
    Dim colFiles As New Collection
    Dim colSub As New Collection
    
    Set fso = CreateObject("scripting.filesystemobject")
    colSub.Add startFolder '<< start with the top-level folder
    
    Do While colSub.Count > 0
        Set fldr = fso.getfolder(colSub(1))
        colSub.Remove 1  '<< remove from queue
        For Each f In fldr.Files 'check all files
            If UCase(f.Name) Like UCase(filePattern) Then colFiles.Add f
        Next f
        If subFolders Then 'add subfolders to queue for listing
            For Each subFldr In fldr.subFolders
                colSub.Add subFldr.Path
            Next subFldr
        End If
    Loop
    Set GetMatches = colFiles
End Function