首页 > 解决方案 > 使用单元格引用周期(范围)打开和打印 Excel 工作簿

问题描述

我正在寻找一系列单元格并使用单元格中的每个值打开一个工作簿,然后打印出第一个工作表,关闭工作簿,然后循环到下一个值,直到该范围到达一个空白单元格。

这是我到目前为止所拥有的:

Sub Test()

Dim varCellvalue As Long
Dim rng As Range, rngcell As Range
Dim wb As Long
Set rng = Range("A1:A20")

For Each cell In rng

If Not cell = "" Then

varCellvalue = Range(cell).Value

Workbooks.Open "G:\_QA\Excel Workspace\Projects\Auto-print Processing Forms\Printouts\" & varCellvalue & ".xls"

ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
    IgnorePrintAreas:=False

Workbooks(varCellvalue).Close SaveChanges:=False

On Error Resume Next

End If

Next cell

End Sub

我有一个工作簿来处理每天更新的另一个导入工作表的数据。到目前为止,我已经获得了我需要的所有信息,然后循环浏览生成的列表并使用生成的单元格值打开并打印我需要的工作表。

编辑:

Sub Test()

Dim rng As Range, rngcell As Range
Dim wb As Excel.Workbook
Set rng = Range("A1:A20")

For Each rngcell In rng.cells

    If Not rngcell.value = "" Then

        Set wb = Workbooks.Open("G:\_QA\Excel Workspace\Projects\Auto-print Processing Forms\Printouts\" & rngcell.Value & ".xls")

        ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
IgnorePrintAreas:=False

        wb.Close SaveChanges:=False


    End If

Next rngcell

End Sub

标签: excelvbaif-statementprinting

解决方案


从范围打印

编码

Sub PrintFromRange()

  Const cPath As String = "G:\_QA\Excel Workspace\Projects\" _
      & "Auto-print Processing Forms\Printouts\"
  Const cExt As String = ".xls"
  Const cRng As String = "A1:A20"

  Dim i As Integer

  With Range(cRng)
    For i = 1 To .Rows.Count
      If .Cells(i, .Column) <> "" Then
        With Workbooks.Open(cPath & .Cells(i, .Column) & cExt)
          .ActiveSheet.PrintOut Collate:=True, IgnorePrintAreas:=False
          .Close False
        End With
'       Else: Exit For
      End If
    Next
  End With

End Sub

评论

该代码演示了有时不需要使用对象引用。

使用With语句是分割代码的好方法,即使其更短、更易读。

我不清楚为什么使用Not并且=可能比使用更可取<>。通过这种方式,我专门将它用于对象,通常是If Not ... Is Nothing Then.

PrintOut属性Copies默认为 1,因此可以安全地省略它。不清楚默认值是什么Collate,我的 Excel 2003 无法识别IgnorePrintAreas.

的第一个参数CloseSaveChanges所以它可以通过“添加”它的参数来简化(False在这种情况下)。

通过不使用这些行Else: Exit For,您允许范围不连续,即当代码“命中”一个空单元格时,它仍然在该范围的以下单元格中搜索,这在这种情况下可能更可取,因为您已经声明了一个小范围。在许多其他情况下,您可能不想忘记包含这些行。


推荐阅读