VBA 公共变量

Posted

技术标签:

【中文标题】VBA 公共变量【英文标题】:VBA public variables 【发布时间】:2015-10-27 02:46:37 【问题描述】:

我在将 public i 作为我的代码的整数部分时遇到问题。 我正在使用 i 来保留当前行的值,因此我可以使用这个范围 我的程序。在我的 for 循环中,它递增 i,因此它将逐步遍历列并搜索 v 但是,当我尝试在另一组代码中使用“i”时,“i”不再具有值。 我不确定全局/公共变量在 VBA 中的工作方式或导致此错误的原因。

问题发生在 int Sub "yes" 和 sub "no" 在代码处

Cells(i,lcol).value=" ok " 

Cells(i,lcol).value = " updated "

第一组代码如下,得到我对“i”的值

Public V As Integer
Public i As Integer

Private Sub Enter_Click()
Dim EmptyRow As Long

'Audit will only search Master Sheet
Worksheets("Master").Activate

'Find empty row value so we can use that for limit of search
With Sheets("Master")
     EmptyRow = .Range("A" & Rows.Count).End(xlUp).Row + 1
End With

'i needs to be set to minimum limit
'Begin loop of search
For i = 12 To EmptyRow + 1

    If Cells(i, 1).Value = V Then  'AssetNum.Value Then

        'Go to compare userform to display

        Compare.AssetDisplay.Value = AssetNum.Value
        Compare.LocationDisply.Value = Cells(i - 1, 2).Value
        Compare.Show

     End If
  Next i

    'If i gets to emptyrow num then go to non found asset userform
    Unload Me
    NonFoundAsset.Show

 End Sub

Private Sub UserForm_Initialize()

'Read in value from asset num to be comapre in loop
AssetNum.Value = V

End Sub

我尝试使用公共变量调用“i”的第二组代码没有任何值

Private Sub No_Click()

Dim ws As Worksheet
Dim lcol As Long

'Make Master Sheet Active
 Worksheets("Master").Activate

Set ws = ThisWorkbook.Sheets("Master")

'Finds next empty column

  With ws
        lcol = .Cells(11, .Columns.Count).End(xlToLeft).Column - 1
  End With

'If the displayed location is not the same as the actual location "No" will be
'selected and the Change User Form will be displayed
'The value under the current audit column will be displayed as updated
 Cells(i, lcol).Value = " Updated "
 Unload Me
 AuditChange.Show

End Sub

Private Sub Yes_Click()

 Dim ws As Worksheet
 Dim lcol As Long

'Make Master Sheet Active
 Worksheets("Master").Activate

Set ws = ThisWorkbook.Sheets("Master")

'Finds next empty column

  With ws
        lcol = .Cells(11, .Columns.Count).End(xlToLeft).Column - 1
    End With

    'If the location displayed is correct "Yes" will be selected and
    'The value "ok" will be displayed in the current audit column

    Cells(i, lcol).Value = " Ok "
    Unload Me
    'Returns to Assetlookup to look for a new asset
    Assetlookup.Show
End Sub

感谢任何帮助,我是 VBA 新手,不明白为什么这不起作用。

【问题讨论】:

【参考方案1】:

这取决于你在哪里声明它。您必须参考该位置。因此,如果 i 在 UserForm1 中并且您尝试从另一个表单中使用它,请将其引用为。

Cells(UserForm1.i,lcol).value=" ok " 

如果你放

Option explicit

在您尝试从中调用它的表单顶部会告诉您 i 本身未定义在您的代码范围内。

编辑:对于来自 OP 的其他 cmets。询问我是否可以在点击事件中公开。

据我所知,事件中不能有公共/全局变量。

您必须使用本地变量

'Public variables are declared outside (above) all subs and functions
'This will be accessible by all subs functions and events in in the forms or sheets module or wherever it is
Public i As Integer

'This will be accessible by all subs functions and events in in the CURRENT sheet or form. It is private but to the current item
Private i As Integer

Private Sub CommandButton1_Click()
    Dim j As count

    'Do whatever it is to get that value.
    j = 5

    'You can access i to use it in you click event code
    msgbox i * j

    'Or you can set it in the event
    i = j

End Sub

【讨论】:

我尝试使用这行代码 'Cells(Assetlookup.i, lcol).Value = " Ok " ' 但变量 I 在用户窗体的按钮单击中。是否可以这样做? 我不这么认为。点击事件中不能有公共变量。您可以将 i 的值从事件中传递给某个公共函数。给我一点时间,我将编辑我的答案。 既然在button_click命令中,我还能用''Cells(Assetlookup.i, lcol).Value = " Ok " '来调用用户表单吗? 如果您询问是否可以访问/设置变量,可以。来自该变量范围内的任何事件、子程序或函数。如果您有一个表单并且您想从工作表中访问表单变量单击您将不得不再次通过 UserForm.i 引用它【参考方案2】:

我相信用户表单中的公共变量只有在用户表单正在运行(加载)时才可用。要拥有真正的全局变量,请在普通模块中声明它。

可能该变量不可用并且 VB 在其范围内找不到它。如果Tools, Options, Require variable declarations 设置为OFF,VB 将在当前范围内创建一个具有该名称的新变量。因此,它看起来好像已经“失去”了它的价值。

提示:不要调用诸如i, j, n 之类的全局变量。这些通常用作循环和计数器的局部变量。使用明确变量是全局的命名约定。我总是在这样的变量前面加上 g 来表示“全局”,例如:

Public giLoopCounter As Integer;

【讨论】:

以上是关于VBA 公共变量的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA 类属性返回公共长变量,但不是公共字符串变量

VBA:公共变量与属性

Excel VBA 公共变量无法识别

VBA 公共变量

VBA:为其他潜艇使用公共变量

VBA,语法,将单元格范围组合在一起以获取公共变量