如何在VBA中传递值?

时间:2018-08-24 23:34:14

标签: excel vba

在我的工作簿中,我有七张纸。第4至7页包含我们4条生产线的产品信息值。

下面的代码从第4页开始,并遍历B列的每一行,直到找到位于名为Chattem或Chattemfrm.cmbPrdCde.Value的用户窗体上的组合框的值。然后,它将选择包含该值和偏移量的那个单元格以获得新的单元格值,并将该值分配给txtDz,txtCs和txtUOM的相应变量。位于Chattemfrm上的公式需要这些变量。用户单击标有“打印”或“ cmdPrint”的命令按钮后,即会计算公式。 txtbxdz.value来自Chattemfrm用户表单。

公式的摘录。

  

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

如何将我子内部的那些整数的值传递给位于Chattemfrm的上述公式?

我考虑过将这些变量声明为Public,但是我得到了

  

运行时错误'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

1 个答案:

答案 0 :(得分:1)

假设您有一个本地整数变量“ MyValue”,标准模块中的子例程希望将其发送给用户表单。

根据代码的位置,您可能可以使用参数。如果要在用户表单上的标准过程/功能中使用它。

在用户表单中

sub UserFormProcedureName(byref ProcValue as integer)

来自保存MyValue的模块

call Chattemfrm.UserFormProcedureName(MyValue)

但是如果您的代码处于控制过程中,例如

Private sub Combobox1_KeyUp( KeyCode

那么您将无法使用参数,或者必须移动代码或使用其他方法。

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

从带有MyValue的模块中

Chattemfrm.ComboBox1.Tag = MyValue

在用户窗体中

if me.ComboBox1.Tag = OneMillionDollHairs Then
    do something
End If

另一种方法是使用类属性。用户表单本质上与类模块相同,但是功能更多。

首先,我们需要确定如何使用变量以及是否需要允许其他过程使用它。假设您要使其可用于其他过程。因此,我们立即知道您将使用Get and Let。

MyValue是属性的可怕名称,因为该变量属于模块,因此我们将在过程e变量属于过程变量“ ProcValue” ...的情况下为该属性命名。

现在我们还需要1个名称,然后在“ ProcValue”中添加前缀“ i”,然后保留该名称。每当您想在用户表单中使用MyValue时,都可以使用iProcValue或me.ProcValue

例外。

现在在用于用户窗体的代码声明中,将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

那应该带你走。