Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Schleife zum füllen einer Tabelle

Forumthread: Schleife zum füllen einer Tabelle

Schleife zum füllen einer Tabelle
03.05.2016 17:57:07
Sam
Hallo,
habe eine sogenannte Lasttabelle die in zwei Spalten aufgeteilt ist, die bekomme ich so von unserem Energieanbieter. In der Spalte A steht das Datum mit Uhrzeit im Viertelstunden Rythmus und in der Spalte B der gemessene kw Wert zu dem Zeitpunkt.
Nun möchte ich aber die Werte in einer Kreutztabelle haben um die Werte mit Bedingter Formatierung in einer Gant Grafik darzustellen.
Wie ich das mit den Achsen mache weis ich aber ich hätte gerne eine Schleife oder den Ansatz dazu wie ich die Werte in den Spalten auslese und in der Tabelle eintrage.
Zum besseren Verständniss habe ich einen kleinen Ausschnitt der Lastgangtabelle angehängt.
https://www.herber.de/bbs/user/105385.xlsx
Ein Bericht (Tabellenblatt) ist ein Monat und hat ca. 3000 Zeilen.
Hoffe das ist verständlich :-)
p.s. bin VBA Anfänger und sehe die Aufgabe auch als Übung.
Grüße
Sam

Anzeige

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife zum füllen einer Tabelle
03.05.2016 23:58:44
Piet
Hallo Sam,
anbei ein kurzer Makro Code als Lösungsvorschlag für diese Aufgabe.
Ich gehe davon aus das die Spalten und Zeilen wie im Beispiel stimmen.
Sonst müssten die Range Angaben im Makro manuell geaendert werden.
Würde mich freuen wenn die Aufgabe damit gelöst ist.
mfg Piet
Option Explicit      'Kreuztabelle erstellen
Const UhrZeit = "E4:K4"    'Uhrzeit Überschriftzeile
Sub Kreuztabelle_erstellen()
Dim DA As Object, AC As Object
Dim Datum As Date, Zeile As Long
Dim Zeit As Date, SZeit As Single
With Worksheets("Tabelle1 (2)")
'alte Tabelle löschen, 1.Zeile = 4
.Range("C5:K10000").ClearContents
Zeile = 5 - 1   '1.Zeile  (5-1)
'Schleife für Zeitstempel Werte
For Each DA In Range("A5", [a5].End(xlDown))
'Datum prüfen, naechstes Datum setzen
If CDate(Mid(DA, 1, 10))  Datum Then
Zeile = Zeile + 1  'Zeile +1
Datum = CDate(Mid(DA, 1, 10))
Cells(Zeile, 4) = Datum
End If
Zeit = CDate(Mid(DA, 13, 8))
SZeit = CSng(Zeit) 'als Zahl
'Schleife für Uhrzeit Überschrift
For Each AC In Range(UhrZeit)
If AC.Value = SZeit Then
Cells(Zeile, AC.Column) = DA.Offset(0, 1)
Zeit = Empty:  Exit For
End If
Next AC
'Fehlermeldung:  aktuelle Zeit "Not Find"
If Zeit  Empty Then DA.Offset(0, 2) = "Not Find"
Next DA
End With
End Sub

Anzeige
AW: Schleife zum füllen einer Tabelle
04.05.2016 10:34:12
JoWe
Hallo Sam,
ein anderer Vorschlag.
Dazu habe ich den Bereich E5:CV5 gemäß Vorgabe in 15 Min-Schritten ausgefüllt (00:15 bis 00:00).
Hier mein Code (in Tabelle1 (Code)):
Option Explicit
Public sp As Long
Public ze1 As Long
Public ze2 As Long
Public zeile As Long
Public ze As Range
Sub put_step1()
ze1 = 5: ze2 = 5
Range("D5:CV3000").ClearContents
Cells(5, 4) = Cells(5, 1)
Do While Cells(ze1, 1)  ""
If CDate(Left(Cells(ze2, 4), 10))  CDate(Left(Cells(ze1, 1), 10)) Then
ze2 = ze2 + 1
End If
Cells(ze2, 4) = CDate(Left(Cells(ze1, 1), 10))
ze1 = ze1 + 1
Loop
put_step2
End Sub
Sub put_step2()
ze2 = 5: zeile = 5
For Each ze In Range("D5:D" & Cells(Rows.Count, 4).End(xlUp).Row)
For sp = 5 To 100
Cells(ze2, sp) = Cells(zeile, 2).Value
zeile = zeile + 1
Next
ze2 = ze2 + 1
Next
End Sub
Gruß
Jochen

Anzeige
AW: Schleife zum füllen einer Tabelle
04.05.2016 12:40:52
Daniel
Hi
geht im Prinzip einfach per Formel.
in E5 muss die Formel:

=SVERWEIS($D5+E$4;$A$4:$B$11;2;WAHR)

wenn die Liste vollständig ist, geht auch folgende Formel in E5:
=Index($B:$B;(Zeile()-5)*96+Spalte()+0)

die Formeln dann in alle Zellen der Tabelle schreiben.
Gruß Daniel

Anzeige
AW: Schleife zum füllen einer Tabelle
04.05.2016 13:19:10
JoWe
Hallo Daniel,
völlig richtig, Deine Formel arbeitet korrekt und führt zum eigentlichen Ziel.
Nur: Die Frage zielte auf eine VBA-Lösung, eine Formel war nicht nachgefragt.
Zitat 1: "ich hätte gerne eine Schleife oder den Ansatz dazu"
Zitat 2: "bin VBA Anfänger und sehe die Aufgabe auch als Übung"
Gruß
Jochen

Anzeige
AW: Schleife zum füllen einer Tabelle
04.05.2016 13:47:01
Daniel
Hi
man kann und darf auch die Formel per VBA in in die Zellen eintragen.
Gruß Daniel

AW: Schleife zum füllen einer Tabelle
04.05.2016 18:59:46
Sam
Hallo Daniel und Jochen,
über sverweis bin ich auch schon gestolpert aber ich mein auch mal gelesen zu haben das sverweis nicht so elegant wäre weil macht Excel langsam. Aber man kann es ja auch mal in einem Makro anwenden da hat Daniel natürlich recht.
Vielen Danke erstmal, melde mich morgen nochmal, jetzt kämpfe ich hier noch mit der Antwortfunktion ;-)
Grüße
Sam

Anzeige
AW: Schleife zum füllen einer Tabelle
04.05.2016 19:07:16
Sam
Hi Piet und JoWE,
auch an euch erst mal danke, werde morgen beide Makros testen und mich dann nochmal melden
@ Daniel
die Index Formel teste ich morgen auch. Danke
Grüße Sam

AW: Danke für die Rückmeldung oT
04.05.2016 22:18:28
JoWe

AW: Schleife zum füllen einer Tabelle
04.05.2016 19:31:52
Daniel
Hi
kommt darauf an.
wenn die Ausgangsliste nach Datum und Uhrzeit aufsteigend sortiert ist und du die SVerweisvariante mit 4. Parameter = Wahr verwendest, dann ist der SVerweis sehr schnell.
nur die Variante mit 4. Parameter = falsch ist bei grossen Datenmengen sehr langsam.
das liegt daran, dass aufgrund der Sortiertung eine sehr schnelle Suchmethode verwendet werden kann, während bei nicht sortierten Daten jeder Wert in der Liste einzeln überprüft werden muss.
bei Excel-gut solltet du den SVerweis eigentlich kennen...
(und bevor man anfängt, für Excel Makros zu schreiben, sollte man erstmal Excel an sich kennen und können, es wäre nicht das erste mal, das hier Markos vorgestellt werden, die zur Abarbeitung einer Aufgabe länger brauchen, als ein Excelandwender von Hand)
Gruß Daniel

