Excel/VBA - Frage

  • Moin Forum,

    ich hab hier ein kleines Excel-Makro geschrieben, dass aber nicht ganz macht, was ich will.

    - 1 Tabelle, darin 2 Spalten (A und B)
    A = 1-400
    B = Werte
    - wenn in Spalte B ein Wert = 0 ist, soll er die ganze Zeile rauskicken, in der das auftritt.
    - dies soll für alle 400 Werte überprüft werden.

    Hab dieses Makro:


    Ich kriege aber diesen hier:
    [Blockierte Grafik: http://www.abload.de/img/unbenanntcrx.png]
    Mit Erklärungen dazu kann ich aber nichts anfangen.

    Komisch ist auch, dass nach dem Ausführen jedesmal eine andere Zeile markiert ist und diese periodisch abnehmen: 3232, 3131, 3030..

    Vielleicht hat ja jemand ne Idee :?:

    Gruss
    Mic

  • jo, das funktioniert. danke. Schon lustig, wenn 2 keine Ahnung von VB haben, es aber trotzdem hinkriegen ;)


    Ein Problem entsteht durch mein Makro dann aber noch:
    Da die Zeile gelöscht wird, in der man sich gerade aufhält, rücken alle Werte eine Zeile nach oben. Man ist also noch in Zeile i, in ihr befinden sich durch das Löschen aber schon die Werte der vorherigen Zeile i+1. Geht man jetzt zur Laufvariable i+1, wird die nächste Zeile genommen. In ihr befinden sich aber aktuell schon die Werte der vorherigen Zeile i+2. Somit wird also immer eine Zeile übersprungen.

    Das Problem habe ich gelöst, indem ich die Zeilen nicht mehr löschen lasse, sondern nur deren Inhalt (ClearContents). Es entstehen also leere Zeilen. Nach dem Durchlauf der Schleife lasse ich einfach alles aufsteigend nach Spalte A sortieren und alle leeren Zeilen sind weg.

    Wens interessiert:

  • Hi,
    ich habe dein Makro mal ein wenig aufgebort :wink:

    Probiere es mal aus an einer Kopie deiner Mappe :!:

    Es wird dann die Reihenfolge in A1 neu aufsteigend sortiert, je nachdem wieviele Zeilen rausfallen.

  • danke :)

    Aber ich fürchte, ich kapiere nicht, was Du

    Zitat von bejot

    Es wird dann die Reihenfolge in A1 neu aufsteigend sortiert, je nachdem wieviele Zeilen rausfallen.


    damit genau meinst. Irgendwie summiert er die leeren Zeilen auf oder so.

    Und wenn ichs bei mir anwende, sortiert er am Schluss zwar wieder richtig, alle Werte in Spalte A werden aber gleich Null gesetzt.

  • Zitat von Miccovin

    Moin Forum,

    ich hab hier ein kleines Excel-Makro geschrieben, dass aber nicht ganz macht, was ich will.

    - 1 Tabelle, darin 2 Spalten (A und B)
    A = 1-400
    B = Werte

    Wahrscheinlich habe es falsch interpretiert (A = 1-400).
    ich vermutete in "A" stehen Zahlen von 1-400 und in "B" irgendwelche Werte Zahlen, Strings oder was weiß ich
    und wenn es eine "0" gibt soll die Zeile raus. Daher mein Versuch Spalte "A" wieder richtig zu sortieren :cry:

  • hm, hast Du auch richtig verstanden. A1 = 1, A2 = 2, ..., A400 = 400. In B stehen Zahlen.

    Aber die richtige Sortierung habe ich am Schluss doch eingebaut, er sortiert dort aufsteigend nach A (Key1:=Range("A1"), Order1:=xlAscending).
    Wahrhscheinlich ist bei Dir irgendwas doppelt gemoppelt der so. :| Was solls, meine Version läuft ja.

    Aber gut zu wissen, jemand kompetentes hier zu haben, evtl. habe ich später noch ein paar Fragen ;)

    Dank & Gruss

  • Ich hab mal gleich 2 Fragen...:

    - oben steht "Rows(i).Select". Wie sage ich ihm das, wenn er in der Schleife nur die Werte Ai und Bi anwählen soll - also nur die ersten beiden Zellen der Zeile i?

    - ich habe das in ein etwas längeres Makro eingebaut. Wenn ich das ausführe, hüpft er zwischen den verschiedenen Mappen hin- und her und man sieht halt, wie er die Befehle der Reihe nach ganz schnell abarbeitet. Am Schluss bin ich wieder in der Ausgangsmappe, wo die bearbeiteten Werte eingefügt werden.
    Wie kann ich dieses abarbeiten/rumhüpfen unterdrücken, so dass er das nur im Hintergrund macht, mir aber nicht anzeigt? Nur die Ergebnisse am Schluss natürlich.

  • Na dann,
    es besteht schon ein Unterschied zwischen unseren Versionen.
    Ausgangslage Beispiel:

    [Blockierte Grafik: http://www.abload.de/img/ausgangwe7.jpg].......[Blockierte Grafik: http://www.abload.de/img/gesamtz7z.jpg]


    Um die Zellen einzeln anzusprechen und das Flattern zu verhindern:

    Code
    If Range("B" & i) = 0 Then
                Application.ScreenUpdating = False
                Range(Cells(i, 1), Cells(i, 2)).Select
                Selection.ClearContents
        End If

    "Application.ScreenUpdating=" hilft.

  • Zum Löschproblem: Man sollte die Auflöstung rückwärts durchlaufen, dann ist das Ergebnis sauberer:

    Code
    Dim i As Long
    
    
    For i = 400 To 1 Step -1
      If Range("B" & i) = 0 Then
        Rows(i).Delete
       End If
    Next i

    Sortieren ist dann nicht mehr notwendig.

  • bejot:
    ah - jetzt versteh ich, was Du mit neuer Sortierung meintest. Ich habs einfach nicht kapiert, weil ich gerade das nicht brauche bzw. nicht haben darf. Es ist zwingend notwendig, dass meine vorher vorhandenen Wertepaare auch genauso erhalten bleiben. (20,45) muss (20,45) bleiben. Dass hinterher durch das löschen die Intervalle nicht alle gleich gross sind, ist egal. Es wird dann eh eine Ausgleichskurve durch die dann vorhandenen Werte gelegt.

    Das andere guck ich mir morgen früh an, bin grad nicht unter XP unterwegs. Vielen Dank bis hierhin.


    Mithrandir:
    Stimmt, auch eine Möglichkeit! Guck ich mir morgen an :)

  • Zitat von bejot


    Um die Zellen einzeln anzusprechen und das Flattern zu verhindern:

    Code
    If Range("B" & i) = 0 Then
                Application.ScreenUpdating = False
                Range(Cells(i, 1), Cells(i, 2)).Select
                Selection.ClearContents
        End If

    "Application.ScreenUpdating=" hilft.


    Jo, funzt alles wunderbar.

    Nochmal ne kleine Nachfrage zu "Range(Cells(i, 1), Cells(i, 2)).Select":
    Wenn ich zB die ersten 10 Zellen der Zeile markieren will, muss ich die alle mit (Cells(i, 1) bis (Cells(i, 10) einzeln eintragen. Wie geht das besser? Wahrscheinlich mit einer Schleife, oder wie würdest Du das machen?
    Musste jetzt nicht hincoden, das interessiert mich nur.


    Mithrandir:
    jo, funzt. Hab Deinen mit bejots Code verwurschtelt und nehme das jetzt :)