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

Forumthread: Makro wiederholen bis ...

Makro wiederholen bis ...
03.11.2012 07:50:22
Fritz_W
Hallo Forumsbesucher,
bitte um Hilfe der VBA-Experten unter euch.
In meiner Tabelle ändert sich bei Ausführung von Makro1 der Zellwert (Zahl) in Zelle O13. Ich möchte nun das Makro1 solange (wiederholt) ausführen lassen, bis der Zellwert in Zelle O13 die Zahl 0 annimmt.
Im Voraus vielen Dank für eure Unterstützung.
mfg
Fritz

Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Zeig doch bitte mal das Makro kwT
03.11.2012 08:06:18
Matthias

AW: Zeig doch bitte mal das Makro kwT
03.11.2012 08:24:42
Fritz_W
Hallo Matthias,
hier das Makro:
Sub Makro1()
ScreenUpdating = False
Dim ArrayData, tmpArr, n&, nn&
With Tabelle2.Range("D14:L22")
ArrayData = .Value
tmpArr = .Offset(-10, 0).FormulaR1C1
For n = 1 To UBound(ArrayData)
For nn = 1 To UBound(ArrayData, 2)
If ArrayData(n, nn)  "" Then
If IsNumeric(ArrayData(n, nn)) Then tmpArr(n, nn) = ArrayData(n, nn)
End If
Next nn
Next n
.Offset(-10, 0).FormulaR1C1 = tmpArr
ScreenUpdating = True
End With
End Sub
Der Zellwert in O13 ergibt sich aus einer Formel.
mfg
Fritz

Anzeige
Und die Formel aus O6 ?
03.11.2012 08:50:09
Matthias
Hallo
Dein Makro kopiert doch nur den Inhalt aus Range("D14:L22")
und fügt es 10 Zeilen weiter oben wieder ein.
Das kann man doch auch so machen:
With Tabelle2
.Range("D14:L22").Copy
.Range("D4").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End With
Was in "O6" steht weis ich nicht, also kann ich Dir ja nicht gezielt helfen.
Nur soviel dazu:
Du kannst Dein Makro ja wiederholen und Goto bzw. Do verwenden.
hier beide Beispiele in einer Datei:
https://www.herber.de/bbs/user/82459.xls
viel Erfolg
Gruß Matthias (muss jetzt weg)

Anzeige
AW: Und die Formel aus O6 ?
03.11.2012 09:09:05
Fritz_W
Hallo Matthias,
vielen Dank.
Werd im Verlauf des heutigen Nachmittags probieren, ob ich aus der Beispieldatei die richtigen Schlüsse ziehen kann, ich hab da aber meine Zweifel.
Der Zellwert in O13 ändert sich nach jeder Ausführung des Makros, deshalb meinte ich es ist unerheblich was in O6 steht. Also das Makro1 solange ausführen, bis in O6 eine 0 steht.
Ggf. melde ich mich später noch einmal.
mfg
Fritz

Anzeige
AW: Und die Formel aus O6 ?
03.11.2012 09:16:56
Tino
Hallo,
soll dieses Makro in einer Schleife bleiben oder immer wieder neu gestartet werden.
Mit Schleife müsste so gehen.
Sub Makro1()
Dim ArrayData, tmpArr, n&, nn&
Application.ScreenUpdating = False
With Tabelle2.Range("D14:L22")
    Do While Tabelle2.Range("O13") > 0
        ArrayData = .Value
        tmpArr = .Offset(-10, 0).FormulaR1C1
        For n = 1 To Ubound(ArrayData)
            For nn = 1 To Ubound(ArrayData, 2)
                If ArrayData(n, nn) <> "" Then
                    If IsNumeric(ArrayData(n, nn)) Then tmpArr(n, nn) = ArrayData(n, nn)
                End If
            Next nn
        Next n
        .Offset(-10, 0).FormulaR1C1 = tmpArr
    Loop
End With
Application.ScreenUpdating = True
End Sub
Immer wieder neu starten geht so.
kommt als Code in DieseArbeitsmappe
Option Explicit 
 
Private Sub Workbook_BeforeClose(Cancel As Boolean) 
On Error Resume Next 
Application.OnTime nTime, "Makro1", Schedule:=False 
End Sub 
 
kommt als Code in Modul1
Option Explicit 
 
Public nTime As Date 
 
Sub Makro1() 
Dim ArrayData, tmpArr, n&, nn& 
 
