Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Цикл работает только для i=1

58K
01 апреля 2010 года
Luch
2 / / 01.04.2010
Добрый день!
Прошу помочь разобраться, почему некорректно работает макрос.
Задача - открыть по очереди все файлы (Excel) в заданной директории и обработать информацию. В текущем файле есть перечень имен файлов.

For i = 1 To K 'всего надо обработать К файлов

Opros = Cells(i + 4, 4).Value 'ссылка на таблицу имен файлов (опросники)

Workbooks.Open Filename:= _
Fold & Opros
'открываем очередной файл с опросником

что-то там делаем, копируем, вставляем и т.д.
закрываем файл без сохранения

Windows(Opros).Close SaveChanges = False

Next i

Цикл работает только для i=1. Для i=2 VB видит значение следующей ячейки с именем Cells(i + 4, 4).Value, но не присваивает его переменной Opros, говорит, что значение Empty.
Если задать цикл i=2 to K, то такая же ситуация, только VB видит значение только второго файла (второй ячейки Cells(6, 4)), а для третьего нет.

В чем ошибка? Благодарю заранее за ответ.
275
01 апреля 2010 года
pashulka
985 / / 19.09.2004
В опубликованном Вами коде формально нет ничего некорректного, но ведь не сразя я постоянно говорю о том, что указывать родителей это хорошо и правильно, и Ваш случай тому наглядное подтверждение, ведь Cells(i + 4, 4).Value означает ActiveSheet.Cells(i + 4, 4).Value, стало быть, имена файлов в Вашем макросе, будут получены так (псевдо_ссылки)

Активный_лист.Ячейка(D5)
Первый_открытый_файл.Активный_лист.Ячейка(D6)
Второй_открытый_файл.Активный_лист.Ячейка(D7)
и т.д.

P.S. Перебрать весь список можно ещё и так (обратите внимание на то, что в нижеопубликованном примере использутся кодовое, иначе называемое, программное имя рабочего листа, которое может и не совпадать с именем листе в семействе)

Код:
iFolder$ = ThisWorkbook.Path & "\" 'для примера

Dim iCell As Range
For Each iCell In Лист1.Range(Лист1.[D5], Лист1.[D65536].End(xlUp))
    iFileName$ = iFolder$ & CStr(iCell)
    If Dir(iFileName$) <> "" Then
       With Workbooks.Open(FileName:=iFileName$, UpdateLinks:=0)
            'что-то там делаем, копируем, вставляем и т.д.
            .Close saveChanges = False
       End With
    End If
Next
58K
03 апреля 2010 года
Luch
2 / / 01.04.2010
Большое спасибо.
Действительно, активация листа помогла:)
275
03 апреля 2010 года
pashulka
985 / / 19.09.2004
На самом деле о необходимости активации(в прямом смысле этого слова) ничего сказано не было :) более того, выделение и активация об'ектов, в большинстве случаев, вещь ненужная, и данный случай не исключение.

А если первоначальный пример не подошёл из-за того, что там перебирается весь список, а Вам нужно обрабатывать лишь указанное количество рабочих книг, то :

Код:
iCount& = 4
iFolder$ = ThisWorkbook.Path & "\" 'для примера

Dim iCell As Range
For Each iCell In ThisWorkbook.ActiveSheet.[D5].Resize(iCount&)
    iFileName$ = iFolder$ & CStr(iCell)
    If Dir(iFileName$) <> "" Then
       With Workbooks.Open(FileName:=iFileName$, UpdateLinks:=0)
            'что-то там делаем, копируем, вставляем и т.д.
            .Close saveChanges = False
       End With
    End If
Next


ThisWorkbook / ActiveWorkbook
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог