【问题标题】:Using a cell reference cycle (of a range) to open and print excel workbooks使用单元格引用周期(范围)打开和打印 Excel 工作簿
【发布时间】:2018-12-22 01:01:12
【问题描述】:

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

这是我目前所拥有的:

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

【问题讨论】:

  • 你不需要 range(cell).value,cell.value 应该为你做
  • 然后我的宏返回不匹配错误?
  • 另外,除非你所有的电子表格都是数字,否则我不会让 varcellvalue 长。我认为你甚至不需要它,你可以在整个过程中使用 cell.value。 wb 应该是 Excel.workbook,而不是很长。
  • 废话,再来一张,用。设置 wb = workbooks.open(... etc 然后 wb.selected... 和 wb.close
  • 好的,还没有完成。使用保留字作为变量是不好的形式,单元格应该有不同的拼写,也许是 rngCell?我相信您可能想要做一些类似“为 rng.cells 中的每个 rngCell”的事情,但没有那么自信。

标签: excel vba if-statement printing


【解决方案1】:

从范围打印

代码

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= 可能比使用&lt;&gt; 更可取。通过这种方式,我专门将它用于对象,通常是If Not ... Is Nothing Then

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

Close 的第一个参数是SaveChanges,因此可以通过“添加”其参数来简化它(在本例中为False)。

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

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多