簡體   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