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
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
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]