Anzeige
AW: Schleife zum füllen einer Tabelle
04.05.2016 20:25:17
Sam
Hallo Daniel,
ehrlich gesagt arbeite ich sehr häufig mit sverweis aber ich habe keine einzige Tabelle in der 3000 Zeilen durchforstet werden muss. Da ich später vorhabe eine Gant Grafik damit zu realisieren , die vielleicht je nach kw größe(z.B über 200 kw) zwei oder mehr Monate anzeigen kann, soll, habe ich dann sogar 6 bis 9000 Zeilen zu durch suchen. Deswegen dachte ich das es vielleicht über ein Makro eleganter ist als über eine Formel. Die Formel kann ich am Ende immer noch einsetzten sozusagen aus dem Ärmel ziehen. Mit Index dagegen habe ich noch nicht so viel Erfahrung mal schauen wie die funktioniert. Die Daten sollen natürlich Chronologisch angeordnet sein, also aufsteigend.
Excel-Gut ist natürlich auch eine Definitionsfrage, bei meinen Kollegen gut hier im Forum vielleicht eher erfahrener Anfänger. :-)
Danke und Grüße
Sam

Anzeige
AW: Schleife zum füllen einer Tabelle
04.05.2016 23:01:24
Daniel
Hi
hier mal ein Beispiel, wie man die komplette Tabelle (inkl. Zeilen und Spaltenbeschriftungen)
vollständig aus der Liste generiert.
der Code nutzt nur die Excelfunktionen "Ausfüllen - Reihe" und die SVerweis-Funktion
Schau dir das mal an.
Wenn du das mit Schleifen und "richtigem" VBA programmieren willst, wird's aufwendiger und wenns genauso schnell gehen soll, musst du schon etwas tiefer in die Trickkiste greifen.
ggf wird's noch schneller, wenn man die Index-Funktion anstelle des Sverweises nimmt.
https://www.herber.de/bbs/user/105400.xlsm
Gruß Daniel

Anzeige
AW: Schleife zum füllen einer Tabelle
08.05.2016 09:47:01
Sam
Hallo Daniel,
wollte mich nochmal melden, tolle Idee, was ich nicht wusste ist daß ich bei sverweis auch eine Formel als Suchkriterium angeben kann.
Danke für die Anregung, habe es so auch umgesetzt und wegen der schnelligkeit absolut im dunkel grünen Bereich, da hast du recht.
Grüße
Sam

Anzeige
AW: Schleife zum füllen einer Tabelle
04.05.2016 22:26:36
Sam
Hallo Daniel,
ehrlich gesagt arbeite ich sehr häufig mit sverweis aber ich habe keine einzige Tabelle in der 3000 Zeilen durchforstet werden muss. Da ich später vorhabe eine Gant Grafik damit zu realisieren , die vielleicht je nach kw größe(z.B über 200 kw) zwei oder mehr Monate anzeigen kann, soll, habe ich dann sogar 6 bis 9000 Zeilen zu durch suchen. Deswegen dachte ich das es vielleicht über ein Makro eleganter ist als über eine Formel. Die Formel kann ich am Ende immer noch einsetzten sozusagen aus dem Ärmel ziehen. Mit Index dagegen habe ich noch nicht so viel Erfahrung mal schauen wie die funktioniert. Die Daten sollen natürlich Chronologisch angeordnet sein, also aufsteigend.
Excel-Gut ist natürlich auch eine Definitionsfrage, bei meinen Kollegen gut hier im Forum vielleicht eher erfahrener Anfänger. :-)
Danke und Grüße
Sam
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Werte in einer Kreuztabelle mithilfe von VBA füllen


Schritt-für-Schritt-Anleitung

Um die Werte in einer Kreuztabelle aus einer Lasttabelle mit VBA auszulesen und zu füllen, kannst du die folgenden Schritte befolgen. In diesem Beispiel gehen wir davon aus, dass du Excel 2016 oder höher verwendest.

  1. Öffne die Excel-Datei mit deiner Lasttabelle.
  2. Öffne den Visual Basic for Applications (VBA) Editor durch Drücken von ALT + F11.
  3. Füge ein neues Modul hinzu: Rechtsklick auf "VBAProject (deinDateiname)", dann "Einfügen" > "Modul".
  4. Kopiere und füge den folgenden VBA-Code ein:
Option Explicit
Const UhrZeit = "E4:K4"    'Uhrzeit Überschriftzeile

