Ошибка времени выполнения 438: Объект не поддерживает это свойство или метод (VBA)

#vba #excel

#vba #excel

Вопрос:

Это сводит меня с ума. Я новичок в VBA и я компилировал код построчно, добавляя все больше и больше, проверяя, что все это работает в одной книге, используя F8. Последнее, что я должен добавить, это просто открыть отдельную книгу, и теперь она каждый раз выдает мне ошибки. Вот мой код:

 Sub MasterXfer()
Dim mystring As String, wbName As String, dt As String, sdt As String, ldt As String
Dim wb1 As Workbook, wb2 As Workbook, mypath As String

wbNam = "Productivity "
dt = Sheet1.Range("B1").Value
sdt = Format(CStr(dt), "m.d.yy") amp; ".xlsx"
ldt = Format(CStr(dt), "yyyy") amp; "" amp; Format(CStr(dt), "mm") amp; "_" amp; MonthName(Month(dt)) amp; "_" amp; Year(dt)

mypath = "S:" amp; ldt amp; "" amp; wbNam amp; sdt

Set wb1 = ThisWorkbook
Set wb2 = Workbooks.Open(mypath) 'HERE'S WHERE IT ERRORS OUT

With wb1
lastrow = Worksheets(1).Range("A" amp; Rows.Count).End(xlUp).Row
For x = 2 To lastrow Step 16
mystring = .Range("A" amp; x)
  

Пройдя через это, он работает нормально. Затем я перехожу к Set wb2 = Workbooks.Open строке, и она успешно открывает целевую книгу, однако сразу после ее открытия код останавливается и появляется ошибка, о которой идет речь.

Если кто-нибудь вообще может сказать мне, какую ошибку я совершаю, я назову своего первенца в честь вас.

Комментарии:

1. Кроме того, для записи, это не весь код, просто немного дальше того места, где возникает ошибка.

2. Что debug.print mypath отображается в этот момент (посмотрите в немедленном окне с помощью [ctrl] G)? Зачем использовать «вспомогательную» функцию, подобную MonthName , когда вы можете просто использовать Format(date, "mmm") или Format(date, "mmmm") ? Кажется, я помню проблемы с именами книг, содержащими точки; можете ли вы запустить тест без них?

3. lastrow = Worksheets(1).Range("A" amp; Rows.Count).End(xlUp).Row здесь Worksheets(1) не привязан к wb1, поскольку вы пропускаете начальный период. Если только вы не имели в виду именно это.

4. Привет, Джипед! Должен ли я вводить debug.print mypath В немедленном окне или он должен быть где-то в коде? Краткий ответ на вопрос «почему» заключается просто в том, что я довольно новичок в этом и изучаю лучшие практики по ходу работы. Наконец, это для моей компании, и все целевые книги отформатированы с периодами для каждой недели года, иначе я бы назвал их как-нибудь по-другому. @Тим Уильямс приведет ли это к рассматриваемой ошибке? Я вижу дыру в своей логике и собираюсь ее изменить, просто интересно, может ли это быть проблемой.

5. Под Set wb2 = ... строкой введите Debug.print mypath . Скопируйте строку из непосредственного окна и вставьте ее в адресную строку окна проводника Windows. Это позволит проверить, является ли путь, который вы создаете, к файлу, который существует. ЕСЛИ не удается открыть, скопируйте два пути (ваш и фактический) в блокнот, чтобы увидеть, чего может не хватать.

Ответ №1:

Ваша ошибка, если она вызвана этой строкой mystring = .Range("A" amp; x) . Workbook не имеет Range метода. Вам нужно изменить его на wb1.Worksheets(1) .

Вы также должны проверить, существует ли файл перед его открытием.

Я включил альтернативный метод создания строки вашего файла с использованием обратной косой черты для экранирования символов в параметре Format функций Format .

 Sub MasterXfer()
    Dim wb2 As Workbook
    Dim mypath As String

    mypath = Format(Sheet1.Range("B1").Value, "S:\YYYY\MM_MMMM_YYYY\Productivity MM.DD.YY.xlsx")

    If Len(Dir(mypath)) = 0 Then
        MsgBox "File not found" amp; vbCrLf amp; mypath
        Stop
        Exit Sub
    End If

    Set wb2 = Workbooks.Open(mypath)

    With ThisWorkbook.Worksheets(1)

        LastRow = .Range("A" amp; .Rows.Count).End(xlUp).Row
        For x = 2 To LastRow Step 16
            mystring = .Range("A" amp; x)
        Next

    End With

End Sub