Betrifft: Problem in For Each Schleife
von: Peter
Geschrieben am: 25.07.2012 11:59:38
Guten Tag
Für Kursumrechnungen habe ich mir eine Schleife gebastelt, die wie folgt aussieht und beim Change-Ereignis einer Combobox (Waehrung) aufgerufen wird:
Sub Umrechnung() Dim zelle As Range For Each zelle In objtest If zelle.Value > 0 And Waehrung.Value = "EUR" Then zelle.Value = zelle.Value / kurs ElseIf zelle.Value > 0 And Waehrung.Value <> "EUR" Then zelle.Value = zelle.Value * kurs End If Next zelle End SubIn einem Hauptmodul habe ich alle Objekte definiert, auf welche dann von den einzelnen Subprozeduren zugegriffen werden kann. So habe ich auch das Objekt objtest definiert resp. dem Objekt einen Zellbereich über Set zugeordnet. Beim Ausführen meiner Prozedur bekomme ich immer die Fehlermeldung Laufzeitfehler 424, Objekt erforderlich. Ich vermute, dass diese Meldung mit Zelle zu tun hat. Ich deklariere zuerst die Zelle als ein Range-Objekt. Hab dies mal so in einem Fachbuch gelesen. Man müsste wohl dieser Zelle auch noch einen Bereich zuordnen ev. liegt hier der Fehler.
Betrifft: AW: Problem in For Each Schleife
von: Sheldon
Geschrieben am: 25.07.2012 12:53:47
Hi Peter,
wenn du eine Variable in einem Sub definierst, dann ist sie außerhalb dieses Subs nicht existent. Definier daher die Variable global und ordne ihr dann im Hauptsub den Zellbereich zu. Also muss im Grunde nur die Dim-Zeile ausziehen aus dem Sub.
Gruß
Sheldon
Betrifft: AW: Problem in For Each Schleife
von: Peter
Geschrieben am: 25.07.2012 14:21:55
Hallo Sheldon
Danke für Deine Antwort. Ich muss das Ganze anders lösen. Wenn ich ca. 1500 Datensätze per VBA ändern will, dann läuft mir die For Each Variante viel zu langsam. Gibt es ev. noch eine andere Möglichkeit, die schneller ist?
Danke.
Gruss
Peter
Betrifft: AW: Problem in For Each Schleife
von: Sheldon
Geschrieben am: 25.07.2012 14:39:06
Hi Peter,
versuch mal das:
Sub Umrechnung() Dim zelle As Range Application.Screenupdating = False For Each zelle In objtest If zelle.Value > 0 And Waehrung.Value = "EUR" Then zelle.Value = zelle.Value / kurs ElseIf zelle.Value > 0 And Waehrung.Value <> "EUR" Then zelle.Value = zelle.Value * kurs End If Next zelle Application.Screenupdating = True End Sub
Betrifft: AW: Problem in For Each Schleife
von: IngGi
Geschrieben am: 25.07.2012 14:51:35
Hallo Peter,
wesentlich schneller wird das Ganze, wenn du den gesamten Zellbereich zunächst in ein Array einliest, dann sämtliche Änderungen an diesem Array vornimmst und das Array schließlich wieder in den Zellbereich zurückschreibst. Im folgenden Beispiel werden die Werte im Zellbereich A1:A5 verdoppelt:
Sub Verdoppeln() Dim vArray As Variant Dim loZeile As Long 'Zellbereich in Array einlesen vArray = Range("A1:A5") 'Änderungen der Zellwerte im Array per Schleife vornehmen For loZeile = 1 To UBound(vArray, 1) vArray(loZeile, 1) = vArray(loZeile, 1) * 2 Next 'loZeile 'Array in Zellbereich zurückschreiben Range("A1").Resize(UBound(vArray, 1), UBound(vArray, 2)) = vArray End Sub
Betrifft: AW: Problem in For Each Schleife
von: Peter
Geschrieben am: 25.07.2012 16:58:17
Hallo zusammen
Vielen Dank. Hat alles bestens geklappt.
Lieber Gruss
Peter