Sub Kreuztabelle_erstellen()
    Dim DA As Object, AC As Object
    Dim Datum As Date, Zeile As Long
    Dim Zeit As Date, SZeit As Single
    With Worksheets("Tabelle1 (2)")
        .Range("C5:K10000").ClearContents
        Zeile = 4   'Startzeile
        For Each DA In Range("A5", [A5].End(xlDown))
            If CDate(Mid(DA, 1, 10)) <> Datum Then
                Zeile = Zeile + 1
                Datum = CDate(Mid(DA, 1, 10))
                Cells(Zeile, 4) = Datum
            End If
            Zeit = CDate(Mid(DA, 13, 8))
            SZeit = CSng(Zeit)
            For Each AC In Range(UhrZeit)
                If AC.Value = SZeit Then
                    Cells(Zeile, AC.Column) = DA.Offset(0, 1)
                    Zeit = Empty: Exit For
                End If
            Next AC
            If Zeit <> Empty Then DA.Offset(0, 2) = "Not Find"
        Next DA
    End With
End Sub
  1. Schließe den VBA-Editor und kehre zu Excel zurück.
  2. Führe das Makro aus: Gehe zu "Entwicklertools" > "Makros", wähle Kreuztabelle_erstellen und klicke auf "Ausführen".

Häufige Fehler und Lösungen

  • Fehler: "Not Find" in der Tabelle

    • Lösung: Überprüfe, ob die Zeitstempel in der Lasttabelle korrekt formatiert sind und ob die Werte in der Zeitüberschrift korrekt eingegeben wurden.
  • Fehler: Laufzeitfehler 1004

    • Lösung: Dieser Fehler tritt auf, wenn der Bereich, den du zu löschen versuchst, nicht existiert. Stelle sicher, dass "Tabelle1 (2)" das korrekte Arbeitsblatt ist.

Alternative Methoden

Wenn du die Werte nicht über VBA füllen möchtest, kannst du auch Formeln verwenden. Eine mögliche Formel, um Werte in einer Kreuztabelle zu füllen, wäre:

=SVERWEIS($D5 + E$4; $A$4:$B$11; 2; WAHR)

Diese Formel sucht im angegebenen Bereich nach den entsprechenden Werten und kann auch in Verbindung mit bedingter Formatierung für Gantt-Diagramme verwendet werden.


Praktische Beispiele

Hier ist ein Beispielcode, der die Werte einer Lasttabelle in einer Kreuztabelle anzeigt:

Sub put_step1()
    Dim ze1 As Long, ze2 As Long
    ze1 = 5: ze2 = 5
    Range("D5:CV3000").ClearContents
    Cells(5, 4) = Cells(5, 1)
    Do While Cells(ze1, 1) <> ""
        If CDate(Left(Cells(ze2, 4), 10)) <> CDate(Left(Cells(ze1, 1), 10)) Then
            ze2 = ze2 + 1
        End If
        Cells(ze2, 4) = CDate(Left(Cells(ze1, 1), 10))
        ze1 = ze1 + 1
    Loop
End Sub

Dieses Skript hilft dir, die Zeitstempel in einer neuen Zeile zu organisieren.


Tipps für Profis

  • Verwende Arrays: Um die Leistung zu verbessern, kannst du die Daten in Arrays speichern und dann in einem Schritt in die Tabelle schreiben.
  • Optimierung der Berechnung: Deaktiviere die automatische Berechnung während der Ausführung des Makros, um die Geschwindigkeit zu erhöhen:
Application.Calculation = xlCalculationManual
'... dein Code ...
Application.Calculation = xlCalculationAutomatic
  • Debugging: Nutze Debug.Print, um Variablenwerte während der Ausführung des Codes zu überwachen.

FAQ: Häufige Fragen

1. Kann ich die Werte auch ohne VBA füllen? Ja, du kannst Formeln wie SVERWEIS oder INDEX verwenden, um die Werte in einer Kreuztabelle zu füllen.

2. Wie kann ich die Geschwindigkeit meiner Makros verbessern? Verwende Arrays, deaktiviere Bildschirmaktualisierungen und die automatische Berechnung während der Ausführung deiner Makros.

3. Was ist der Vorteil von VBA gegenüber Formeln? VBA bietet mehr Flexibilität und kann komplexe Aufgaben schneller und effizienter erledigen, insbesondere bei großen Datenmengen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige