shaggy84
Goto Top

Werte von Excel Tabellenblättern einer Datei zusammenfügen

Hallo Experten,

ihr habt Fachwissen und ich nur Ahnung, deswegen muss ich mich hier mal zu Wort melden face-smile

Folgendes Problem:
Ich habe eine Excel Datei mit mehreren Tabellen. Diese Tabellen sind wiederrum verformelt, da Sie Werte aus anderen Dateien importieren und erstellen.

Ich möchte gerne am Anfang der Datei eine Tabelle "Import" via VBA füllen, die die nachfolgenden (variabel 3-5) Tabellen "Server *" zusammenfasst. Die Überschriften bis zur siebten Spalte sind immer die gleichen, ab dann kommen verschiedene Werte. Ich kann es nicht einfach kopieren oder verknüpfen, da diese Datei beim Start unterschiedlich viele Datensätze in die einzelnen Tabellen importiert. Es sollen also auch keine leeren Zeilen entstehen und nur die Werte übertragen werden, mit Formeln kann ich nichts anfangen. Am Ende der Datei stehen noch zwei andere Tabellen die außen vor sind.

Hört sich also ziemlich kompliziert an, ich habe auch schon ein Makro gefunden, nur leider funktioniert dieses nicht:

Sub Tabellen_zusammenfügen()
letztesBlatt = ActiveWorkbook.Sheets.Count
For i = 2 To ActiveWorkbook.Sheets.Count - 2
Sheets(i).Select
letzteZeile = Range("A65536").End(xlUp).Row  
If letzteZeile > 7 Then
Rows("8:" & letzteZeile).Select  
Selection.Copy
Sheets("Import").Select  
Range("A" & Range("A65536").End(xlUp).Row + 1).Select  
ActiveSheet.Paste
Application.CutCopyMode = False
End If
Next i
End Sub

Aus Formeln nur die Werter abzuleiten ging doch irgendwie mit ".PasteSpecial Paste:=xlValues" oder?

Facts: Excel 2003 / Win 2000

Bin für jede VBA Hilfe dankbar ;)

Content-Key: 53982

Url: https://administrator.de/contentid/53982

Printed on: April 18, 2024 at 05:04 o'clock

Member: bastla
bastla Mar 13, 2007 at 18:15:19 (UTC)
Goto Top
Hallo Shaggy84 und willkommen im Forum!

Da gerade keine Experten in der Nähe sind, versuche ich es mal ...

Eigentlich sieht der Code schon recht vernünftig aus. Aus der gewählten Vorgangsweise ergibt sich nur eine kleine Einschränkung: Es wird immer auf die Spalte A abgestellt, um den Umfang der zu kopierenden Daten bzw den Ort des Einfügens festzustellen. Sofern in allen Tabellenzeilen, die kopiert werden sollen, in Spalte A ein Inhalt steht, ergibt sich daraus aber kein Problem.

Konkret ändern müsstest Du, wie vermutet, nur die "Paste"-Zeile - versuch es einmal mit
Selection.PasteSpecial Paste:=xlPasteValues
Nur als Anmerkung: Die Zeile 2 erfüllt keinen nachvollziehbaren Zweck und könnte daher ersatzlos gestrichen werden.

HTH
bastla
Member: Iwan
Iwan Mar 14, 2007 at 07:10:26 (UTC)
Goto Top
wenn ich die Datei mal bekommen könnte, könnte ich Dir da sicherlich ein Makro zu basteln
Member: Shaggy84
Shaggy84 Mar 14, 2007 at 08:55:58 (UTC)
Goto Top
Danke "bastla"!

Das funktioniert schon soweit ganz gut, ich habe nur noch zwei Probleme face-sad

Erstens habe ich in den Ausgangstabellen auch noch Zeilen, in der in einer Spalte jeweils eine Null vorkommt. Das liegt an dem Import aus einer anderen Datei, wenn er dort keine Datensätze findet. Eine "WENN xy > 0" Funktion zum importieren kann ich nicht anwenden, da dann wieder andere Funktionen, die auf die Spalte zurückgreifen (WENN > 0 usw.) "rumspinnen". Kann man das noch dahin abändern, dass der auch keine Zeilen mit 0 Werten kopiert?

Zweitens bräuchte ich ein weiteres Makro, das in der "Import" Tabelle ab Zeile 8 wieder alle Zeilen löscht. Damit man bei einem erneuten aufrufen der Datei oder des Makros andere Datensätze zusammenfassen kann.

