#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