【发布时间】:2026-01-27 12:10:01
【问题描述】:
我继承了这种糟糕,并被要求进行更新。
目前,此工作簿是用一个带有一堆复选框的工作表构建的,所有复选框都与工作簿中的其他工作表相关联。用户选择复选框,然后点击按钮以打印与选中的每个复选框相关联的工作表。
按照现在的构建方式,它会为所选的每张纸运行一个打印作业。我被要求为所有选定的纸张运行一项打印作业(以避免有一百张封面)。
我编写了一个小 VBA 函数,它生成一个字符串,其中包含选中复选框的每个工作表的名称,用引号括起来,逗号分隔。
我需要找到一种方法来使用此信息来选择所有工作表,然后在选择了我需要的每张工作表后打印。
或者甚至是地狱,我认为能够将这个字符串吐回到最初为打印功能编写的宏中。现在,宏是工作簿中的另一张工作表,有 102 个不同的打印命令,由一堆 if 语句控制。所以我打算将字符串吐到那张纸上,这样我就可以运行一个打印命令了。
不管怎样,请有人帮忙。
这是我的代码:
Public Function sheetString()
Dim c As Integer
Dim r As Integer
Dim sConcat As String
Dim ws As Worksheet
For c = 2 To 6 Step 2
For r = 1 To 46
If Sheet94.Cells(r, c) = True Then
sConcat = sConcat & Sheet94.Cells(r, c - 1) & ", "
End If
Next r
Next c
sConcat = Left(sConcat, Len(sConcat) - 2)
Debug.Print sConcat
End Function
代码的输出是这样的(根据选中的框有不同的名称):
“PR015”、“PR018”、“PR019”、“PR026”、“PR029A”
编辑:感谢 simoco,我比迄今为止更接近。这是现在的代码。
Public Function sheetString()
Dim c As Integer
Dim r As Integer
Dim sConcat As String
Dim ws As Worksheet
Set ws = Sheet94
For c = 2 To 6 Step 2
For r = 1 To 46
If ws.Cells(r, c) = True Then
sConcat = sConcat & ws.Cells(r, c - 1) & ","
End If
Next r
Next c
sConcat = Left(sConcat, Len(sConcat) - 1)
Debug.Print sConcat
sheetString = sConcat
End Function
Sub test()
'if cells with sheet names contains quotes
'Sheets(Split(Replace(sheetString, """", ""), ",")).Select
'if cells with sheet names doesn't contain quotes
Sheets(Split(sheetString, ",")).Select
ActiveSheet.PrintOut Copies:=1
End Sub
它在运行时没有被炸毁,但现在它只选择第一个选中它的工作表。
【问题讨论】:
-
您的单元格
Sheet94.Cells(r, c - 1)是否包含工作表名称带引号:"SheetName"? -
是的,但如果需要,我可以更改。
-
您可能已经注意到,我对 VB 很陌生,对语法还不是很熟悉。
标签: vba excel excel-2010