Application.ScreenUpdating = False 
With Tabelle2.Range("D14:L22") 
    ArrayData = .Value 
    tmpArr = .Offset(-10, 0).FormulaR1C1 
    For n = 1 To Ubound(ArrayData) 
        For nn = 1 To Ubound(ArrayData, 2) 
            If ArrayData(n, nn) <> "" Then 
                If IsNumeric(ArrayData(n, nn)) Then tmpArr(n, nn) = ArrayData(n, nn) 
            End If 
        Next nn 
    Next n 
    .Offset(-10, 0).FormulaR1C1 = tmpArr 
End With 
 
Range("O13") = Range("O13") - 1 
Application.ScreenUpdating = True 
 
If Tabelle2.Range("O13") > 0 Then 
    nTime = Now + TimeSerial(0, 0, 1) 
    Application.OnTime nTime, "Makro1" 
End If 
End Sub 
Gruß Tino

Anzeige
AW: Und die Formel aus O6 ?
03.11.2012 09:18:38
Tino
Hallo,
im zweiten Code die Zeile
Range("O13") = Range("O13") - 1
löschen, hatte ich zu testzwecken reingeschrieben.
Gruß Tino

AW: Und die Formel aus O6 ?
03.11.2012 09:34:30
Fritz_W
Hallo Tino,
mit Schleife funktioniert es genau so, wie ich mir das vorgestellt habe!
Ganz herzlichen Dank.
Viele Grüße
Fritz
P.S.: Den in Makro1 verwendeten Code hab ich übrigens hier in diesem Forum von Dir erhalten.

Anzeige
AW: Und die Formel aus O6 ?
03.11.2012 09:41:23
Tino
Hallo,
kann mich daran erinnern, daher wusste ich das es mit kopieren nicht geht.
Weil die Formeln im Ziel erhalten bleiben müssen und nur
Nummerische Daten übertragen werden sollen.
Erich hat auch noch eine Variante reingestellt.
Gruß Tino

AW: Und die Formel aus O6 ?
03.11.2012 10:29:55
Fritz_W
Hallo Tino,
Du hast mir hier in den vergangenen Monaten schon mehrfach mit ganz excellenten Lösungen geholfen.
Wie ich schon (auf Erichs letzten Beitrag) erwähnt hab, bin ich sehr dankbar für die Hilfe von solchen Könnern.
Viele Grüße
Fritz

Anzeige
Codevorschlag
03.11.2012 09:33:06
Erich
Hi Fritz,
hier mein Vorschlag:

Option Explicit
Sub Makro1()
Dim rngQuel As Range, rngZiel As Range, rngTest As Range
Dim arQuel, arZiel, zz As Long, ss As Long, ii As Integer
'   Application.ScreenUpdating = False             ' NACH dem Test aktivieren
With Tabelle2
Set rngQuel = .Range("D14:L22")
Set rngZiel = rngQuel.Offset(-10, 0)
Set rngTest = .Range("O13")
Do While ii  "" Then
If IsNumeric(arQuel(zz, ss)) Then arZiel(zz, ss) = arQuel(zz, ss)
End If
Next ss
Next zz
rngZiel.FormulaR1C1 = arZiel
Loop
End With
Application.ScreenUpdating = True
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Codevorschlag
03.11.2012 09:42:48
Fritz_W
Hallo Erich,
auch mit deinem Code funktioniert es wie ich mir das vorgestellt habe.
Auch Dir ganz herzlichen Dank.
Viele Grüße
Fritz

kleine Änderung
03.11.2012 09:54:21
Erich
Hi Fritz,
je nach der Formel in O13 (bzw. deren möglichen Werten) kann es nützlich sein,
die Exit-Bedingung sicherheitshalber etwas anders formulieren.
Wenn aufgrund der Dazimalzahl-Rechenungenauigkeit in O13 nicht genau 0,
sondern nur ein Wert nahe bei 0 rauskommt, sollte die Schleife wohl auch abbrechen - also:
If Abs(rngTest.Value) < 0.000000000001 Then Exit Do
Wenn in O13 nur Ganzzahlen rauskommen können, gibts natürlich da keine Probleme.
Nebenbei: In Tinos Code erfolgt der Abbruch auch, wenn O13 kleiner als 0 ist.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: kleine Änderung
03.11.2012 10:22:38
Fritz_W
Hallo Erich,
ich bin immer wieder begeistert, welche hilfreichen (ergänzende) Informationen mir hier in diesem Forum immer wieder zur Verfügung gestellt werden.
Ich möchte mich dafür hier noch einmal ganz herzlich bei Dir und allen anderen Helfern bedanken.
Viele Grüße
Fritz

