Registriert seit: 15.12.2016
Version(en): 2013
11.12.2018, 16:45
(Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2018, 16:45 von Thomas78.)
@ Gast 123,
Formeln sind viele vorhanden, aber das war in der Vorgängerversion der Datei auch schon so und ging ohne Probleme.
Das mit dem Code manuell und automatisch habe ich nicht verstanden...
@ snb
dein code verursacht bei mir leider gedanklich lauter Fragezeichen, was bewirkt der?
Wenn ich den in der Userform einfüge erhalte ich leider eine Fehlermeldung:
Laufzeitfehler 1004
Die AdvancedFilter Methode des Range Objektes konnte nicht ausgeführt werden
Danke euch beiden
Registriert seit: 11.04.2014
Version(en): Office 365
11.12.2018, 19:07
(Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2018, 19:07 von Klaus-Dieter.)
Hallo Thomas,
hat sich erledigt.
Viele Grüße Klaus-Dieter Der Erfolg hat viele Väter, der Misserfolg ist ein Waisenkind Richard Cobden
Registriert seit: 11.04.2014
Version(en): Office 365
Hallo Thomas, möglicherweise noch nicht der Weisheit letzter Schluss, aber damit habe ich eine deutliche Beschleunigung erreicht: Code: zeil = efz2 - 4 For lngC = 5 To 24 If Controls("TextBox" & lngC).Value <> "" Then
Sheets("Umsatzliste").Cells(zeil + lngC, 2) = CDate(Me.TextBox1.Value) 'R-Datum Sheets("Umsatzliste").Cells(zeil + lngC, 3) = CDate(Controls("TextBox" & lngC).Value) 'L-Datum Sheets("Umsatzliste").Cells(zeil + lngC, 4) = ComboBox21.Value 'Kunde / Lieferant Sheets("Umsatzliste").Cells(zeil + lngC, 5) = TextBox3.Value 'Rechnungsnummer Sheets("Umsatzliste").Cells(zeil + lngC, 6) = Controls("ComboBox" & lngC - 4).Value 'Artikel Sheets("Umsatzliste").Cells(zeil + lngC, 7) = CDbl(Controls("Textbox" & lngC + 20).Value) 'Umsatz If Controls("TextBox" & lngC + 60).Value <> "" Then Sheets("Umsatzliste").Cells(zeil + lngC, 9) = CCur(Controls("TextBox" & lngC + 60)) 'Preis / Einheit End If End If Next lngC
Viele Grüße Klaus-Dieter Der Erfolg hat viele Väter, der Misserfolg ist ein Waisenkind Richard Cobden
Registriert seit: 15.12.2016
Version(en): 2013
12.12.2018, 08:50
(Dieser Beitrag wurde zuletzt bearbeitet: 12.12.2018, 08:50 von Thomas78.)
Hallo Klaus-Dieter, vielen Dank für deine Hilfe! Dein code hat beim ersten Mal super schnell geklappt, dann allerdings nicht mehr Ich habe jetzt eine andere Lösung gefunden die funktioniert: (Gast123 hat mich draufgebracht, vielen Dank) PHP-Code: Application.ScreenUpdating = False 'Bildschirmaktualisierung ausschalten Application.Calculation = xlCalculationManual 'automat.Berechnung ausschalten
'***Deine Anweisungen***
Application.Calculation = xlCalculationAutomatic 'automat.Berechnung einschalten Application.ScreenUpdating = True 'Bildschirmaktualisierung einschalten End Sub
Dadurch kann ich meine Rechnungen eintragen und sehr schnell übertragen und erst danach findet die Berechnung statt, warum das schneller sein soll kann ich mir zwar nicht erklären, aber solange es funktioniert solls mir recht sein... An dieser Stelle ein dickes Dankeschön an dieses Forum. Ich lese hier täglich mit und hol mir Ideen. Ich habe vor 2 Jahren mit normalen ExcelTabellen angefangen und hatte sonst keinen blassen Schimmer, mittlerweile kann ich mir einigermaßen selbst helfen und nutze täglich meine eigenen Dateien wie die hier gezeigte. Ihr seid super !!! Thomas P.S. Eine Frage hätte ich noch. Wenn die letzte Zeile meiner Tabelle beschrieben ist und ich mittels Userform neue Daten eintrage dann erweitert er meine Tabelle nicht. Das heisst er trägt die Daten einfach eine Zeile unterhalb der Tabelle ein und erweitert diese nicht. Was mach ich hier falsch?
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
12.12.2018, 09:20
(Dieser Beitrag wurde zuletzt bearbeitet: 12.12.2018, 09:20 von RPP63.)
Moin! Zu Deinem P.S.: Du hast ein Tabellenobjekt ("intelligente" Tabelle). Dies behandelt man gänzlich anders, snb hat Dir ja einen Code vorgestellt, den Du (noch) nicht verstanden hast. Siehe: https://www.thespreadsheetguru.com/blog/...cel-tablesGrundsätzlich führt man niemals Zeilen "auf Vorrat", sondern fügt neue Datensätze per Code wie folgt am Ende ein: Add Row To Bottom of Table: ActiveSheet.ListObjects("Table1").ListRows.Add AlwaysInsert:= TrueDie einzelnen Spalten füllst Du dann mittels .DataBodyRange(Zeile, Spalte) Als Beispiel für die Spalten C und D: With ActiveSheet.ListObjects("Tabelle1") .ListRows.Add AlwaysInsert:=True .DataBodyRange(.ListRows.Count, 3) = "C" .DataBodyRange(.ListRows.Count, 4) = "D"End WithGruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 15.12.2016
Version(en): 2013
Hallo Ralf, hmh ich weiß worauf du hinauswillst, nur hab ich keine Ahnung wie ich das in den code einbaue... Meinst du statt PHP-Code: Sheets("Umsatzliste").Cells(zeil + lngC, 2) = CDate(Me.TextBox1.Value) 'R-Datum
PHP-Code: .DataBodyRange(.ListRows.Count, 2) = CDate(Me.TextBox1.Value)
Heisst das ich muss keine letzte Zeile ermitteln wie bisher? Das ist mir noch ein Stückchen zu hoch fürchte ich Thomas
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
(12.12.2018, 09:42)Thomas78 schrieb: Heisst das ich muss keine letzte Zeile ermitteln wie bisher? So ist es! Mal ein Vorschlag, der keineswegs despektierlich gemeint ist: Ein Userform ist eine nette Geschichte und gibt dem Ersteller den Anschein einer gewissen Professionalität. Allerdings ist das korrekte Erstellen absolut nichts für jemanden, der den Einstieg in VBA sucht. Dafür gibt es einfach zu viele Fallstricke, da hier ausschließlich Texte oder Wahrheitswerte übergeben werden. Diese müssen sämtlich zunächst auf den korrekten Datentyp überprüft und beim Übertrag in die Tabelle entsprechend umgewandelt werden. Bis Du ein Userform korrekt debugged hast ("Idiotensicher"), vergeht auch bei einem geübten Progger wertvolle Lebenszeit, die er durch korrekte Einrichtung einer Excel-Tabelle besser nutzen könnte. Zum Thema: Du hast von mir einen sehr guten Link erhalten, mittels dessen Du anhand einer Übungsdatei die Methoden ausprobieren kannst. Übrigens mache ich auch geübte Anwender häufig auf die "ungewöhnliche" Handhabung des Table-Object aufmerksam. Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
Ich habe mir jetzt mal die Datei angesehen. Da steckt viel Arbeit drin! Daher zolle ich Respekt, bleibe aber dennoch bei meinen obigen Ausführungen.
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 15.12.2016
Version(en): 2013
Hallo Ralf mein Held ! ich habe jetzt ein bisschen experimentiert und bin auf eine funktionierende Lösung gestossen :19: PHP-Code: Private Sub Speichern_Click()
Application.Calculation = xlCalculationManual 'automat.Berechnung ausschalten
With Sheets("Rechnungsbuch").ListObjects("Tabelle5") If TextBox1.Text <> "" Then .ListRows.Add AlwaysInsert:=True .DataBodyRange(.ListRows.Count, 1) = ComboBox22.Value 'Forderung/Lieferrechnung .DataBodyRange(.ListRows.Count, 2) = CDate(Me.TextBox1.Value) 'R-Datum .DataBodyRange(.ListRows.Count, 3) = TextBox3.Value 'Rechnungsnummer .DataBodyRange(.ListRows.Count, 4) = ComboBox21.Value 'Kunde / Lieferant .DataBodyRange(.ListRows.Count, 5) = CCur(Me.TextBox4.Value) 'Rechnungsbetrag End If End With
With Sheets("Umsatzliste").ListObjects("Tabelle3") For lngC = 5 To 24 If Controls("TextBox" & lngC).Value <> "" Then .ListRows.Add AlwaysInsert:=True .DataBodyRange(.ListRows.Count, 1) = CDate(Me.TextBox1.Value) 'R-Datum .DataBodyRange(.ListRows.Count, 2) = CDate(Controls("TextBox" & lngC).Value) 'L-Datum .DataBodyRange(.ListRows.Count, 3) = ComboBox21.Value 'Kunde / Lieferant .DataBodyRange(.ListRows.Count, 4) = TextBox3.Value 'Rechnungsnummer .DataBodyRange(.ListRows.Count, 5) = Controls("ComboBox" & lngC - 4).Value 'Artikel .DataBodyRange(.ListRows.Count, 6) = CDbl(Controls("Textbox" & lngC + 20).Value) 'Umsatz If Controls("TextBox" & lngC + 60).Value <> "" Then .DataBodyRange(.ListRows.Count, 8) = CCur(Controls("TextBox" & lngC + 60)) 'Preis / Einheit End If End If Next lngC End With Unload Me 'Userform leeren Erfassung.Show 'Userform neu starten Application.Calculation = xlCalculationAutomatic 'automat.Berechnung einschalten
End Sub
Damit überträgt er mir die Daten korrekt und und ist auch so schnell wie ich es mir wünsche. Siehst du auf den ersten Blick noch einen Anfängerfehler? Ich bin dir super dankbar für deine Hilfe, allen anderen natürlich auch !!! Schöne Grüße Thomas
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
:19: Prima, dass es klappt! Zum "Anfängerfehler": Wenn Du etwas an den Einstellungen der Anwendung änderst (Calculation), solltest Du grundsätzlich eine Fehlerbehandlung einbauen, die Dir die Einstellungen auch beim Abrauchen des Makros wieder zurückstellt. Gerade ungeübte Anwender werden ein großes Problem damit bekommen, wenn sich keine geöffnete Datei mehr aktualisiert. :21: Wie das geht, liest Du hier: https://www.online-excel.de/excel//sings....php?f=150Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
|