Fehler in Code?
#11
@ 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
Top
#12
Hallo Thomas,

hat sich erledigt.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Top
#13
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
[-] Folgende(r) 1 Nutzer sagt Danke an Klaus-Dieter für diesen Beitrag:
  • Thomas78
Top
#14
Hallo Klaus-Dieter,

vielen Dank für deine Hilfe!
Dein code hat beim ersten Mal super schnell geklappt, dann allerdings nicht mehr Sad

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?
Top
#15
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)
Top
#16
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 lngC2) = CDate(Me.TextBox1.Value                     'R-Datum 
PHP-Code:
.DataBodyRange(.ListRows.Count2) = 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
Top
#17
(12.12.2018, 09:42)Thomas78 schrieb: Heisst das ich muss keine letzte Zeile ermitteln wie bisher?
So ist es! Wink

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)
Top
#18
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)
Top
#19
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.Count2) = CDate(Me.TextBox1.Value                     'R-Datum
     .DataBodyRange(.ListRows.Count, 3) = TextBox3.Value                                '
Rechnungsnummer
     
.DataBodyRange(.ListRows.Count4) = 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.Count1) = CDate(Me.TextBox1.Value                     'R-Datum
     .DataBodyRange(.ListRows.Count, 2) = CDate(Controls("TextBox" & lngC).Value)       '
L-Datum
     
.DataBodyRange(.ListRows.Count3) = ComboBox21.Value                              'Kunde / Lieferant
     .DataBodyRange(.ListRows.Count, 4) = TextBox3.Value                                '
Rechnungsnummer
     
.DataBodyRange(.ListRows.Count5) = 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.Count8) = 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
Top
#20
: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)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste