Excel 如何在VBA中传递值?

Excel 如何在VBA中传递值?,excel,vba,Excel,Vba,我的练习册里有七张纸。表4至表7包含四条生产线的产品信息值 下面的代码从第4页开始,在B列的每一行循环,直到找到名为chatterm或chattermfrm.cmbprdcdde.value的用户表单上的组合框的值。然后,它将选择包含该值和偏移量的单元格,以获得新的单元格值,并将该值分配给txtDz、txtCs和txtom的相应变量。位于ChatterMFRM上的公式需要这些变量。用户单击标记为Print或cmdPrint的命令按钮后,将计算公式。txtbxdz.value来自chattermf

我的练习册里有七张纸。表4至表7包含四条生产线的产品信息值

下面的代码从第4页开始,在B列的每一行循环,直到找到名为chatterm或chattermfrm.cmbprdcdde.value的用户表单上的组合框的值。然后,它将选择包含该值和偏移量的单元格,以获得新的单元格值,并将该值分配给txtDz、txtCs和txtom的相应变量。位于ChatterMFRM上的公式需要这些变量。用户单击标记为Print或cmdPrint的命令按钮后,将计算公式。txtbxdz.value来自chattermfrm用户表单

公式的摘录

textValUp=((txtbxdz.Value)/txtDz/txtCs)+0.5-1E-16

如何将sub中那些整数的值传递给位于ChatterMFRM上的上述公式

我曾想过将这些变量声明为公共变量,但现在我发现

运行时错误“11”:被零除

所有声明的变量都有与其关联的值。也许有更好的办法

Option Explicit
Public txtDz As Integer, txtCs As Integer
Public txtUOM As String
Sub Test()

Dim ws_count As Integer, i As Integer, FinalRow As Integer, x As Integer

ws_count = ActiveWorkbook.Worksheets.Count
For i = 4 To ws_count
    Worksheets(i).Activate
    FinalRow = Cells(Rows.Count, 2).End(xlUp).Row
    For x = 1 To FinalRow
        If Cells(x, 2) & " " & "(" & Cells(x, 3) & ")" = Chattemfrm.cmbPrdCde.Value Then
            Cells(x, 2).Select
            txtDz = Cells(x, 2).Offset(0, 2).Value
            txtCs = Cells(x, 2).Offset(0, 3).Value
            txtUOM = Cells(x, 2).Offset(0, 4).Value
        End If
    Next x
Next i
End Sub

假设您有一个局部整数变量“MyValue”,标准模块中的子例程希望将该变量发送到userform

根据代码的位置,您可能可以带上一个参数。如果您想在userform上的标准过程/函数中使用它

在userform中

sub UserFormProcedureName(byref ProcValue as integer)
从保存MyValue的模块

call Chattemfrm.UserFormProcedureName(MyValue)
但是如果你的代码在一个控制过程中,比如

Private sub Combobox1_KeyUp( KeyCode
然后,您不能使用参数,您必须移动代码或使用其他方法

您可以使用
标记
这可能是除使用工作表或全局标记外最简单的方法。大多数对象都有标记。Combobox、ListBox、UserForm等。我倾向于不使用标记,所以我不记得这三个标记是否都有,但您可以使用通常位于项目浏览器下方的属性窗口找到它们

从具有MyValue的模块

Chattemfrm.ComboBox1.Tag = MyValue
在UserForm中

if me.ComboBox1.Tag = OneMillionDollHairs Then
    do something
End If
另一种方法是使用类属性。userform本质上与类模块相同,但具有更多功能

首先,我们需要决定如何使用该变量,以及是否需要允许其他过程使用它。让我们假设您想让其他过程可以访问它。所以我们马上就知道您将使用Get和Let

MyValue是一个可怕的属性名称,因为变量属于一个模块,所以我们将在过程e变量属于“ProcValue”之后命名该属性。。。对于过程变量

现在我们还需要一个名字才能开始,我将把前缀“I”添加到“ProcValue”中,并保持不变。只要您想在userform中使用MyValue,就可以使用iProcValue或me.ProcValue(只有少数例外)

现在,在userform的代码声明中,将iProcValue声明为私有模块整数

然后创建let ProcValue属性以分配变量,并创建get ProcValue属性以允许其他过程查看变量

它看起来像这样

Option Explicit

Private iProcValue as integer

property let ProcValue(incomingValue as integer)
iProcValue = incomingValue
end property

property get ProcValue() as integer
ProcValue = iProcValue
end property
现在,在具有MyValue的子例程中,您可以使用

Chattemfrm.ProcValue = MyValue
如果另一个模块想要使用该值,他们可以分配一个变量

SomwOtherInteger = Chattemfrm.ProcValue
或直接使用该物业

If Chattemfrm.ProcValue > SomeLargeMumber Then
    'do somethung
End if

这应该会让您继续。

如果您尝试了public,但仍然得到了零除错误,那么问题不在范围之内,而是发生了其他事情。在使用调试/即时窗口探测变量时,使用f8单步执行代码。本地人和监视窗口也很有用。为了解决您的问题,表单可以像类一样具有属性。您可以在表单上设置属性let/get/set。也可以使用标记。根据代码的位置,可以将变量作为参数传递(不在预定义的事件过程中)。。。在某些情况下,您可能需要将控件外的代码移动到passI。我对VBA还是有点陌生,但您能否提供一个您认为可能有效的示例。谢谢。为什么不能使用偏移单元格值?@jman观察得很好。这将一直有效,直到变量改变值-这似乎不会发生。。。我发现了代码错误发生的地方,但我仍然不知道为什么?好的。。。我发现了代码错误发生的地方,但我仍然不知道为什么?由于某些原因,如果单元格(x,2)和“&”(“&Cells(x,3)和“)”=chattermfrm.cmbprdcdde.Value然后是”单元格(x,2),则它不会偏移。“code”。选择txtDz=Cells(x,2)。偏移(0,2)。值txtCs=Cells(x,2)。偏移(0,3)。值txtom=Cells(x,2)。偏移(0,4).Value单元格(x,2)。选择Next x Next i End子“code”添加“Value”时发生了什么?如果单元格(x,2).value&“&”(&Cells(x,3).value&“)”=chattermfrm。。。。。。可能要选择该行,请按f9,然后运行宏。当它停止时,使用即时窗口测试该语句,并确保其计算结果符合您的预期OK。。。这在Sub中起作用。它仍然没有将值传递给公式。在cmdbtnPrint_Click()中声明相同的变量会影响值的传递。谢谢。是的!!!显然,当在cmdbtnPrint_Click()中声明相同的变量时,会影响值的传递。非常感谢您的帮助和指导。