【问题标题】:Number each Row when printing VBA打印 VBA 时为每一行编号
【发布时间】:2020-04-09 11:45:27
【问题描述】:

我在两列(myrange1 和 myrange2)中找到匹配项,并将它们填充到 sheet2 的第三列(“R”)中。我的范围从“R”列打印到 PDF 就好了,但我希望每个都在 PDF 上按顺序编号,即 1、2、3、4 等。非常感谢帮助。 VBA 也很新。

Sub matchcopy()
    Dim myrange1 As Range, myrange2 As Range, cell As Range

    With Sheets("Sheet1")
        Set myrange1 = .Range("A1", .Range("A" & Rows.Count).End(xlUp))
    End With

    With Sheets("Sheet2")
        Set myrange2 = .Range("A1", .Range("A" & Rows.Count).End(xlUp))
    End With

    For Each cell In myrange1
        If Not IsError(Application.Match(cell.Value, myrange2, 0)) Then  
            'cell.Value, myrange2, 0
            cell.Copy
            Sheet2.Range("R5000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats
        Else
            'MsgBox "no match is found in range"
        End If
    Next cell

    Columns("R:R").EntireColumn.AutoFit
    Call Set_PrintRnag
End Sub


Sub Set_PrintRnag()
    Dim LstRw As Long
    Dim Rng As Range

    LstRw = Cells(Rows.Count, "R").End(xlUp).Row
    Set Rng = Range("R1:R" & LstRw)

    With ActiveSheet.PageSetup
        .LeftHeader = "&C &B &20 Cohort List Report : " & Format(Date, 
    "mm/dd/yyyy")
    End With

    Rng.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & _
      "\CohortList " & " " & Format(Date, "mm-dd-yyyy") & ".pdf", _
      Quality:=xlQualityStandard, IncludeDocProperties:=True, _
      IgnorePrintAreas:=False, OpenAfterPublish:=True
End Sub

【问题讨论】:

  • 那么为什么不在 R 列前添加另一列并添加行号然后打印这两列。
  • 这是我的问题。我无法弄清楚如何在 matchcopy() 子例程或 Set_PrintRnag() 中按顺序对每个结果进行编号。我已经让它打印数字,但不是它找到的匹配项。我也需要匹配值。感谢您的回复。
  • 为了澄清我的第一反应,我可以让它打印数字,但不匹配或匹配,但没有数字。

标签: excel vba


【解决方案1】:

尽可能接近您的代码,尽管循环遍历一个范围总是很耗时,并且您可以更快地处理要比较的列的数组:

Option Explicit

Sub matchcopy()
    Dim i&
    Dim myrange1 As Range, myrange2 As Range, cell As Range
  ' You can use the Codenames instead of Worksheet("Sheet1") etc.
    Set myrange1 = Sheet1.Range("A1", Sheet1.Range("A" & Rows.Count).End(xlUp))
    Set myrange2 = Sheet2.Range("A1", Sheet2.Range("A" & Rows.Count).End(xlUp))
    Sheet2.Range("R:S") = ""                 ' <~~ clear result columns

    For Each cell In myrange1               ' presumably unique items
        If Not IsError(Application.Match(cell.Value, myrange2, 0)) Then
            cell.Copy
            With Sheet2.Range("R5000").End(xlUp)
                i = i + 1                   ' <~~ counter
                .Offset(1, 0) = i           ' counter i equals .Row - 1
                .Offset(1, 1).PasteSpecial xlPasteFormulasAndNumberFormats
            End With
        Else
            'MsgBox "no match is found in range"
        End If
    Next cell

    Sheet2.Columns("R:S").EntireColumn.AutoFit
    Call Set_PrintRnag                      ' called procedure see OP
End Sub

Sub Set_PrintRnag()
Dim LstRw As Long
Dim Rng As Range

LstRw = Sheet2.Cells(Rows.Count, "R").End(xlUp).Row
Set Rng = Sheet2.Range("R1:S" & LstRw)

With Sheet2.PageSetup
    .LeftHeader = "&C &B &20 Cohort List Report : " & Format(Date, "mm/dd/yyyy")
End With

Rng.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & _
  "\CohortList " & " " & Format(Date, "mm-dd-yyyy") & ".pdf", _
  Quality:=xlQualityStandard, IncludeDocProperties:=True, _
  IgnorePrintAreas:=False, OpenAfterPublish:=True
End Sub

附加提示

要了解如何使用数据字段数组,请参阅例如所以回复Loop with multiple ranges

【讨论】:

  • 这就像一个冠军!我感谢您的帮助!!非常感谢!
  • 我正在尝试添加一个在找到匹配项时被复制的列。我需要将 A 列和 B 列复制并粘贴到“T:U”(上面的“R:S”)。我当前的代码粘贴了行号(T 列),但右侧没有任何内容(U 列)。我的 myrange3 被粘贴在 U 列结束的地方。找到匹配项时,我需要将 A 列和 B 列中的单元格复制并粘贴到“T:U”。然后我会将 ("T:U") 打印成 PDF。
  • 这包含我的补充。 Set myrange3 = Sheet2.Range("B1", Sheet2.Range("B" & Rows.Count).End(xlUp)) Sheet2.Range("T:U") = "" '
  • 我缩进了四个空格,但代码看起来像文本。我是不是做错了什么?
  • cmets 中的代码不能通过缩进来格式化。参考上面的 cmets:没有看到完整的代码和完整的描述你在哪里做什么(正确的工作表引用?),很难理解你的实际问题 - 考虑用示例数据提出一个新问题。
【解决方案2】:

您是否需要一个 VBA 脚本来实现您想要的目标?如果您只是想比较两个值并在 R 列中输出结果,您应该可以使用 IF 函数:https://support.office.com/en-us/article/if-function-69aed7c9-4e8a-4755-a9bc-aa8bbff73be2

如果您想要对结果进行连续编号,我建议将数字放在相邻列中并探索 COUNTA 函数:https://support.office.com/en-us/article/counta-function-7dc98875-d5c1-46f1-9a82-53f3219e2509

如果您确实需要 VBA 脚本格式,您可以先使用 Excel 函数执行此操作,然后再录制宏。使创建实际的 VBA 语法更容易一些! https://support.office.com/en-us/article/automate-tasks-with-the-macro-recorder-974ef220-f716-4e01-b015-3ea70e64937b

【讨论】:

  • 感谢您的回复。我已经将两个比较值的结果输出到另一列。我的问题是当我将它们输出到另一列或在 PDF 中打印(导出)它们时对它们进行编号。
猜你喜欢
  • 2016-05-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
相关资源
最近更新 更多