Registriert seit: 15.12.2016
Version(en): 2013
11.12.2018, 15:45
(Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2018, 15: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, 18:07
(Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2018, 18: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, 07:50
(Dieser Beitrag wurde zuletzt bearbeitet: 12.12.2018, 07: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, 08:20
(Dieser Beitrag wurde zuletzt bearbeitet: 12.12.2018, 08: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-tables
Grundsä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:= True
Die 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 With
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: 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, 08: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=150
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)
|