此代码可以运行,但我需要一种方法来定义变量
x
、n
和 c
一次,就像模块范围的变量一样。提供的示例是“调用”许多过程的更大宏的压缩版本。
目前我必须将变量放入每个
Sub
中才能使其按要求运行。我尝试使用 Public
、Private
、Dim
等预先声明它们,但在每个 n
运行后,c
和 0
变量不会重置为 Sub
。因此,变量计数从上一个过程继续到以下过程,我需要在每个子程序运行后重置计数器。 Sub 之外的 x = "Minimum"
(即带有声明的变量)也不起作用,但对于提高效率很有用。
还有:
Main
的 Call
宏。有时我有 50 个订阅者。Sub
(这里的2个是相同的,因为我将数据发送到同一个工作表“Rs”,但只是从同一个excel文件中的2个不同工作表“Ts”和“BR”) Dim module As Object
Sub Main()
Call Stic1
Call Stic2
End Sub
Sub Stic1()
Dim x As String
Dim n As Integer, c As Integer
x = "Minimum"
Sheets("Ts").Select
Range("A2").Offset(0, 0).Select
Do Until IsEmpty(ActiveCell)
If ActiveCell.Value = x Then
ActiveCell.Offset(0, 1).Copy
Application.Goto (ActiveWorkbook.Sheets("Rs").Range("G2").Offset(n, 0))
ActiveSheet.Paste
Application.CutCopyMode = False
n = n + 1
Application.Goto (ActiveWorkbook.Sheets("Ts").Range("A2").Offset(c, 0))
c = c + 1
Else
Application.Goto (ActiveWorkbook.Sheets("Ts").Range("A2").Offset(c, 0))
c = c + 1
End If
Application.Goto (ActiveWorkbook.Sheets("Ts").Range("A2").Offset(c, 0))
Loop
End Sub
Sub Stic2()
Dim x As String
Dim n As Integer, c As Integer
x = "Minimum"
Sheets("BR").Select
Range("A2").Offset(0, 0).Select
Do Until IsEmpty(ActiveCell)
If ActiveCell.Value = x Then
ActiveCell.Offset(0, 1).Copy
Application.Goto (ActiveWorkbook.Sheets("Rs").Range("I2").Offset(n, 0))
ActiveSheet.Paste
Application.CutCopyMode = False
n = n + 1
Application.Goto (ActiveWorkbook.Sheets("BR").Range("A2").Offset(c, 0))
c = c + 1
Else
Application.Goto (ActiveWorkbook.Sheets("BR").Range("A2").Offset(c, 0))
c = c + 1
End If
Application.Goto (ActiveWorkbook.Sheets("BR").Range("A2").Offset(c, 0))
Loop
End Sub
也许您正在尝试模仿模块中“x”、“n”和“c”的“静态”行为?这可以节省您的时间,而不是将它们声明为公共
即使 sub 结束,静态变量也会保留其值(与 Dim 相反)(但是,如果您调试然后停止,它们会重置),您也可以组合 Public Static。
编辑:
Integer 已被“弃用”,您可以通过 google Integer vs Long 来了解原因。
Dim module As Object
Public x As String
Public n As Long
Public c As Long
Sub Main()
Call Stic1
Call Stic2
End Sub
Sub Stic1()
Call ResetVariables
x = "Minimum"
Sheets("Ts").Select
Range("A2").Offset(0, 0).Select
....
Sub ResetVariables
x = vbNullString
n = 0
c = 0
End Sub
没有办法简化“调用”,但是,对于我能读到的内容,问题是你这里有“镜像潜艇”,你可能想看看这个。
如果工作表是可变的,为什么不呢?
Sub Stic(WhatSheet as String)
Dim x as String: x = "Minimum"
Sheets(WhatSheet).Select
...
'then
Sub Main()
Call Stic("Ts")
Call Stic("BR")
....
您只有一个子程序(而不是每张工作表 50 个),其中执行的变量位置是工作表(一切都相同,只是工作表是一个变量)。主要是,除了调用每个工作表之外没有其他方法(或者如果您定义了要执行哪些工作表以及不执行哪些工作表,则可以执行 For 循环)
Sub Main
Dim WSheetInBook As Worksheet
For Each WSheetInBook In ActiveWorkbook.Worksheets
Call stic(WSheetInBook)
Next WSheetInBook
End Sub
Sub stic(WhatSheet As Worksheet)
x = "Minimum"
WhatSheet.Select
Range("A2").Offset(0, 0).Select
...
PS:正如 GSerg 所说,在理解这一点后,您可能需要集中精力避免选择,这对于宏来说非常耗时。