Anzeige
Das es eine Vorgeschichte gab wusste ich nicht kwT
03.11.2012 17:54:58
Matthias
Anzeige
Anzeige

Infobox / Tutorial

Makro wiederholen bis Wert erreicht


Schritt-für-Schritt-Anleitung

Um ein Makro in Excel zu wiederholen, bis ein bestimmter Zellwert erreicht ist, kannst du das folgende VBA-Skript verwenden. Dieses Beispiel geht davon aus, dass du den Wert in Zelle O13 überwachen möchtest.

  1. Öffne das Excel-Dokument und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu, indem du mit der rechten Maustaste auf "VBAProject (DeinWorkbookName)" klickst und "Einfügen" > "Modul" wählst.

  3. Kopiere den folgenden Code in das Modul:

    Sub Makro1()
       Dim ArrayData, tmpArr, n&, nn&
       Application.ScreenUpdating = False
    
       With Tabelle2.Range("D14:L22")
           Do While Tabelle2.Range("O13") > 0
               ArrayData = .Value
               tmpArr = .Offset(-10, 0).FormulaR1C1
               For n = 1 To UBound(ArrayData)
                   For nn = 1 To UBound(ArrayData, 2)
                       If ArrayData(n, nn) <> "" Then
                           If IsNumeric(ArrayData(n, nn)) Then tmpArr(n, nn) = ArrayData(n, nn)
                       End If
                   Next nn
               Next n
               .Offset(-10, 0).FormulaR1C1 = tmpArr
           Loop
       End With
    
       Application.ScreenUpdating = True
    End Sub
  4. Schließe den VBA-Editor und führe das Makro aus, indem du ALT + F8 drückst und dein Makro auswählst.


Häufige Fehler und Lösungen

  • Fehler: Das Makro wird nicht ausgeführt.
    Lösung: Stelle sicher, dass die Makros in deinen Excel-Einstellungen aktiviert sind. Gehe zu Datei > Optionen > Trust Center > Einstellungen für das Trust Center > Makroeinstellungen und aktiviere die Option für Makros.

  • Fehler: Der Wert in O13 ändert sich nicht.
    Lösung: Überprüfe die Formel oder den Code, der den Wert in O13 berechnet. Stelle sicher, dass dieser aktualisiert wird, wenn das Makro läuft.


Alternative Methoden

Wenn du das Makro nicht in einer Schleife laufen lassen möchtest, kannst du die Methode Application.OnTime verwenden, um das Makro in regelmäßigen Abständen neu zu starten. Hier ist ein Beispiel:

Public nTime As Date

Sub StartMakro()
    nTime = Now + TimeValue("00:01:00") ' alle 1 Minute
    Application.OnTime nTime, "Makro1"
End Sub

Führe StartMakro aus, um das Makro alle Minute zu starten, bis O13 den Wert 0 erreicht.


Praktische Beispiele

Hier ist ein praktisches Beispiel, das zeigt, wie du die Funktionalität des Befehls wiederholen in Excel umsetzen kannst:

Sub BeispielMakro()
    Dim i As Integer
    For i = 1 To 100
        ' Deine Berechnung
        Range("O13").Value = Range("O13").Value - 1 ' Beispiel für eine Änderung
        If Range("O13").Value <= 0 Then Exit For
    Next i
End Sub

In diesem Beispiel wird der Wert in O13 von 100 auf 0 reduziert.


Tipps für Profis

  • Nutze Application.ScreenUpdating = False, um die Ausführungsgeschwindigkeit deines Makros zu erhöhen, indem Bildschirmaktualisierungen während der Makroausführung unterdrückt werden.
  • Verwende Exit Do und Loop effizient, um die Schleife sofort zu beenden, wenn der gewünschte Zustand erreicht ist.
  • Teste dein Makro zuerst mit einer kleinen Datenmenge, um sicherzustellen, dass es wie gewünscht funktioniert.

FAQ: Häufige Fragen

1. Wie kann ich das Makro automatisch starten?
Du kannst das Makro bei einem bestimmten Ereignis wie dem Öffnen der Arbeitsmappe oder beim Schließen starten, indem du die entsprechenden Ereignisprozeduren im VBA-Editor verwendest.

2. Was passiert, wenn der Wert in O13 nie 0 erreicht?
Das Makro wird in einer Endlosschleife laufen, bis du Excel schließt oder das Makro manuell stoppst. Es ist wichtig, Bedingungen zu setzen, um dies zu vermeiden, z.B. ein Maximum an Iterationen festzulegen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige