вложенные циклы по именам листов Excel с использованием VBA

#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»)