我正在尝试创建一个函数,该函数在两个不同的工作簿中搜索字符串 (bom) 并返回该字符串旁边的值。我知道那些工作簿中要执行搜索的范围,然后使用偏移量获取值。但是该函数返回 #VALUE 错误。
我以前创建过搜索函数,但仅限于同一工作簿内,这是第一个使用不同工作簿的搜索函数。也许您可以帮助我找出我的逻辑错误:
Option Explicit
Function findhscode(bom As String)
Dim base1 As Workbook
Dim base2 As Workbook
base1 = Workbooks.Open("path1")
base2 = Workbooks.Open("path2")
If Not base1.Sheets("Sheet1").Range("myRange").Find(bom) Is Nothing Then
findhscode= base1.Sheets("Sheet1").Range("myRange").Find(bom).Offset(0, -7).value
Else
If Not base2.Sheets("Sheet1").Range("myRange").Find(bom) Is Nothing Then
findhscode = base2.Sheets("Sheet1").Range("myRange").Find(bom).Offset(0, 1).value
Else
findhscode= "Please contact Imports for assistance"
End If
End If
End Function
答案1
我试了一下你的代码。为了让它工作,你需要——正如 week 所建议的——设置 base1 和 base2 变量。否则你会得到:
未设置对象变量或 With 块变量错误。
如果您在函数中指定了返回类型,这也会有所帮助(尽管这不会引起问题)。由于没有显式返回类型,因此默认为 Object。我能想到的唯一另一件事是您是否有 base1 和 base2 的文字路径,或者您是否使用了变量。如果是变量,则删除引号。
以下代码对我有用(带有几个 MessageBox 添加以提供一些调试信息):
Function findhscode(bom As String)
Dim base1 As Workbook
Dim base2 As Workbook
Set base1 = Workbooks.Open("c:\temp\book1.xlsx")
Set base2 = Workbooks.Open("c:\temp\book2.xlsx")
If Not base1.Sheets("Sheet1").Range("MyRange").Find(bom) Is Nothing Then
MsgBox "found in base1"
findhscode = base1.Sheets("Sheet1").Range("MyRange").Find(bom).Offset(0, 1).Value
Else
If Not base2.Sheets("Sheet1").Range("MyRange").Find(bom) Is Nothing Then
MsgBox "found in base2"
findhscode = base2.Sheets("Sheet1").Range("MyRange").Find(bom).Offset(0, 1).Value
Else
MsgBox "not found"
findhscode = "Please contact Imports for assistance"
End If
End If
我从一个简单的输入框子调用了这个:
Sub stringPrompt()
Dim hs As String
hs = InputBox("String to search for", vbOKOnly, "Search String")
Range("A1") = findhscode(hs)
End Sub
注意:#Value 错误消息通常表示数据类型错误。您是否检查过您没有尝试使用文本数据进行数学计算?
另外(只是因为您提到所需值是“该字符串旁边”)。您的第一个偏移量调用是该字符串左侧的七列。