2014-01-30 29 views
1

我有幾個我想要合併的Excel文件。每個文件有17張,分別命名爲00,01,02,03等。 現在,我打開每個工作簿並嘗試將數據複製到一個文件中,該文件也有16個工作表,在工作表x上我想要從工作表x獲取來自所有其他工作簿的信息。複製另一個excel工作簿中的數據 - 而不是一張表複製所有這些數據

現在,我打開該文件,每個文件我有這樣的代碼:

For i = 0 To 16 

    Workbooks(nazwaPliku).Activate 
    zakladka = Right("0" & CStr(i), 2) 
    Sheets(zakladka).Activate 
    ileWierszy = Application.WorksheetFunction.Max(Sheets(zakladka).Range("B:B")) 
    wierszMin = Application.WorksheetFunction.Match("1", Sheets(zakladka).Range("B:B"), 0) 
    zakresDoKop = "A" & wierszMin + 1 & ":" & "I" & wierszMin + ileWierszy + 1 '1 wiecej dla bezpieczenstwa 
    Sheets(zakladka).Range(zakresDoKop).Resize(ileWierszy, 1).Value = rok & "_" & czesc 
    Sheets(zakladka).Range(zakresDoKop).Copy 
    ThisWorkbook.Sheets(zakladka).Activate 
    ThisWorkbook.Sheets(zakladka).Range("A" & wsk(i)).PasteSpecial 

    wsk(i) = wsk(i) + ileWierszy + 2 
Next i 

對於第一個文件,一切都很好(WSK = 2的所有表),但是當我打開下一個工作簿,奇怪的事情正在發生。例如,當i = 2時,代碼複製工作表02-16中的數據並粘貼到本工作簿中。更重要的是,我已經通過刪除工作簿中的工作表16進行了測試,並且當我在大於16時發生錯誤(因爲它缺少一張工作表)。我想也許我不太瞭解這裏的循環?

任何想法?我知道如何以不同的方式寫它,但因爲我花了最後4個小時試圖弄清楚事情的真相,所以我真的很想知道爲什麼會發生這種情況。

+0

是否所有數據都按升序排列,以便Max始終獲得最後一行? –

+0

是的,最大的行總是選擇正確 – kamila

回答

1

嘗試這樣:

未經測試

Dim wb As Workbook 
Dim ws As Worksheet 
Dim desWs As Worksheet 
Dim firstRow As Long 
Dim lastRow As Long 
Dim lastColumn As Long 
Dim pasteRow As Long 

'I'm assuming you're looping through your workbooks... so set each open workbook to _ 
'the wb variable once you've opened it/when you open it. 

'This will loop through each sheet in the workbook you just opened and paste the _ 
'values in the corresponding ThisWorkbook sheet. 
For Each ws In wb.Sheets 
    'Since the sheet names in ThisWorkbook are the same as in the other wb, we can _ 
    'use the current worksheet name for the destination sheet. (ws.Name) 
    set desWs = ThisWorkbook.Sheets(ws.Name) 
    firstRow = ws.Range("B:B").Find("*", searchdirection:=xlNext).Row + 1 
    lastRow = ws.Range("B:B").Find("*", searchdirection:=xlPrevious).Row 
    lastColumn = ws.Rows("1:1").Find("*", searchdirection:=xlNext).Column 
    pasteRow = desWs.Range("A:A").Find("*", searchdirection:=xlPrevious).Row + 1 
    desWs.Range(desWs.Cells(pasteRow, 1).Resize(lastRow-firstRow, lastColumn) = _ 
     ws.Range(ws.Cells(firstRow, 1), ws.Cells(lastRow, lastColumn)).Value 
Next ws 

記住,這種方法只複製值,而不是格式化。

+0

它的工作,謝謝:) 仍然 - 任何人都可以回答爲什麼'複製'不起作用? – kamila

+0

@ kamila,副本正在工作,這是你的'wsk(i)'有問題。你每增加一次,但每個wsk(i)都以初始化(可能爲0)開始並且是唯一的,所以每次都在同一區域重寫。只需將'wsk(i)'改爲'wsk',即一個標量變量,而不是一個數組。 –

+0

@LanceRobert我不知道我的理解,但我需要在每張表上我有不同數量的數據的數組原因。此外,我仍然在使用它,我已經改變了循環(對於'sheets',而不是'i')和拷貝部分,但是'wsk(i)'不是(我現在只是手動增加它在每個循環中): 'desWs.Range(「A」&wsk(i))。Resize(ws.Range(zakresDoKop).Rows.Count,ws.Range(zakresDoKop).Columns.Count).Value2 = _ ws.Range(zakresDoKop).Value2' and it's working – kamila

相關問題