【问题标题】:How to make a Loop in an If-Statement如何在 If 语句中创建循环
【发布时间】:2021-04-30 08:53:54
【问题描述】:

简短说明:有 3.Letter 模板,我希望它们按按钮打印。但这里的主要问题是,如果这个人已经有一封信,代码也会为工作表中的每个人打印模板。它应该看起来像这样。

-如果“G3”中选择的字母是1.那么只发送给“Z”中单元格范围为空的人

-如果“G3”中选择的字母是 2.Letter,则仅将它们发送给“Z”范围内的单元格为 1.Letter 的人

-如果“G3”中选择的字母是 3.Letter,则仅将它们发送给“Z”范围内的单元格为 2.Letter 的人

我需要在这里写什么?

感谢您提前回答!

https://i.stack.imgur.com/1NRbv.png

Option Explicit
Sub CreateWordDocuments()
Dim CustRow, CustCol, LastRow, TemplRow, DaysSince, FrDays, ToDays As Long
Dim DocLoc, TagName, TagValue, TemplName, FileName As String
Dim CurDt, LastAppDt As Date
Dim OutApp, OutMail As Object
Dim WordContent As Word.Range
Dim WordDoc As Word.Document
Dim WordApp As Word.Application


With Tabelle1


    If IsEmpty(Range("G3").Value) = True Then
    MsgBox "Bitte wählen sie eine Vorlage aus"
    .Range("G3").Select
    Exit Sub
    End If
    TemplRow = .Range("B3").Value
    TemplName = .Range("G3").Value
    FrDays = .Range("L3").Value
    ToDays = .Range("N3").Value
    DocLoc = Tabelle2.Range("F" & TemplRow).Value


    On Error Resume Next
    Set WordApp = GetObject("Word.Application")
    If Err.Number <> 0 Then
    Err.Clear
    Set WordApp = CreateObject("Word.Application")
    WordApp.Visible = True
    End If

    ***LastRow = .Range("E9999").End(xlUp).Row
        For CustRow = 8 To LastRow
            DaysSince = .Range("P" & CustRow).Value
            If TemplName <> .Range("Z" & CustRow).Value And DaysSince >= FrDays And DaysSince <= ToDays Then
               Set WordDoc = WordApp.Documents.Open(FileName:=DocLoc, ReadOnly:=False)
                For CustCol = 5 To 26
                    TagName = .Cells(7, CustCol).Value
                    TagValue = .Cells(CustRow, CustCol).Value
                    With WordDoc.Content.Find
                        .Text = TagName
                        .Replacement.Text = TagValue
                        .Wrap = wdFindContinue
                        .Execute Replace:=wdReplaceAll
                    End With***

                Next CustCol
            If .Range("I3").Value = "PDF" Then
                FileName = "Filename" & "\" & .Range("H" & CustRow).Value & " " & .Range("G" & CustRow).Value & " " & .Range("G3").Value & ".pdf"
                WordDoc.ExportAsFixedFormat OutputFileName:=FileName, ExportFormat:=wdExportFormatPDF
                WordDoc.Close False
            Else:
                FileName = ThisWorkbook.Path & "\" & .Range("H" & CustRow).Value & "_" & .Range("G" & CustRow).Value & ".docx"
                WordDoc.SaveAs FileName


            End If
            .Range("Z" & CustRow).Value = TemplName
            .Range("AA" & CustRow).Value = Now
        If .Range("P3").Value = "Email" Then
            Set OutApp = CreateObject("Outlook.Application")
            Set OutMail = OutApp.CreateItem(0)
            With OutMail
                .To = Tabelle1.Range("K" & CustRow).Value
                .Subject = "Hallo, " & Tabelle1.Range("F" & CustRow).Value & "Test Test Test"
                .Body = "Hallo, " & Tabelle1.Range("F" & CustRow).Value & "Test Test Test Test"
                .Attachments.Add FileName
                .Display
            End With

        Else:
        WordDoc.PrintOut
        WordDoc.Close
        End If
        Kill False '(FileName)
        End If

    Next CustRow
    WordApp.Quit
End With
End Sub

