цикл файлов Excel - PullRequest
       18

цикл файлов Excel

0 голосов
/ 09 января 2012

В своем листе Excel я использую формулы, относящиеся к внешним листам. Вместо того, чтобы вручную изменять значение в ячейке E7 (где я вставляю имя внешнего листа), я хочу написать макрос, чтобы открыть все внешние листы, изменить ссылочное значение в E7 и скопировать сгенерированные значения.

К сожалению, мой код не работает - Excel не может "видеть" значения на внешнем листе. Что я должен изменить?


Sub lista_plik()
    Dim oExcel As Excel.Application
    Dim oWB As Workbook
    Set oExcel = New Excel.Application
    folder = "path_here"
    folder2 = folder & "*.xlsx"

    arkusz = Dir(folder2)

    Do While arkusz <> ""
        x = x + 1
        Range("E7").Value = Replace(arkusz, ".xlsx", "")
        arkusz = folder & arkusz

        Set oWB = oExcel.Workbooks.Open(arkusz)
''''''''''''''''''''
HERE CODE TO COPY VALUES
'''''''''''''''''''''''
        oWB.Close
        arkusz = Dir
    Loop
End Sub

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Я согласен с brettdj, трудно понять, чего вы пытаетесь достичь.

Крис исправил две ваши ошибки, но без объяснения второго исправления, которое, как я подозреваю, является причиной проблемы.

В вашем коде вы используете Range("E7").Value. Это относится к ячейке E7 в активном листе активной рабочей книги. Крис изменил это на oWS.Range("E7").Value, что является улучшением, но oWS не было инициализировано, поэтому его недостаточно.

Мой опыт работы с несколькими рабочими книгами заключается в том, что вы должны сохранять полный контроль. Я подозреваю, что ваша ошибка в том, что Excel смотрит не на тот E7. Шаги ниже устранят это и любые подобные ошибки.

Шаг 1

Убедитесь, что в начале была открыта только одна рабочая книга, отметив WorkBooks.Count = 1. Если вы разрешите открыть две или более рабочих книг, вам потребуется код, чтобы проверить, что активная рабочая книга - та, которую вы хотите. Так что-то вроде:

If WorkBooks.Count > 1 Then
  Call MsgBox("Please close other workbooks then try again.", vbYesOnly)
  Exit Sub
End If

Шаг 2

Прежде чем открывать любую другую рабочую книгу, запишите, какая из них является основной рабочей книгой.

Dim WBkMaster As WorkBook

WBkMaster = ActiveWorkBook

Шаг 3

Всегда обращайтесь к рабочим тетрадям и таблицам в явном виде. Например:

With WBkMaster
  With Sheets("x1")
    .Range("E7").Value = ...
    ' Extract data from Sheet x1 to variables here
  End With
  With Sheets("x2")
    ' Extract data from Sheet x2 to variables here
  End With
End With

Set WBkDestination = Application.Workbooks.Open(arkusz)

With WBkDestination
  With Sheets("x3")
    ' Save data for Sheet x3 from variables here
  End With
  With Sheets("x4")
    ' Save data for Sheet x4 from variables here
  End With
  . Close
End With
oWB = Nothing   ' Ensure no reference to closed workbook

Существуют другие подходы к копированию данных между рабочими листами и рабочими книгами, но вы не предоставляете достаточно информации, чтобы рекомендовать, какой подход будет наиболее подходящим. Ключевой вопрос заключается в том, что вы должны четко указать, к какому листу и какой книге вы хотите обратиться.

0 голосов
/ 09 января 2012

Если вы запускаете это в VBA, вам не нужно объявлять экземпляр Excwl.Измените на:

Sub lista_plik()
    Dim oWB As Workbook
    Dim oWs As Worksheet
    Set oWs = ActiveSheet

    folder = "path_here\"
    folder2 = folder & "*.xlsx"

    arkusz = Dir(folder2)

    Do While arkusz <> ""
        x = x + 1
        oWs.Range("E7").Value = Replace(arkusz, ".xlsx", "")
        arkusz = folder & arkusz

        Set oWB = Application.Workbooks.Open(arkusz)
''''''''''''''''''''
'HERE CODE TO COPY VALUES
'''''''''''''''''''''''
        oWB.Close
        arkusz = Dir
    Loop
End Sub

Примечание. Я не совсем уверен, к какой ячейке рабочей книги E7 вы обращаетесь, здесь я предполагаю, что она находится в активной рабочей книге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...