VBA - Workbooks.Open застрял в цикле, должен быть принудительно закрыт - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь открыть рабочую книгу, чтобы я мог прочитать данные из нее и заполнить поля в другой рабочей таблице.Когда я запускаю код, он не обнаруживает книгу и не открывает ее.Книга находится на общем диске и должна быть открыта только для чтения.

Когда я пытался установить "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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...