PDA

Vollständige Version anzeigen : variable Tabellenmarkierung mit VBA-Makro?


BeeGee
13.03.2009, 21:48
Hallo,

ich möchte einzelne Tabellen in unterschiedlichen Tabellenblättern in eine einzige große Tabelle zusammenführen, also die Zeilen der Einzeltabellen ohne den Spaltenkopf untereinandersetzen. Die Einzeltabellen haben immer eine unterschiedliche Zeilenanzahl, das Makro muss also jeweils die Einzeltabelle kopieren, egal wie lang sie ist.

Bei der Aufzeichnung mit dem Makrorekorder und den Tastenkombinationen Strg, Shift und Leertaste, Sternchen, Pfeil nach oben und rechts usw. erfasst Excel die Einzel-Tabellenlänge nur beim ersten Mal, ist die Tabelle beim zweiten Ausführen länger, kopiert das Makro nur die ursprüngliche Anzahl der Zeilen.

Wie lautet der Code, um eine beiliebig große Tabelle durch ein Makro markieren zu lassen (ohne Spaltenköpfe?)

Vielen Dank im voraus
Gruß
BeeGee

jinx
13.03.2009, 22:04
Moin, BeeGee,

kannst Du aus dem folgenden Fragment "schlau" werden?

For Each wsOld In wbOld.Worksheets
If wsOld.UsedRange.Cells.Count > 1 Then
If blnCopyHeaders = False Then
wb.ActiveSheet.Range(Cells(1, cstrSTARTSPALTE).Address, Cells(1, cstrENDSPALTE).Address).Value = _
wsOld.Range(Cells(1, cstrSTARTSPALTE).Address, Cells(1, cstrENDSPALTE).Address).Value
blnCopyHeaders = True
End If
lngLastRow = wsOld.Cells(Rows.Count, cstrSTARTSPALTE).End(xlUp).Row
lngNewLine = wb.ActiveSheet.Cells(Rows.Count, cstrSTARTSPALTE).End(xlUp).Row + 1
wb.ActiveSheet.Range(Cells(lngNewLine, cstrSTARTSPALTE).Address, Cells(lngNewLine + lngLastRow - 2, cstrENDSPALTE).Address).Value = _
wsOld.Range(Cells(2, cstrSTARTSPALTE).Address, Cells(lngLastRow, cstrENDSPALTE).Address).Value
End If
Next wsOld

BeeGee
14.03.2009, 08:13
Hallo jinx,

vielen Dank für die schnelle Antwort. Eine einfachere Lösung wäre mir allerdings lieber.
Ich habe nun festgestellt, daß der Fehler in meinem Makro nicht im Kopieren der Einzeltabellen sondern im Einfügen in die Gesamt-Tabelle liegt, da hier nicht erkannt wird, wo die zuvor eingefügte Einzel-Tabelle endet.
Es würde mir also ein Code oder eine Tastenkombination genügen, die mir jeweils die Zelle direkt unter der zuvor eingefügten Einzeltabelle markiert.

Viele Grüße
BeeGee

jinx
14.03.2009, 08:45
Moin, BeeGee,

lngNewLine = wb.ActiveSheet.Cells(Rows.Count, cstrSTARTSPALTE).End(xlUp).Row + 1
Dim lngNewLine As Long 'Angabe der ersten freien Zeile
Const cstrSTARTSPALTE As String = "A" 'Vorgabe der Spalte als Konstante

lngNewLine = ActiveSheet.Cells(Rows.Count, cstrSTARTSPALTE).End(xlUp).Row + 1
MsgBox "Erste freie Zeile auf der aktiven Tabelle: " & lngNewLine

Backowe
14.03.2009, 09:12
Hi,

vielleicht ist es so etwas einfacher. Ein Tabellenbereich muß nicht markiert werden, damit man ihn kopieren kann.

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Sub</span> TabelleKopieren()
<span class="TOKEN">Dim</span> LZeile&amp;, LSpalte%
&nbsp;
<span class="TOKEN">With</span> ActiveSheet
LZeile = .Cells.Find(&quot;*&quot;, .[A1], , , xlByRows, xlPrevious).Row <span class="REM">'Letzte Zeile festlegen</span>
LSpalte = .Cells.Find(&quot;*&quot;, .[A1], , , xlByColumns, xlPrevious).Column <span class="REM">'Letzte Spalte festlegen</span>
<span class="REM"> 'Kopiere von A2 bis Tabellenende</span>
Range(&quot;A2:&quot; &amp; Cells(LZeile, LSpalte).Address).Copy _
Destination:=Sheets(&quot;Tabelle2&quot;).Cells(Sheets(&quot;Tabelle2&quot;).Cells(Rows.Count, &quot;A&quot;).End(xlUp).Row + 1, &quot;A&quot;) <span class="REM">'&lt;--letzte belegte Zelle in Spalte A + 1</span>
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

BeeGee
14.03.2009, 09:14
Hallo jinx,

nochmals danke. Bin mir nicht sicher, ob ich Deinen Code hier richtig einbauen kann, bin aber schon weitergekommen, würde mich freuen, wenn Du den fehlenden Schritt ergänzen könntest:

Sheets("Tabelle1").Select
Set tbl = Range("A2").CurrentRegion
tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, _
tbl.Columns.Count).Select
Selection.Copy
Sheets("Tabelle3").Select
Range("A2").Select
ActiveSheet.Paste

Sheets("Tabelle2").Select
Set tbl = Range("A2").CurrentRegion
tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, _
tbl.Columns.Count).Select
Selection.Copy
Sheets("Tabelle3").Select
Range("A2").Select
'Hier fehlt jetzt noch das Ansteuern der nächten freien Zelle unterhalb des zuvor eingefügten Bereichs, _
dann müsste es funktionieren!
ActiveSheet.Paste

BeeGee
14.03.2009, 10:22
Danke, nun funktioniert es!

Wie kann ich nun sicherheitshalber vor Start des Makros aus dem Zieltabellenblatt alle Zellen mit Ausnahme der 1. Zeile löschen? Der folgende Code löscht ja alle Zeilen aus einem Blatt, wie kann ich ihn entsprechend anpassen?

Sheets("Tabelle3").Rows.Delete

Gruß
BeeGee

jinx
14.03.2009, 11:17
Moin, BeeGee,

nach wie vor halte ich nichts von der verwendung der Zwischenablage für das Kopieren von Bereichen... ;)

With Sheets("Tabelle3")
.Rows("2:" & .Rows.Count).Delete
End With

BeeGee
14.03.2009, 11:49
Es ist sicher nicht der professionelle Weg, aber der Code ist leichter verständlich, und es funktioniert.

Vielen Dank & Gruß
BeeGee

jinx
14.03.2009, 11:54
Moin, BeeGee,

dann solltest Du am Ende Deines Makros die Zwischenablage leeren durch Hinzufügen der Anweisung Application.CutCopyMode = True (False hat den gleichen Effekt), damit die Nachfrage vom System nicht kommt, was denn mit den Daten geschehen soll.

BeeGee
14.03.2009, 17:38
Wird gemacht!

BeeGee
15.03.2009, 08:25
Hallo,

ein (hoffentlich) letztes Problem: Meine einzelnen Monatslisten enthalten teilweise AutoFilter. Beim Zusammenfassen der Monatslisten in eine Jahresliste werden leider nur die gefilterten Werte erfasst. Wie kann ich im Makro den AutoFilter ignorieren oder deaktivieren?

Gruß
BeeGee

jinx
15.03.2009, 08:33
Moin, BeeGee,

per ActiveSheet.FilterMode prüfen, ob eine gefilterte Liste auf der Tabelle vorliegt und dann ActiveSheet.ShowAllData zur Anzeige aller Daten oder ActiveSheet.AutoFilter zum Ausschalten des Autofilters verwenden.

BeeGee
15.03.2009, 09:31
Folgendes funktioniert, wenn wirklich Daten gefiltert worden sind:

If ActiveSheet.AutoFilterMode Then
ActiveSheet.ShowAllData
End If

Wie schalte ich den Filter mit ActiveSheet.AutoFilter denn aus?

Die Hilfe in Excel/VBA ist leider nicht wirklich hilfreich

BeeGee
15.03.2009, 09:50
Auch hiermit geht es nicht, wenn ein Autofilter besteht, aber nicht gefiltert wurde:

If ActiveSheet.AutoFilterMode = True Then
ActiveSheet.ShowAllData
Else
End If

BeeGee
15.03.2009, 09:59
Auch so geht es leider nicht:

If ActiveSheet.AutoFilterMode Then
isOn = ActiveSheet.ShowAllData
Else
End If

jinx
15.03.2009, 10:08
Moin, BeeGee,

lesen musst Du schon alleine - .FilterMode statt .AutoFilterMode:

With ActiveSheet
If .FilterMode Then
.ShowAllData
.UsedRange.AutoFilter
End If
End With