我正在尝试利用Vlookup
功能,根据用户在Textbox1
中输入的Userform Guntest
值,自动寻找枪支的相应功能。
但是该程序目前无法运行,因为它提醒了我
“运行时错误'1004',方法'对象范围'_Global'失败。
错误出现在Retrieve1=…
如果您能帮助我检查问题出在哪里,我将不胜感激,因为我在使用VBA方面的知识和经验非常有限。
谢谢。
看起来有些对象是未定义的,但我不知道在哪里。
模块1的代码为:
Public Guncode As String
Option Explicit
Sub Test()
Call Vlookup
End Sub
Sub Vlookup()
Dim Retrieve1 As String
Dim Retrieve2 As String
Dim FinalRow As Long
Dim FinalColumn As Long
Dim WholeRange As String
If GunTest.TextBox1 = "" Then
Exit Sub
If GunTest.TextBox1 <> "" Then
MsgBox Guncode
End If
End If
With Sheets(1)
FinalRow = Range("A65536").End(xlUp).Row
FinalColumn = Range("IV1").End(xlToLeft).Column
WholeRange = "A2:" & CStr(FinalColumn) & CStr(FinalRow)
Retrieve1 = Application.WorksheetFunction.Vlookup(Trim(Guncode), Range(WholeRange), 1, False) 'Locate specific tool according to QR code number
Retrieve2 = Application.WorksheetFunction.Vlookup(Trim(Guncode), Range(WholeRange), 5, False) 'Locate specific gun type according to QR code number
If Guncode = "" Then
MsgBox "This gun doesn't exist in database!"
Else
MsgBox "The tool number is:" & Retrieve1 & vbCrLf & "The gun type is:" & Retrieve2
End If
End With
End Sub
用户表单代码为:
Option Explicit
Private Sub Label1_Click()
End Sub
Private Sub CommandButton1_Click()
If TextBox1 = "" Then Exit Sub 'Set condition 1 of exiting the program
Guncode = GunTest.TextBox1
With Me
Call Module1.Test
End With
End Sub
Private Sub PartID_Click()
End Sub
Private Sub TextBox1_Change()
End Sub
Private Sub UserForm_Click()
End Sub
它应该正常运行,但不能正常运行。任何帮助将不胜感激,谢谢!
答案 0 :(得分:1)
首先,您要传入数字作为列字母值。 CSTR()不会神奇地将其转换为等效字母,但我喜欢您的热情。
第二,如果找不到该值,您的方法将爆炸-因此,您需要为此编写自己的错误处理。
Sub Vlookup()
Dim Retrieve1 As String
Dim Retrieve2 As String
Dim FinalRow As Long
Dim FinalColumn As Long
Dim WholeRange As String
Dim vArr
Dim col_Letter As String
If GunTest.TextBox1 = "" Then
Exit Sub
If GunTest.TextBox1 <> "" Then
MsgBox Guncode
End If
End If
With ThisWorkbook.Sheets("Sheet1")
FinalRow = .Range("A65536").End(xlUp).Row
FinalColumn = .Range("IV1").End(xlToLeft).Column
vArr = Split(Cells(1, FinalColumn).Address(True, False), "$")
col_Letter = vArr(0)
WholeRange = "A2:" & col_Letter & CStr(FinalRow) '<---- you were passing a number in as the column value
Retrieve1 = Application.WorksheetFunction.Vlookup(Trim(Guncode), .Range(WholeRange), 1, False) 'Locate specific tool according to QR code number
Retrieve2 = Application.WorksheetFunction.Vlookup(Trim(Guncode), .Range(WholeRange), 5, False) 'Locate specific gun type according to QR code number
If Guncode = "" Then
MsgBox "This gun doesn't exist in database!"
Else
MsgBox "The tool number is:" & Retrieve1 & vbCrLf & "The gun type is:" & Retrieve2
End If
End With
End Sub
1。我不确定将Address(True,False)用于行号的原因。
这是这两个功能的组合。 true / false设置告诉功能在地址中使用/不使用绝对引用。
分割(表达式[,delimiter] [,limit] [,compare]) https://www.techonthenet.com/excel/formulas/split.php
expression.Address(RowAbsolute,ColumnAbsolute,ReferenceStyle,External,RelativeTo) https://docs.microsoft.com/en-us/office/vba/api/excel.range.address
单元格(1,FinalColumn)代表列号吗?
不,单元格fucntiosn基本返回行和列的交集/地址。
例如,尝试以下操作:debug.Print; thisworkbook.Sheets(“ Sheet1”)。Cells(2,2)
您提到CSTR不会神奇地转换为等效字母,那么它将转换为什么?您可以进一步详细说明吗?
这是数据类型转换功能。 CSTR(666)本质上是这样做的:这个666变成了这个“ 666”
2。 vArr(0)。我对括号内的参数0表示什么感到困惑。实际上,这是我对参数规范始终遇到的一个普遍问题。
这是一个数组位置参考。 split函数返回一个字符串数组。由于我们用于捕获列标签值,因此我们仅需要引用第一个位置。
(3)我尝试复制您的代码并运行它,但仍然在同一行提醒我错误。
除非没有返回值,否则对我来说工作正常,返回值就是我所说的“炸弹”的错误。