2012-01-09 2 views
0

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

К сожалению, мой код не работает - 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 
+0

Непонятно (по крайней мере для меня), что вы ищете, и чего вам здесь не хватает. «E7» будет обновляться - и перезаписываться - с каждым новым именем рабочего стола (not sheet), которое вы открываете. Какие значения вы хотите скопировать?И на тот же лист, новый лист и т. Д.? Пожалуйста, напишите больше информации – brettdj

+0

Почему бы не открыть другой wb в том же сеансе Excel? Кроме того, вы должны квалифицировать все свои Range() с соответствующей книгой, в противном случае возникнет путаница ... –

ответ

0

Если вы работаете это в 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 

Примечание: Я не уверен, entierly который Workbooks клетки E7 вы имеете в виду, здесь я взять на себя в активной книге.

2

Я согласен с 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

+1 действительно понятный и красиво объясненный. Я не уверен, что в этом случае необходим шаг 1, хотя – JMax

+0

@JMax. Возможно, вы более осторожны, чем я. Я проверил свои рабочие места и забыл закрыть их, прежде чем запускать макрос, который вызвал урон, потому что работала неправильная книга. Я часто храню макросы, которые не хочу, чтобы мои пользователи видели в отдельной книге, поэтому это обычный риск, которого я хочу избежать. –