Clever-Excel-Forum

Normale Version: for each rngzelle...
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
Hallo liebe Gemeinde,
freu mich hier zu sein :)

Ich habe schon lange nichts mehr an meinen Tabellen gemacht. Nun hat mich eine Sache schon lange genervt. Ich muß sagen ich habe viele Makros auch wenn ich mich nicht damit auskenne.
Aber Danke der vielen Excelhelfer und meine leihenhafte deutung von VBA habe ich es doch ganz gut hinbekommen.
Ich hatte aus einen Arbeitsbaltt einen Teil herauskopiert für ein anderes Arbeitsblatt. Soweit umgeschrieben und es lief auch.
Aber und jetzt kommts viel viel langsamer als im anderen Baltt.
folgendes hatte ich umgeschrieben

For Each rngZelle In Range("B2:f20").SpecialCells(xlCellTypeFormulas)     'Für mein Rechnungsblatt
    rngZelle.Value = rngZelle
Next rngZelle


in


For Each rngZelle In Range("AQ28").SpecialCells(xlCellTypeFormulas)     'für mein Quittungsblatt
    rngZelle.Value = rngZelle
Next rngZelle


Da dort nur die eine Zelle von =B52(Formel B52 ist: =(Heute) ) in das Datum als Text  zu wandeln.


Nun habe ich mit Haltepunkt und F8(manuell weiter) festgestellt das er dort eine ewige Schleife machte, bis die Formel in einen Text gewandelt wurde.
Nach langem Probieren habe ich jetzt einfach AQ28:AQ29 geschrieben, und siehe da es funktioniert ruckzuck.

Kann mir jemand erklären warum das so ist??

Danke Gianni
Hallöchen,

- für eine einzelne Zelle brauchst Du keine Schleife ...
- wenn der Code in einem Worksheet_Change steht, solltest Du am Anfang DoEvents ausschalten und am Ende wieder ein.
Nur als ergänzende Anmerkung zu Andrés Flüchtigkeitsfehler:
Gemeint ist Application.EnableEvents = False
(und am Ende = True)

Gruß Ralf
Danke für die rasche Antwort

Das ganze ist in einem Modul und wird per Steuerelement hinter dem das Makro steht, gestartet. Anbei der komplette Code. Könntest du mir das einbauen damit ich es dann testen kann? Danke
Code:
Sub SpeichernDruckenQ()
Dim Z, z1, z2, sp, sp1 As Long
Dim ws, ws1 As Worksheet
Dim wb As Workbook
Set wb = Workbooks("Geschäftsvorgänge 2023.xlsm")
'Set ws = wb.Sheets("Quittung")
'Set ws1 = wb.Sheets("Kasse")
Set ws = Worksheets("Quittung") 'war vorher
Set ws1 = Worksheets("Kasse")   'war vorher
anz = ws1.Cells(65536, 1).End(xlUp).Row
For z1 = 2 To anz

ws.Unprotect ("xxx") 'Tabelle schutz aufheben
If ws.Range("E6") = ws1.Cells(z1, 1) Then   'Rechnungsnummer
        ws1.Cells(z1, 2) = ws.Range("AQ28")       'Datum
        ws1.Cells(z1, 5) = ws.Range("BR4")       'Nettosumme
        ws1.Cells(z1, 6) = ws.Range("BR5")       'Mwst.summe
        ws1.Cells(z1, 4) = ws.Range("BR6")       'Gesammtsumme
        ws1.Cells(z1, 3) = ws.Range("J14")       'Text
   If ws.Range("W8") = ws.Range("BG9") Then   'easycash
   ws1.Cells(z1, 7) = ws.Range("BG9")        'easycash
   End If
End If
Next

Const strpath As String = "\\BAFFOSPIEGEL_2\Quittungen\" 'Speicherpfad anpassen
Dim strfile As String

Worksheets("Quittung").Copy

  For Each rngZelle In Range("AQ28:AQ29").SpecialCells(xlCellTypeFormulas)
    rngZelle.Value = rngZelle
Next rngZelle



strfile = ActiveSheet.Range("BG1") & Range("E6").Value
If Dir(strpath) = "" Then
MsgBox "Pfad existiert nicht"
Exit Sub
End If
If Dir(strpath & strfile & ".xlsx") = "" Then
ActiveWorkbook.SaveAs strpath & strfile
Else
MsgBox "Datei existiert bereits"
End If

ThisWorkbook.Worksheets("Quittung").Activate 'Hält Aktuelle Tabelle Activ
ActiveSheet.PageSetup.BlackAndWhite = True           'druckt in SW
ActiveWindow.SelectedSheets.PrintOut Copies:=1

[E6] = [E6] + 1 'Mahnungsnummer 1 hochzählen
[w8] = [bg8]
[AD5] = [BT4] ' hier BT4 für 19 % und BT3 für 16%
[AQ28] = "=BG2"
Range("AN6").Select
Selection.ClearContents
Range("BA6").Select
Selection.ClearContents
Range("J14").Select
Selection.ClearContents
Range("J16").Select
Selection.ClearContents
Range("J18").Select
Selection.ClearContents
Range("J20").Select
Selection.ClearContents
Range("J22").Select
Selection.ClearContents

ws.Protect ("xxx") 'Tabelle Einnahmen schutz einschalten

End Sub            'OK
Hallöchen,

Also, erst mal ist es kein Worksheet_Change. Falls Du doch eins hat, dann, wie gesagt, dort mal die Events abstellen.


Hier mal ein paar Anmerkungen zum Code, die aber eher nix mit dem Problem zu tun haben.

Code:
Const strpath As String = "\\BAFFOSPIEGEL_2\Quittungen\" 'Speicherpfad anpassen
Dim strfile As String
--> wenn nichts dagegen spricht, ist ein Programmanfang der bevorzugte Ort für die Deklarationen

Code:
For Each rngZelle In Range("AQ28:AQ29").SpecialCells(xlCellTypeFormulas)
    rngZelle.Value = rngZelle
Next rngZelle
--> hier bist Du auf dem aktiven Blatt, solange Du nicht ein anderes zwischenzeitlich aktivierst.
Ist insofern inkonsequent, da Du an anderen Stellen mit Blattobjekten arbeitest (ws, ws1)
Ebenso ist die Schleife unnötig. Es reicht Range("AQ28:AQ29").Value = Range("AQ28:AQ29").Value

Code:
Range("AN6").Select
Selection.ClearContents
-->  kannst Du zusammenziehen zu Range("AN6").ClearContents

22 Danke an Ralf
*gelöscht, weil jetzt unerheblich*


@xiphias:
Du solltest mal die Datei hochladen.
Vielleicht kann man dann eher Dein Problem nachvollziehen.

Gruß Ralf
33 
77
Ich habe meinen Post editiert, bitte aber dennoch um die Datei.
Super

ich würde ja gerne die Datei hochladen, muß diese aber erst komplett auf eine neue andere Arbeitsmappe kopieren und testen ob es dann noch so geht.
Werde versuchen die Zeit zu finden um dies umzuschreiben.

Die Fehler die du anmerkst, entstehen weil ich teile von einer anderen Programmierung dann übertrage in ein neues . Und da ich leider nicht mit den Basiskenntnissen der Makros vertraut bin..... passiert dann so was :)

Ich wollte schon mal so Excelkurse belegen, aber die sind eher für Anfänger. Mit VBA habe ich nichts. Gut, weis jetzt nicht ob es sowas auch mal als Webinar gibt in der zwischenzeit.
Aber alles was ich mit VBA gemacht habe ist Fertige VBA zunehmen und versuchen zu verstehen welche Zeiile was macht um diese dann umzuschreiben.
Und  ja, ich habe nicht die Zeit mir alles selber durchzulesen und dann weis ich nach 2 Stunden nicht mehr was ich am Anfang gelesen habe.

Ich werde die Datei mal umschreiben und auch deine Anmerkungen probieren.

Du schreibst :   Range("AQ28:AQ29").Value = Range("AQ28:AQ29").Value und das macht aus der Zelle AQ28(Mit Formel =B52) wo das Datum Steht(welches in Zelle B52 geholt wird),und in Zelle B52 ist die Formel =Heute() drinn, dan das Datum Als Text?
werde es probieren

Eigentlich hatte ich ja vorher nur AQ28 stehen. Und nur ducrh langes probieren, bin ich auf die variante mit AQ28:AQ29 gekommen. Da sonst eine mir nicht bekannte lange Schleife gestartet wurde. Und nun geht ratz fatz :) AQ29 ist leer und auch nicht benutzt.
Das ganze mit dem Umwandeln habe ich nur weil, wenn ich die Datei irgendwann wieder öffne, dann in AQ28 das aktuelle Datum geschrieben wird. Und nicht das Datum als ich die Datei abgespeichert habe.

@RPP63 werde die Datei hochladen wenn ich SIe einzeln in eine neue Mappe bekomme :) Und die ganzen DSGVO-Problematischen Sachen verallgemeinert habe
Hallo Ralf
So nun habe ich mal was erstellt. Unter C:Users/Benutzer/Dokumente einen Ordner anlegen mit Namen QuittungenTest. In dem Code den Pfad anpassen.
Die Quittung Test.xlsm in den Ordner Dokumente legen.

Habe jetzt noch nicht getestet ob Range("AQ28:AQ29").Value = Range("AQ28:AQ29").Value und wo ich das einesezten muß.

Gruß Gianni[attachment=46721]
Seiten: 1 2 3