我有以下代码:
Dim conRow As Long
Dim targetBook As Workbooks
Dim targetSheet As Worksheet
Dim targetRng As Range
targetBook = Workbooks("C:\file\path\here\filename.xlsx")
targetSheet = Worksheets("SheetName")
targetRng = Range("$A:$A")
conRow = Application.Match("APersonsName", Workbooks(targetBook).Sheets(targetSheet).targetRng, 0)
此代码在分配targetBook的行中无效使用属性。基本上我试图在给定工作簿中的给定工作表中查找给定范围内的人名;稍后用于查找与该行关联的各种属性。
也许我使用了错误的功能?我的印象是我使用的函数可以将索引和字符串作为参数。
答案 0 :(得分:1)
我需要打开工作簿吗?我无法在不打开工作簿的情况下参考工作簿?
<强> tldr:强>
否即可。您无法在VBA中引用未打开的工作簿;甚至没有使用适用于工作表的公式的Application.Evaluate
。您需要将公式写入工作表,收集返回的值,然后清除公式。
更多......
您不能Set
var到已关闭的工作簿对象。您需要在打开它时将var设置为打开的工作簿或Workbooks.Open
命令。由于您无法将var设置为未打开的工作簿,因此您无法使用该工作簿对象引用来设置工作表或工作表范围/单元格对象。
Dim strPath As String, strSheet As String, strLookup As String, var As Variant
Dim targetBook As Workbook '<~~ note Workbook object, not Workbooks collection
Dim targetSheet As Worksheet, targetRng As Range
strPath = "C:\file\path\here\filename.xlsx"
strSheet = "SheetName"
strLookup = "aPersonsName"
Set targetBook = Workbooks.Open(Filename:=strPath, readonly:=true)
Set targetSheet = targetBook.Worksheets(strSheet)
Set targetRng = targetSheet.Range("A:A")
var = Application.Match(strLookup, targetRng, 0)
If Not IsError(var) Then
Debug.Print var
End If
targetBook.Close savechanges:=False
您在设置时已经限定了targetRng
的父工作表和工作簿。您无需在比赛中重复参赛资格。