#vba #excel
#vba #excel
Вопрос:
Я написал код, который просматривает папку и копирует все файлы, заканчивающиеся на DAT, в листы.
После этого я хочу проверить, соответствует ли дата, происходящая в Worksheets("Input").Range("X2")
совпадает с именем листа, затем я проверю наличие идентификаторов, встречающихся в Worksheets("Input").Range("c2")
и совпадающих с тем же идентификатором в имени одного из листов с правильной датой. Чтобы начать с этой части, я начал с
' for the exact match
Dim mRange As Range
Set mRange = ThisWorkbook.Worksheets("Input").Range("X2")
Set mRange = Range(dicRange, dicRange.End(xlDown))
Dim WS_Count As Integer
Dim I As Integer
' Set WS_Count equal to the number of worksheets in the active
' workbook.
WS_Count = ActiveWorkbook.Worksheets.Count
' Begin the loop.
For Each direc In mRange
For I = 1 To WS_Count
If direc amp; "K1LTIOS1.DAT" = ActiveWorkbook.Worksheets(I).Nam Then
' Insert your code here.
' The following line shows how to reference a sheet within
' the loop by displaying the worksheet name in a dialog box.
MsgBox ActiveWorkbook.Worksheets(I).Name
(what I want to do actually : copy the whole line from the sheet
ddMMYYK1LOS1.DAT where the ID from Worksheets("Input").Range("c2")` occurs )
End If
Next I
Next
Но я получаю сообщение об ошибке в If direc amp; "K1LTIOS1.DAT" = ActiveWorkbook.Worksheets(I).Nam Then
: ошибка времени выполнения ‘438’!
1) в чем причина этой ошибки?
2) вероятно, этот вид вложенных циклов не так эффективен !? Есть ли лучшая возможность?
Комментарии:
1. Где ваш конец, если ??
2. вы пропускаете
End if
это утверждениеIf direc amp; "K1LTIOS1.DAT" = ActiveWorkbook.Worksheets(I).Nam Then
3. о, вы правы, извините! но как насчет альтернативного метода? Знаете ли вы другой метод вложенных вложенных циклов
4. Вы должны использовать Smart Indenter , это сэкономит вам много времени на переформатирование, и вы столкнетесь с подобными проблемами, потому что отступы будут отключены.
5. @Mat’Smug я слышал это раньше, но для меня это работает. Скриншот моей системы , должно быть, я что-то упускаю. Я как-то запускаю Excel 2016 и VBA7 в 32-битном режиме на 64-битном процессоре с Windows 10?
Ответ №1:
В вашем коде нет никаких указаний на то, что direc
это такое. Где вы DIM
это делаете и как это затемняется? Но это ваша настоящая проблема:
ActiveWorkbook.Worksheets(I).Nam
Что такое .Nam
свойство / метод?
Комментарии:
1. вы совершенно правы. Нет никаких указаний true, даже если я проверяю через? в консоли.
2. На самом деле, я вроде как идиот. Поскольку вы используете его в
For Each
цикле, он должен быть variant . И поскольку вы выполняетеDim
mRange, это будет ячейка. Однако я бы рекомендовал явно затемнить его как вариант. ДобавлениеOption Explicit
в начало всех ваших модулей кода поможет обеспечить это и в конечном итоге приведет к улучшению кода.3. хорошо, я не знал, что можно затемнить ячейку (в данном случае direc). Однако все еще один вопрос: как я могу реализовать эту часть: скопируйте всю строку с листа ddMMYYK1LOS1.DAT, где идентификатор из рабочих листов («Ввод»). Диапазон («c2»)` встречается в рабочих листах («Ввод»). Диапазон («Y2»)