通过组合框查找并返回第二列值有效
Private Sub ComboBox1_Change()
Dim x As Variant
x = Me.ComboBox1.Value
myLookupValue = x
Set myTableArray = Worksheets("material pricing").Range("matprice")
myVLookupResult = Application.WorksheetFunction.VLookup(x, myTableArray.Value, 2, False)
MsgBox "Product " & x & " is " & Format(myVLookupResult, "#,##0")
End Sub
更改返回值= textbox14给出错误
Private Sub CommandButton4_Click()
Worksheets("material pricing").Range(myVLookupResult).Value = TextBox14.Value
End Sub
答案 0 :(得分:1)
myVLookupResult
对于UserForm_Initialize()
过程而言是本地的:它在此处定义,存在于此,并且没有其他地方。一旦执行离开了过程的范围,局部变量将不复存在:它消失了,并且其值不可访问。
Option Explicit
未被指定也没有帮助。
Private Sub ComboBox1_Change()
Dim x As Variant
x = Me.ComboBox1.Value
myLookupValue = x
Set myTableArray = Worksheets("material pricing").Range("matprice")
myVLookupResult = Application.WorksheetFunction.VLookup(x, myTableArray.Value, 2, False)
这里myVLookupResult
与您在UserForm_Initialize
中使用的变量不同:它是另一个ComboBox1_Change
过程本地的局部变量,只是没有声明-唯一的方法是合法,是因为未指定Option Explicit
是允许的。
因此,将在该过程中即时创建名为myVLookupResult
的局部变量,并在遇到End Sub
时死亡。
因此,当CommandButton4_Click
处理程序运行时:
Private Sub CommandButton4_Click()
Worksheets("material pricing").Range(myVLookupResult).Value = TextBox14.Value
End Sub
myVLookupResult
是另一个新的局部变量,这次是CommandButton4_Click
过程的局部变量-除外,它没有值,所以它是Variant/Empty
,并且不是有效的{{ 1}}地址,因此您得到的错误是运行时错误1004:Range
不合法。
将Worksheet.Range(Empty)
放在模块(以及您编写的每个模块!)的顶部。这将阻止VBA成功编译未声明其变量的代码(这可以防止意外的输入错误!)。
然后,将Option Explicit
的声明移至模块级,如下所示:
myVLookupResult
现在,此操作解决了Option Explicit
Private myVLookupResult As Long
问题……但并没有使Variant/Empty
的调用变得更加合法。
说变量包含Range
。
42
我不确定您要在此处分配哪个特定的单元格,但是Worksheets("material pricing").Range(42).Value = TextBox14.Value
必须是有效的单元格引用。假设您要写入单元格42
,则可以将F42
与42
连接起来,如下所示:
"F"
那应该可行。