Evt. kann man ja auch mein erstes Problem mit einem Lösch Makro beheben, quasi lösche alle Zeilen, in denen in Spalte B eine "0" vorkommt. Das ist vielleicht einfacher.

Danke aber nochmals für die erste Lösung, hat schon sehr geholfen face-smile
Member: Shaggy84
Shaggy84 Mar 14, 2007 at 08:57:48 (UTC)
Goto Top
Würde ich gerne, kann ich aber leider nicht machen. Erstens sind die Dateien alle wiederrum zu anderen verknüpft und zweitens sind es vertrauliche Daten face-sad
Member: bastla
bastla Mar 14, 2007 at 10:03:50 (UTC)
Goto Top
Hallo Shaggy84!

Für das jeweilige Löschen müsste folgendes genügen:
Sub EntferneZeilen()
Worksheets("Import").Range("8:65535").Clear  
End Sub

Sub EntferneNullen()
Dim Zelle As Object
For Each Zelle In Worksheets("Import").Range("B8", Range("B65536").End(xlUp))  
    If Zelle.Value = 0 Then Zelle.Clear
Next
End Sub

Grüße
bastla
Member: Shaggy84
Shaggy84 Mar 14, 2007 at 10:38:38 (UTC)
Goto Top
Hallo bastla!

das erste funktioniert perfekt. Ich hab mir zwar auch schon eins gebastelt, aber deines ist noch kürzer. Prima ;)

Zum zweiten mit den Nullen löschen habe ich mich glaube ich falsch ausgedrückt. In deinem Makro löscht er nur die Nullen aus den Zellen, ich würde ganz gerne dann die gesamte Zeile löschen lassen, so dass zwischen den Importen keine leeren Zeilen sind. Wenn ich dein Clear durch ein Delete ersetze zieht er mir nur Spalte B rauf, und das sehr langsam face-smile
Member: bastla
bastla Mar 14, 2007 at 11:40:03 (UTC)
Goto Top
Hallo Shaggy84!

Wenn es weiterhin nur auf die Spalte "B" ankommt, würde das so aussehen:
Sub EntferneNullen()
Dim Zelle As Object
For Each Zelle In Worksheets("Import").Range("B8", Range("B65536").End(xlUp))  
    If Zelle.Value = 0 Then Rows(Zelle.Row).Delete
Next
End Sub

Grüße
bastla
Member: Shaggy84
Shaggy84 Mar 14, 2007 at 12:20:54 (UTC)
Goto Top
Hallo bastla!

dein Code funktioniert, aber aus irgendeinem Grund macht er den Durchlauf nur ca.75x, keine Ahnung warum.

Aus einem anderen Forum hat mir ® "losgehts" geantwortet und den Code direkt in den ersten mit hinein gepackt:

Sub Tabellen_zusammenfügen() 
Dim i As Integer 
Dim letzteZeile As Long 
Dim ZeileImport As Long 

With ActiveWorkbook 
   For i = 2 To .Sheets.Count - 2 
      letzteZeile = .Sheets(i).Range("A65536").End(xlUp).Row   
      If letzteZeile > 7 Then 
         ZeileImport = .Sheets("Import").Range("A65536").End(xlUp).Row + 1   
         .Sheets(i).Rows("8:" & letzteZeile).Copy   
         .Sheets("Import").Range("A" & ZeileImport).PasteSpecial _   
                                       Paste:=xlPasteValues 
      End If 
   Next i 
   .Sheets("Import").Cells(1, 1).Select   
  
  'Zeilen mit Inhalt in Spalte B gleich 0 löschen:   
   With Sheets("Import")   
      For i = .Cells(Rows.Count, 2).End(xlUp).Row To 1 Step -1 
         If .Cells(i, 2).Value = "0" Then Rows(i).Delete   
      Next 
   End With 
End With 
End Sub

Es kunktioniert auf jeden Fall beides und ich möchte mich bei dir für die Hilfe bedanken!!! Das hat mir wirklich sehr weitergeholfen.
Member: Shaggy84
Shaggy84 Mar 14, 2007 at 14:22:48 (UTC)
Goto Top
Ich bins nochmal kurz,

gibt es eine kleine Abänderung, mit der man den Löschbefehl für die Zellen mit dem Inhalt "0" erst ab Zeile 8 laufen lassen kann?

