Я пытаюсь открыть рабочую книгу, чтобы я мог прочитать данные из нее и заполнить поля в другой рабочей таблице.Когда я запускаю код, он не обнаруживает книгу и не открывает ее.Книга находится на общем диске и должна быть открыта только для чтения.
Когда я пытался установить "wb", переменная книги, set wb = Workbooks("filepath")
, при отладке показывает wb = Empty.
Я немного изменил код, чтобы использовать вместо него оператор With, но все еще имею ту же проблему.Код переходит от With Workbooks.Open
к строке ниже, затем назад и вперед навсегда, не позволяя мне закрыть книгу.
В конечном итоге мне придется принудительно закрыть и снова открыть файл.Я могу взломать код, но он сразу же снова запускает функцию, не давая мне возможности сохранить или закрыть книгу.Приведенный ниже код, пожалуйста, помогите мне понять, что происходит.
[РЕДАКТИРОВАТЬ]: Когда я сначала вручную открываю книгу деталей, затем замените строку Workbooks.Open
на этот код: Set wb = Workbooks("New Parts Book - Official.xlsx")
и введите функцию вячейка, у меня нет проблем, и она работает просто отлично (также требует декларации Dim wb as Workbook
).Формула ячейки выглядит следующим образом: =Lookup_By_PN([@[Part Number]],"name")
где аргумент номера детали поступает из именованного столбца таблицы в той же строке, что и ячейка функции.
Function Lookup_By_PN(ByVal PN As String, Optional ByVal returnField As String = "Price") As Variant
Dim vCell As Variant, result As Variant
result = ""
With Workbooks.Open(Filename:="Z:\Shared\Materials\Parts Book\New Parts Book - Official.xlsx", UpdateLinks:=0, ReadOnly:=1)
For Each vCell In .Sheets("PARTS BOOK").Range("$F$260:$F$3872")
With vCell
If InStr(1, .Value2, PN, vbTextCompare) > 0 Then
Select Case True
Case InStr(1, returnField, "Price", vbTextCompare) > 0
If IsNumeric(.Offset(, 3).Value2) Then
result = .Offset(, 3).Value2
Else
result = .Offset(, 2).Value2
End If
Case InStr(1, returnField, "Name", vbTextCompare) > 0
result = .Value2
Case InStr(1, returnField, "Size", vbTextCompare) > 0
Dim quotePosR As Integer, spacePosL As Integer
quotePosR = InStr(1, .Value2, """", vbTextCompare)
spacePosL = InStrRev(.Value2, " ", quotePosR, vbBinaryCompare)
result = Evaluate(Replace(Mid(.Value2, spacePosL + 1, quotePosR - spacePosL - 1), "-", "+", compare:=vbTextCompare))
Case InStr(1, returnField, "Type", vbTextCompare) > 0
result = .Offset(, -2).Value2
Case Else
result = "Not Found"
End Select
End If
End With
Next vCell
End With
Lookup_By_PN = result
End Function