2012-12-03 13 views
5

porządku, starałem się spojrzeć na podobne pytania, ale nie bardzo rozumiem, co się przedmiotem dyskusji, ponieważ jest to pierwszy raz, kiedy patrzę na edytorze VBA Excel.Łączące arkusze kalkulacyjne Excel w jeden arkusz

W prostych słowach, mam 2 arkusze: "Arkusz1" i "Arkusz2"

Arkusz 1:

A   B 
1 Header1 Header2 
2 Text1  Info1 
3 Text2  Info2 

Arkusz 2:

A   B 
1 Header1 Header2 
2 Text3  Info3 
3 Text4  Info4 

I chciałbym mieć makro scalić dwa arkusze do nowego arkusza (Arkusz3) tak:

A   B 
1 Header1 Header2 
2 Text1  Info1 
3 Text2  Info2 
4 Text3  Info3 
5 Text4  Info4 

Próbowałem nagrać makro i zapisać go do późniejszego wykorzystania. Aby to zrobić, utworzyłem nowy arkusz, skopiuj/wklej wszystko z arkusza1 do arkusza3, a następnie skopiuj wszystkie informacje z wyjątkiem nagłówków z arkusza2 do arkusza3.

Cóż, makro umożliwia dostęp na tych danych, ale okazało się, że kod wygenerowany przez program Excel czyni go tak wybiera komórki A4 (tutaj) przed wklejeniem danych. Chociaż działa to dla tych danych, nie działałoby, gdyby liczba rekordów w każdym arkuszu zmieniała się od czasu do czasu. Zasadniczo

1) Zastanawiałem się, czy istnieje funkcja, która idzie do ostatniej odpowiedniej komórce automatycznie przed wklejeniem kolejny zestaw danych (w tym przykładzie, komórka A4, a jeśli mam jeszcze jedną tabelę, a następnie komórki A6).

2) Widziałem funkcję "ActiveCell.SpecialCells (xlLastCell). Wybierz" (aktywowany, gdy używam Ctrl + End), ale to prowadzi mnie do końca arkusza. Potrzebuję czegoś podobnego do klawiszy strzałek "Dom" i "Dół" po użyciu tej funkcji, aby działała najlepiej.

Albo jedna z tych opcji będzie dobrze ze mną.^_^

Oto mój aktualny kod VBA nagrany z rejestratora makr w programie Excel 2010:

Sub Collate_Sheets() 

    Sheets.Add After:=Sheets(Sheets.Count) 
    Sheets(Sheets.Count).Select 
    Sheets(Sheets.Count).Name = "Sheet3" 
    Sheets("Sheet1").Select 
    Range("A1").Select 
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select 
    Selection.Copy 
    Sheets("Sheet3").Select 
    ActiveSheet.Paste 
    ActiveCell.SpecialCells(xlLastCell).Select 
    ' I need to select one cell below, and the cell in column A at this point 
    Sheets("Sheet2").Select 
    Range("A2").Select 
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("Sheet3").Select 
    ActiveSheet.Paste 
End Sub 

Mam nadzieję, że nie zapomniał o każdą użyteczną informację. Daj mi znać, jeśli tak zrobiłem!

+0

Och dzięki Doug! Nie wiedziałem, że na forum wybrano odpowiednie podświetlanie składni ^^; – Jerry

+0

Aby uzyskać rząd poniżej ostatniej prawdziwie używanej komórki, możesz napisać 'Range (" A "i Rows.Count) .End (xlup) .Offset (1)'. Zastąp '" A "' dowolną kolumną, której potrzebujesz. –

+0

Nie ma za co, Jerry. Aby uzyskać wyróżnienie, po prostu zaznacz swój kod, a następnie kliknij ikonę kodu u góry. Wygląda jak '{}'. –

Odpowiedz

6

Jerry, spróbuj tego kodu. Oczyściłem trochę twój kod i uczyniłem go bardziej wydajnym, aby móc robić to, co chcesz. Podjąłem pewne założenia na podstawie tego, co napisałem w kodzie, co moim zdaniem jest właściwe. Jeśli nie, skomentuj tę odpowiedź, a następnie dostosuję ją w razie potrzeby.

Option Explicit 

Sub Collate_Sheets() 


    Sheets.Add After:=Sheets(Sheets.Count) 
    Dim wks As Worksheet 
    Set wks = Sheets(Sheets.Count) 

    wks.Name = "Sheet3" 

    With Sheets("Sheet1") 

    Dim lastrow As Long 
    lastrow = .Range("B" & .Rows.Count).End(xlUp).Row 

    .Range("A1:B" & lastrow).Copy wks.Range("A" & wks.Rows.Count).End(xlUp) 

    End With 

    With Sheets("Sheet2") 

    lastrow = .Range("B" & .Rows.Count).End(xlUp).Row 

    .Range("A2:B" & lastrow).Copy wks.Range("A" & wks.Rows.Count).End(xlUp).Offset(1) 

    End With 


End Sub 
+0

porządku, próbowałem go z danymi próbki mam powyżej (te same rekordy) i to daje mi to: „komórka A2 = Header1” „Komórka A3 = Header1” „Komórka A4 = Text3” i wszystkie inne puste Trochę za późno, a ja pójdę do łóżka. Spróbuję zobaczyć, co może być nie tak w kodzie jutro, jeśli jeszcze tego nie zrobiłeś. Dzięki za pomoc do tej pory =) – Jerry

+0

@Jerry -> Zmodyfikowałem kod i sprawiłem, że działa on dla zbioru danych. Jeśli chcesz wydmuchać to na swój prawdziwy zestaw danych, sztuczki mają tylko podnieść nagłówek pierwszej kopii/wkleić i upewnić się, że używasz kolumny, która nie zawiera spacji w zestawie danych, aby uchwycić ostatni wiersz . –

+0

Dzięki! Działa teraz idealnie i dostosowałem kod do wielu arkuszy (numer, który potrzebowałem) i do liczby odpowiednich kolumn. Dzięki jeszcze raz!^_ ^ – Jerry

0

W przypadku gdy ktoś chce usunąć Shee3 zanim stworzył to, aby uniknąć błędów

'Delete Sheet 3 
    Application.DisplayAlerts = False 
    Sheets("Sheet3").Delete 

Dzięki Scott Holtzman !!

Powiązane problemy