Und gibt es eine Optimierung, vielleicht das er erst alle Zellen mit 0 markiert und dann löscht, es funktioniert zwar, aber dauert auch 15Minuten bei einer größeren Datei und dem einzelnen nach und nach löschen.

Vielleicht bekomme ich das ja auch noch selber hin :D
Member: bastla
bastla Mar 14, 2007 at 14:47:22 (UTC)
Goto Top
Hallo Shaggy84!

Zumindest einmal das:
For i = .Cells(Rows.Count, 2).End(xlUp).Row To <b>8</b> Step -1 

Grüße
bastla
Member: bastla
bastla Mar 14, 2007 at 15:47:45 (UTC)
Goto Top
Hallo Shaggy84!

Zum "Löschen en bloc" fiele mir nur etwa folgende Vorgangsweise ein:

  • Allen Zeilen, die nicht gelöscht werden sollen, in einer freien Spalte eine laufende Nummer geben, für die zu löschenden Zeilen die Nummer 100000 eintragen.

  • Danach die ganze Tabelle nach dieser Spalte sortieren (wie lange das wieder dauern würde, kann ich auch nicht abschätzen - am Besten einmal vorweg testen, um den ev Zeitgewinn zu eruieren bzw die Strategie gleich zu verwerfen).

  • Jetzt die in einem Block am Ende stehenden Zeilen in einem einzigen Löschvorgang entfernen.

  • Abschließend die Nummerierungsspalte löschen.

Grüße
bastla
Member: Shaggy84
Shaggy84 Mar 15, 2007 at 13:51:10 (UTC)
Goto Top
Hi bastla,

jo klappt natürlich, einfach nur die eine Zahl ändern. Man merkt schon das ich ein totaler VBA Newbie bin face-smile

Gibt es noch eine andere Möglichkeit, dass wenn ich nicht nur die Zeilen mit einer "0" löschen, sondern auch die "" leeren Zeilen löschen will, außer dieser Schleife hier die ich unter die andere druntersetzte? Quasi ein "0" "oder" "" in der Löschabfrage.

'leere Zeilen in Spalte B löschen:   
   With Sheets("Import")   
      For i = .Cells(Rows.Count, 2).End(xlUp).Row To 8 Step -1 
         If .Cells(i, 2).Value = "" Then Rows(i).Delete   
      Next 
   End With 

Gruß, Shaggy

P.S. Das mit dem anderen Löschen lass ich erstmal face-smile
Member: bastla
bastla Mar 15, 2007 at 14:00:27 (UTC)
Goto Top
Hallo Shaggy84!

Kombiniert sähe das so aus:
If .Cells(i, 2).Value = "" Or .Cells(i, 2).Value = "0" Then Rows(i).Delete   

Grüße
bastla

P.S.: Nur interessehalber - hast Du das Sortieren versucht, und wenn ja, wie lange dauert es im Vergleich zum Löschen nach obiger Vorgangsweise?
Member: Biber
Biber Mar 15, 2007 at 14:03:55 (UTC)
Goto Top
Moin Shaggy,

für die Frage brauchen wir bastla's Mittagsruhe nicht stören...

If (.Cells(i, 2).Value = "" or If .Cells(i, 2).Value ="0") Then Rows(i).Delete

...wäre eine der Möglichkeiten.

Gruss
Biber

[Edit] das zweite "If " oben ist natürlich BullShit... bzw. ein Copy & Paste-Fehler. [/Edit]
Member: bastla
bastla Mar 15, 2007 at 14:12:08 (UTC)
Goto Top
@Biber

Du bist ja so fürsorglich ... face-wink

Übrigens: Wenn Du noch Zeit hast, könntest Du das versehentlich hineinkopierte zweite "If" entfernen ...

Grüße
bastla
Member: Shaggy84
Shaggy84 Mar 15, 2007 at 14:21:07 (UTC)
Goto Top
Danke bastla,

funktioniert wie immer perfekt!

Ich glaube so nen schnelle response hab ich sonst noch nie in einem Forum bekommen, vielen Dank!

Und Mittagspause gibts hier nur von 12:00-12:45Uhr face-smile

Das andere hab ich nicht ausprobiert, ich bin leider net so in der Tiefe was das Programieren angeht, mach eher was mit Hardware und dem Kaufmännischem.

Also, bis irgendwann mal wieder ;)