【问题讨论】:

    标签: excel vba if-statement excel-formula


    【解决方案1】:

    尝试以下方法:(未测试)

    Sub CreateWordDocuments()
    Dim CustRow As Long, CustCol As Long, LastRow As Long, TemplRow As Long, DaysSince As Long, FrDays As Long, ToDays As Long
    Dim DocLoc As String, TagName As String, TagValue As String, TemplName As String, FileName As String
    Dim CurDt As Date, LastAppDt As Date
    Dim OutApp As Object, OutMail As Object
    Dim WordContent As Word.Range
    Dim WordDoc As Word.Document
    Dim WordApp As Word.Application
    
    '*~
    Dim sLastSentTemplate As String
    
    
    With Tabelle1
    
    
        If IsEmpty(Range("G3").Value) = True Then
        MsgBox "Bitte wählen sie eine Vorlage aus"
        .Range("G3").Select
        Exit Sub
        End If
        TemplRow = .Range("B3").Value
        TemplName = .Range("G3").Value
        FrDays = .Range("L3").Value
        ToDays = .Range("N3").Value
        DocLoc = Tabelle2.Range("F" & TemplRow).Value
    
        '*~ workout the last sent template name
        '*  this is what you'll be searching for in column Z
        sLastTemplateTarget = GetLastSentTemplate(TemplName)
        
        
        On Error Resume Next
        Set WordApp = GetObject("Word.Application")
        If Err.Number <> 0 Then
        Err.Clear
        Set WordApp = CreateObject("Word.Application")
        WordApp.Visible = True
        End If
    
        '***LastRow = .Range("E9999").End(xlUp).Row
        '*~
        LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row
        
            For CustRow = 8 To LastRow
                DaysSince = .Range("P" & CustRow).Value
                '*~ changed TemplName to sLastSentTemplate
                If sLastSentTemplate = .Range("Z" & CustRow).Value And DaysSince >= FrDays And DaysSince <= ToDays Then
                   Set WordDoc = WordApp.Documents.Open(FileName:=DocLoc, ReadOnly:=False)
                    For CustCol = 5 To 26
                        TagName = .Cells(7, CustCol).Value
                        TagValue = .Cells(CustRow, CustCol).Value
                        With WordDoc.Content.Find
                            .Text = TagName
                            .Replacement.Text = TagValue
                            .Wrap = wdFindContinue
                            .Execute Replace:=wdReplaceAll
                        End With '***
    
                    Next CustCol
                If .Range("I3").Value = "PDF" Then
                    FileName = "Filename" & "\" & .Range("H" & CustRow).Value & " " & .Range("G" & CustRow).Value & " " & .Range("G3").Value & ".pdf"
                    WordDoc.ExportAsFixedFormat OutputFileName:=FileName, ExportFormat:=wdExportFormatPDF
                    WordDoc.Close False
                Else:
                    FileName = ThisWorkbook.Path & "\" & .Range("H" & CustRow).Value & "_" & .Range("G" & CustRow).Value & ".docx"
                    WordDoc.SaveAs FileName
    
    
                End If
                .Range("Z" & CustRow).Value = TemplName
                .Range("AA" & CustRow).Value = Now
            If .Range("P3").Value = "Email" Then
                Set OutApp = CreateObject("Outlook.Application")
                Set OutMail = OutApp.CreateItem(0)
                With OutMail
                    .To = Tabelle1.Range("K" & CustRow).Value
                    .Subject = "Hallo, " & Tabelle1.Range("F" & CustRow).Value & "Test Test Test"
                    .Body = "Hallo, " & Tabelle1.Range("F" & CustRow).Value & "Test Test Test Test"
                    .Attachments.Add FileName
                    .Display
                End With
    
            Else:
            WordDoc.PrintOut
            WordDoc.Close
            End If
            Kill False '(FileName)
            End If
    
        Next CustRow
        WordApp.Quit
        
        '*~ cleanup after finishing
        Set WordApp = Nothing
        Set OutApp = Nothing
    End With
    End Sub
    
    '*~
    Function GetLastSentTemplate(sTemplate As String) As String
        Dim lPrefixNumber As Long
        
        If Len(sTemplate) > 0 Then
            lPrefixNumber = Val(Left(sTemplate, InStr(sTemplate, ".") - 1))
            If lPrefixNumber > 1 Then
                GetLastSentTemplate = Replace(sTemplate, lPrefixNumber, lPrefixNumber - 1)
            End If
        End If
    End Function
    

    【讨论】:

    • 所以我尝试了它并且它有效,但只有 1.Letter 正在打印,但是当我尝试第二个时,第三个字母 Word 正在打开 1 秒。并直接关闭...到目前为止只有 1.Letter 有效...
    • 尝试将代码 sLastSentTemplate = .Range("Z" &amp; CustRow).Value 更改为 Instr(Left(.Range("Z" &amp; CustRow).Value, sLastSentTemplate) &gt; 0。如果这可行,那么您在 Z 列中有一些不可见的字符(例如 1.Letter 之后的额外空格)
    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 2020-05-15
    • 2013-08-05
    • 1970-01-01
    • 2014-01-15
    • 2013-10-05
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多