VBA调用功能

问题描述 投票:0回答:1

此代码可以运行,但我需要一种方法来定义变量

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
excel vba
1个回答
0
投票

也许您正在尝试模仿模块中“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 所说,在理解这一点后,您可能需要集中精力避免选择,这对于宏来说非常耗时。

© www.soinside.com 2019 - 2024. All rights reserved.