繁体   English   中英

VBA通话功能

[英]VBA Call function

这段代码可以运行,但是我需要一种只定义一次变量xnc ,例如模块范围的变量。 提供的示例是一个较大的宏的压缩版本,该宏“调用”许多过程。

目前,我必须将变量放入每个Sub中,以使其按要求运行。 我尝试使用PublicPrivateDim等预先声明它们,但是在运行每个Sub之后, nc变量不会重置为0 因此,变量计数从上一个继续进行到以下过程,并且我需要在每个子程序运行后重置计数器。 Subs之外的x = "Minimum" (即带有声明的变量)也不起作用,但对于提高效率很有用。

也:

  • 如何简化使用CallMain宏。 有时我有50个订阅。
  • 可以合并这种特殊类型的Sub (这里的2个相同,因为我将数据发送到同一工作表“ Rs”,但只是从2个不同的工作表“ Ts”和“ BR”发送到同一excel文件中)
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”的静态行为? 这样可以节省您的时间,而不是将它们声明为“公开”
静态变量保留其值(与Dim的相反),即使sub结束(但是,如果您调试然后停止,它们也会重置),您也可以结合使用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

没有任何方法可以简化“呼叫”,但是,对于我可以读到的东西,事实是您在这里有“ mirror subs”,您可能想看看一下
如果工作表是可变的,为什么不呢?

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所述,您可能希望在了解这一点后就避免选择,这对于宏来说是非常耗时的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM