【问题标题】:VBA Call functionVBA调用函数
【发布时间】:2016-06-14 17:13:05
【问题描述】:

此代码运行,但我需要一种方法来定义变量 xnc 一次,例如模块范围的变量。提供的示例是“调用”许多过程的更大宏的精简版本。

目前我必须将变量放入每个Sub 中,以便它按需要运行。我尝试使用PublicPrivateDim 等预先声明它们,但nc 变量不会在每个Sub 运行后重置为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

【问题讨论】:

  • I need a way to define variables x, n and c only once, as say module-wide variablesbut the n and c variables don't reset to 0 after each Sub is run 是互斥的。如果您想要全局变量,它们将在调用之间保留其内容。如果您希望在每次调用后清除局部变量,则必须每次都将它们声明为本地变量。不知道为什么你甚至试图拥有全局变量 - 只是为了在将它们键入每个子时保存击键,即使以在其他不相关的过程之间引入不必要的依赖关系为代价?
  • 在不相关的笔记上,您可能喜欢阅读stackoverflow.com/q/10714251/11683
  • GSerg 谢谢。是的,我正在尝试减小宏的大小以方便 QA。我的模块有时有大约 50 个 Sub,所以希望避免重复这些变量很多次。听起来我做不到。

标签: excel macros vba


【解决方案1】:

也许您正试图模仿 Static 在其模块中的 'x' 'n' 和 'c' 行为?这可以节省您的时间,而不是将它们声明为 Public
静态变量保留其值(与 Dim 变量相反),即使 sub 结束(但是,如果您调试然后停止,它们会重置),您也可以组合 Public Static。
编辑:
Integer 已“弃用”,您可以谷歌 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

没有办法简化“调用”,但是,我能读到什么,问题是你在这里有“镜像潜艇”,你可能想看看this.
如果工作表是可变的,为什么不呢?

Sub Stic(WhatSheet as String)
Dim x as String: x = "Minimum"
Sheets(WhatSheet).Select
...
'then 
Sub Main()
Call Stic("Ts")
Call Stic("BR")
....

您将只有一个 sub(而不是每张表 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 所说,在您了解这一点后,您可能希望专注于避免选择,这对于宏来说非常耗时。

【讨论】:

  • Sgdva 谢谢。也许我误解了,但我想做的是在定义任何 Sub 或 Function 之前定义变量 n & c 例如一次。然后,当给定的 Sub 使用它们时,它们会被重置。因此,它们在每个使用它们的 Sub 的开头都是 0。这将节省我在每个 Sub 中定义它们的时间。我只需要在宏的开头定义一次,直接在 Dim 模块 As Object 下。
  • 我不明白你为什么需要这样做,这将花费更多的时间和记忆,但是如果我不得不这样做,我会为此目的做一些类似于我的编辑
猜你喜欢
  • 2016-04-21
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多