Excel 如何在VBA中传递值?
我的练习册里有七张纸。表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”:被零除 所有声明的变量都有与其关联的值。也许有更好的办法Excel 如何在VBA中传递值?,excel,vba,Excel,Vba,我的练习册里有七张纸。表4至表7包含四条生产线的产品信息值 下面的代码从第4页开始,在B列的每一行循环,直到找到名为chatterm或chattermfrm.cmbprdcdde.value的用户表单上的组合框的值。然后,它将选择包含该值和偏移量的单元格,以获得新的单元格值,并将该值分配给txtDz、txtCs和txtom的相应变量。位于ChatterMFRM上的公式需要这些变量。用户单击标记为Print或cmdPrint的命令按钮后,将计算公式。txtbxdz.value来自chattermf
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()中声明相同的变量时,会影响值的传递。非常感谢您的帮助和指导。