Ich bin dabei, in diesem Thread eine UF zu entwerfen. Nachdem einige Änderungen erforderlich waren/sind, wollte ich diese nun umsetzen. Die alten Codeschnipsel, welche "nicht mehr" benötigt werden, habe ich zunächst nur kommentiert.
Ich habe folgenden Codeschnipsel im Modul "Userform_Initialize" angepasst:
Code:
With .cboMonJahr Set objDic = CreateObject("Scripting.Dictionary") For Zelle = 2 To tblParameter.Cells(Rows.Count, 3).End(xlUp).Row If Year(tblParameter.Cells(Zelle, 3).Value) = Year(Date) Then objDic(tblParameter.Cells(Zelle, 3).Value) = 0 End If Next Zelle
Anzahl = objDic.Count If Anzahl > 0 Then .List = WorksheetFunction.Transpose(objDic.Keys) End If Set objDic = Nothing End With
Die Reduzierung auf die jeweiligen Monate des aktuellen Jahres nur deshalb, um die Anzahl der Einträge ein wenig zu reduzieren. Ob das so auch in der Praxis realisierbar ist, wird sich zeigen.
Mein erster Gedanke war, ich formatiere die Einträge im Format "MMM YY" der ComboBox mit folgendem Schnipsel (wegen der Übersichtlichkeit):
Code:
For i = 0 To .cboMonJahr.ListCount - 1 cboMonJahr.List(i) = Format(DateValue(cboMonJahr.List(i)), "MMM YY") Next i
Das führte im weiteren Verlauf der Prozeduren natürlich dazu, dass der Filter ohnehin nicht arbeitete. Also entschloss ich mich, die Aufgabe subtiler anzugehen.
Mein Problem ist nun, dass egal wie ich die Einträge formatiere (ich habe folgende Varianten getestet)
warum nimmst Du da ein Dictionary Objekt. Du kannst Tabellenbereiche in einem rutsch sehr einfach in Combos oder Lisrtboxen einlesen. Der Dictionary eignet eher um Unicate aus Listen herauszulesen.
Bei der Datumsbox würde ich mit die Additem Methode nehmen. So würde ich alle 3 Boxen füllen:
Code:
With .cboMonJahr For i = 1 To Range("tbl_monat").Rows.Count .AddItem Format(Range("tbl_monat").Cells(i, 1), "MMM YY") Next i End With
'Die Combobox Verkäufer wird mit den Eintragungen aus der Tabelle "Parameter" gefüllt With .cboVerkäufer .List = WorksheetFunction.Transpose(Range("tbl_Verkäufer").Value) End With
'Die Combobox Warengruppe wird mit den Eintragungen aus der Tabelle "Parameter" gefüllt With .cboWarengruppe .List = WorksheetFunction.Transpose(Range("tbl_Warengruppe").Value) End With
Du hast Da aber noch einige andere Baustellen vor Dir.
Ich hatte ja auch schon mal geschrieben, und Frank hat den Wunsch auch mehrmals geäußert, das Ganze geht ohne Userform direkt in einer Tabelle wesentlich einfacher. Einfacher zu programmieren und sehr einfach bei der Nutzung. Eingaben in Tabellen sind schneller gemacht als in Userformen.
(02.12.2014, 01:25)atilla schrieb: Ich hatte ja auch schon mal geschrieben, und Frank hat den Wunsch auch mehrmals geäußert, das Ganze geht ohne Userform direkt in einer Tabelle wesentlich einfacher. Einfacher zu programmieren und sehr einfach bei der Nutzung. Eingaben in Tabellen sind schneller gemacht als in Userformen.
Hi Atilla,
genau so ist es. Ich habe die Datei auch angesehen und überhaupt nicht kapiert, wofür das gut sein soll.
sorry für meine späte Antwort, aber ich war ein paar Tage unterwegs mit sehr limitierten Internetzugang.
Was soll ich sagen: "Sorry mein Fehler?" Abgesehen davon, dass ich die ComboBoxen mit einem Dictionary gefüllt habe, was offensichtlich gut funktioniert hat, war mein Fehler also, dass man ein Dictionary nur verwendet, um eine Unikatsliste zu erstellen? Macht es denn einen Unterschied, ob ich die Einträge aus der Parameter-Tabelle per AddItem oder Dictionary hinzufüge? Zugegeben es sind natürlich schon Unikate aber ich kann daran nichts falsches feststellen.
Ich habe zwischenzeitlich an einer nur "Tabellenlösung" gearbeitet und die Probleme sind die gleichen. In der jetzigen Version habe ich die Daten der ComboBoxen über AddItem, ähnlich wie von Atilla oben beschrieben, hinzufügt. Soll heißen, da ich nicht über benannte Bereiche gearbeitet habe, verzichte ich auf diese Verwendung. Letztendlich ist das Problem das gleich. Sobald ich den Inhalt der Tabelle "Datenbank" nach Datum filtere, erhalte ich keine Ergebnisse. Dies wäre aber zwingend erforderlich, um herauszufinden, ob bereist Daten für Verkäufer und Zeitraum vorliegen.
Noch einmal zu der Erfassung in UFs: Ich sehe das nicht so, dass die Erfassung in einer Tabelle schneller und oder einfacher ist. Von Seiten der Progammierung mag das sein, aber ich sehe nicht, dass es schneller geht, wenn man die Daten über eine gut programmierte UF erfasst. Ich arbeite seit vielen Jahren im Kundendienst. Hier wird mit einer entsprechenden Software gearbeitet. Pro Auftrag sind bis zu 80 Informationen zu erfassen. Diese Erfassung erfolgt ausschließlich über eine UF. Es gibt Mitarbeiter, die sich "blind" in der/den Maske(n) bewegen. In der Spitze erfassen diese Mitarbeiter dabei bis zu 1,3 Datensätze pro Minute. Ich denke, wenn man jedes Mal die "aktive Zelle" in der Tabelle prüfen muss, statt sicher zu sein, der nächste Wert, den man erfassen muss ist, dann dauert das einfach länger. Jede Navigation innerhalb einer Maske mittels Tab oder Strg+Tab geht deutlich schneller und ist zielführender als eine Navigation mittels Tab, Enter oder Maus und man weiß nicht genau wo man sich befindet.
Das was ich aber nicht verstehe ist, sofern man eine nicht ganz korrekte Anweisung verwendet,hier ein Dictionary, "zeigt man mit dem Finger auf einen". Zitat:"Ich habe die Datei auch angeschaut und überhaupt nicht kapiert, wofür das gut sein soll?" Ich hatte gehofft, hier auch etwas als Helfender zu lernen. Zumal ich von Anfang an gesagt habe, dass ich noch lernen würde. Ich finde es ehrlich gesagt etwas schade, dass man a) nicht auf die Fragestellung eingeht, oder das Problem nicht prüft und b) "stigmatisiert" wird. Vielleicht mache ich auch einen Gedankenfehler und ihr erklärt mir den Zweck eines Forums.
08.12.2014, 02:08 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2014, 02:14 von Kuwer.)
Hallo Max,
entschuldige bitte meine letzte Antwort. Sie bezog sich nicht auf Deinen Code, sondern die Tatsache, einen Autofilter per Userform/VBA zu steuern. Nur das hatte ich herausgelesen und nicht verstanden, wozu das gut ist. Aber auch jetzt ist mir der Sinn noch nicht ganz klar.
Ich fange aber einfach mal mit dem Userform_Initialize an:
Code:
Private Sub UserForm_Initialize() Dim i As Integer
If tblDatenbank.FilterMode = True Then tblDatenbank.ShowAllData End If
With Me 'Beschriftung der Steuerelemente .lblMonJahr.Caption = tblDatenbank.Range("A1").Value .lblVerkäufer.Caption = tblDatenbank.Range("B1").Value .lblWarengruppe.Caption = tblDatenbank.Range("C1").Value .lblStück.Caption = tblDatenbank.Range("D1").Value .lblUmsatz.Caption = tblDatenbank.Range("E1").Value .lblGewinnVerlust.Caption = tblDatenbank.Range("F1").Value
'Der Button "Änderungen übernehmen" wird ausgeblendet .cmdÄnderungenÜbernehmen.Visible = False 'Der Button "Korrektur abschließen" wird ausgeblendet .cmdKorrekturabschließen.Visible = False
'Festlegen der Spaltenanzahl- und breite der Listbox .ListBox1.ColumnCount = 7 .ListBox1.ColumnWidths = "85;85;85;85;85;85;10"
'Die Combobox Monat/Jahr wird mit den Eintragungen aus der Tabelle "Parameter" gefüllt With .cboMonJahr .List = Range(tblParameter.Cells(2, 3), tblParameter.Cells(Rows.Count, 3).End(xlUp)).Value For i = .ListCount - 1 To 0 Step -1 If Year(CDate(.List(i))) <> Year(Date) Then .RemoveItem i Else .List(i) = Format(.List(i), "mmm yyyy") End If Next i End With
'Die Combobox Verkäufer wird mit den Eintragungen aus der Tabelle "Parameter" gefüllt With .cboVerkäufer .List = Range(tblParameter.Cells(2, 2), tblParameter.Cells(Rows.Count, 2).End(xlUp)).Value End With
'Die Combobox Warengruppe wird mit den Eintragungen aus der Tabelle "Parameter" gefüllt With .cboWarengruppe .List = Range(tblParameter.Cells(2, 1), tblParameter.Cells(Rows.Count, 1).End(xlUp)).Value End With End With End Sub
Den Style der ersten 3 Comboboxen habe ich mal auf fmStyleDropDownList (wegen der besseren Bedienbarkeit > man muss nicht mehr auf den DropDown-Pfeil zielen) und die Schriftart auf CourierNew 10 gestellt.
Auch sowas hier
Code:
'Festlegen der Spaltenanzahl- und breite der Listbox .ListBox1.ColumnCount = 7 .ListBox1.ColumnWidths = "85;85;85;85;85;85;10"
kann man doch fest einstellen ohne Code, wenn das statisch ist.
Zitat:Zumal ich von Anfang an gesagt habe, dass ich noch lernen würde.
das tue ich auch noch immer, und ich bin sicher nicht weiter als Du. Vielleicht habe ich etwas mehr Erfahrung in einzelnen Bereichen.
Es geht doch nicht um Richtig oder Falsch, sondern eventuell einfachere oder schnellere Methoden. Mit Dictionary kannst Du es machen, aber es ist doch sicher einfacher das aus einem benannten Bereich in einem Rutsch einzulesen als den Bereich erst im Code noch einmal zu erfassen und dann in einer Schleife abzuarbeiten. Da es hier nur um wenige Zeilen geht, merkt man natürlich keine Performance Unterschiede. Ich habe Dir nur eine Alternative zeigen wollen, wie es auch geht. Du kannst es aber so halten, wie Du es gerne möchtest.
Zitat: nicht auf die Fragestellung eingeht, oder das Problem nicht prüft und
Ich bin auf Deine Fragestellung eingegangen. Es sollte durch das Einlesen in einem bestimmten Formt gelöst werden. Das es nicht funktioniert hat, erfahre ich jetzt erst. Ich konnte und wollte in der Datei nicht mehr testen, weil Excel immer wieder abgestürzt ist. Das Problem ist immer noch vorhanden, weil Du den Focus auf ein ausgeblendetes Steuerelement setzt. In der Prozedur txtGewinnVerlust_AfterUpdate steht am Ende: cmdÜbernehmen.SetFocus
Aber bei erst Eingabe ist das Steuerelement noch gar nicht sichtbar.
Das sind Gründe, warum ich keine Lust hatte, großartig weiter zu suchen und zu testen.
Trotzdem habe ich jetzt mal meinen Code getestet, und musste auch feststellen, dass der Filter so nicht funktioniert. Es ist aber nur eine Kleinigkeit, die korrigiert werden muss. Und zwar habe ich das Format so: "MMM YY" angegeben statt "MMM YYYY". Das hättest Du aber auch sehen können.
Hättest Du Dich kurzfristig gemeldet, dass es nicht funktioniert, dann hätte ich es wahrscheinlich auch kurzfristig korrigieren können oder ich hätte Dir gesagt, dass Du die Userform erst einmal vernünftig zum Laufen bringst und dann einstellst.
Ich hatte ja geschrieben, dass Du noch einige Baustellen vor Dir hast. Eine Wichtige habe Dir ja jetzt beschrieben, eine Andere ist, dass nach Verlassen der letzten Textbox trotz Befüllung aller Combos und Textboxen mehrmals die Inputbox auftrat.
Wenn ich schreibe, dass Eingaben in der Tabelle schneller gehen, heißt es nicht, dass Du es machen musst. Ich habe meine Meinung kundgetan, dieser Umstand wird von vielen erfahrenen Usern bestätigt. Ich habe es nur noch einmal wiederholt, weil auch der TE dahingehend mehrmals den Wunsch geäußert hatte..
Summa Summarum bin ich also auf Deine Problemstellung eingegangen. Aber wenn man Dich auf Fehler hinweist, was ich auch hier wieder getan habe, und Du mit:
Zitat:Mache ich morgen. Ich habe heute keinen Bock mehr
musst Du von Deinem Gegenüber auch nicht viel Bock erwarten.
08.12.2014, 23:52 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2014, 23:58 von Max.)
(08.12.2014, 02:08)Kuwer schrieb: Hallo Max,
entschuldige bitte meine letzte Antwort. Sie bezog sich nicht auf Deinen Code, sondern die Tatsache, einen Autofilter per Userform/VBA zu steuern. Nur das hatte ich herausgelesen und nicht verstanden, wozu das gut ist. Aber auch jetzt ist mir der Sinn noch nicht ganz klar.
...
Den Style der ersten 3 Comboboxen habe ich mal auf fmStyleDropDownList (wegen der besseren Bedienbarkeit > man muss nicht mehr auf den DropDown-Pfeil zielen) und die Schriftart auf CourierNew 10 gestellt.
Auch sowas hier
Code:
'Festlegen der Spaltenanzahl- und breite der Listbox .ListBox1.ColumnCount = 7 .ListBox1.ColumnWidths = "85;85;85;85;85;85;10"
kann man doch fest einstellen ohne Code, wenn das statisch ist.
Gruß Uwe
Hi Uwe,
danke für Deine Ergänzungen und Erklärungen. Ich muss mir das mal in Ruhe anschauen und die hatte ich bis jetzt noch nicht.
Das Wichtigste zuerst: Ein Forum ist bei etwaigen Verständnisproblemen, die denkbar ungünstigste Alternative, um sich über solche Sachen auszutauschen. Soweit mein Standpunkt. Man sieht leider nicht die Gestik und Mimik des Anderen! Man kann leider auch nicht direkt intervenieren, um evtl. nachzufragen und so kommen manche Dinge leider falsch an. Das ist jetzt aber geklärt und alles ist gut :19:.
Ich will aber gerne versuchen, Dir zu erklären, warum ich den Filter aus der UF steuern will/muss. Die Problematik bestand darin, dass der TS zunächst eine Prüfung auf evtl. schon vorhandene Daten zu "Verkäufer und Zeitraum" haben wollte, um diese im Bedarfsfall editieren zu können. Hierzu hatte ich, nach meinem anfänglichen Versuch alles über Drop- und TextBoxen realisieren zu wollen, eine ListBox in die UF eingefügt. Der Code soll nun folgendes bewerkstelligen: Nach Eingabe eines Wertes für "Monat/Jahr" und "Verkäufer" in den beiden ComboBoxen, muss die Tabelle "Datenbank" auf die entsprechenden Werte der ComboBoxen gefiltert werden. Solange ich noch Monat und Jahr in zwei getrennten ComboBoxen erfasst habe, funktionierte das auch. Nicht so wie ich es mir vorstellte, aber zumindest mit einer "Krücke".
Code:
Sub Autofilter0
Code:
Sub Autofilter1
Code:
...
Anschließend werden die, den Filterkriterien entsprechenden Daten aus der Tabelle "Datenbank" in die ListBox eingelesen. Auch das funktionierte bevor ich aus Monat und Jahr getrennt, Monat/Jahr machte. In der Listbox kann man nun einen Wert per Klick auswählen und die Daten werden in die entsprechenden Combo- und TextBoxen eingelesen. Ein Klick auf "Änderungen übernehmen" aktualisiert die Tabelle "Datenbank" sowie die Einträge in der ListBox. Anschließend kann der nächste Eintrag analog editiert werden. Das "große" Problem ist nun, dass nach der Zusammenlegung von Monat und Jahr in eine ComboBox der Filter nicht mehr (richtig) arbeitet. Man wählt also einen Wert für "Monat/Jahr" und "Verkäufer" und auch wenn die Werte bereits in der Datenbank" vorhanden sind, der Filter erfasst sie nicht mehr!
Hinsichtlich Deiner Anmerkung wie man bestimmte Parameter vorgibt (hier die Spaltenbreite der ListBox), jain... Ich denke, und darüber lässt sich bestimmt vortrefflich diskutieren, möglichst viel im Code vorzunehmen, ist die bessere Alternative. Das hat den "Vorteil", dass man nicht immer zwischen UF im Entwurfsmodus und Code hin und her springen muss, um zu schauen, wo der entsprechende Parameter eingestellt ist. Ist aber wahrscheinlich genauso eine philosophische Diskussion wie die "ungarische Notation". Ich persönlich versuche die Variablen möglichst sprechend zu gestalten und verwende deshalb möglichst immer deutsche Bezeichnungen, um es dem "Leser" im deutschen Umfeld einfacher zu machen, dem Code zu folgen?! Im internationalen Umfeld sind meine deutschen Deklarationen natürlich dann auch "für die Katz'". Wenn sich der erste englisch sprachige Fragensteller hier ins Forum verirrt, mache ich mir Gedanken über "meine Konventionen" :19:.
Soweit meine Feedback. Wenn etwas unklar ist, frag(t) bitte.
(08.12.2014, 03:59)atilla schrieb: Summa Summarum bin ich also auf Deine Problemstellung eingegangen. Aber wenn man Dich auf Fehler hinweist, was ich auch hier wieder getan habe, und Du mit:
Zitat:Mache ich morgen. Ich habe heute keinen Bock mehr
musst Du von Deinem Gegenüber auch nicht viel Bock erwarten.
So aus dem Kontext gelöst, klingt das wirklich sch... Du hast aber bestimmt übersehen, dass ich die Antwort erst gegen 23:00 Uhr verfasste. Als ich/Du zu der entsprechenden Textpassage kamst, war es bestimmt schon 23:30 Uhr. Nur deswegen das "heute habe ich keinen Bock mehr"... BTW: Kannst Du nachts nicht schlafen :19:? 02:59 Uhr eine Antwort!!!
Zu meiner oben erwähnten Tabellenlösung... Ich gebe das auf! Entweder ich bin zu blöd dazu, oder ich weiß es nicht (würde Michael Mittermeyer jetzt sagen)! Wie oben schon erwähnt, denke ich, wenn man sich an die Bedienung der UF erst einmal per TAB gewöhnt hat, ist das deutlich schneller als ein Tabelle. Vorausgesetzt die Steuerelemente werden in der richtigen Reihenfolge angesprungen.
(08.12.2014, 03:59)atilla schrieb: Trotzdem habe ich jetzt mal meinen Code getestet, und musste auch feststellen, dass der Filter so nicht funktioniert. Es ist aber nur eine Kleinigkeit, die korrigiert werden muss. Und zwar habe ich das Format so: "MMM YY" angegeben statt "MMM YYYY". Das hättest Du aber auch sehen können.
Das werde ich dann morgen testen. Bin aber noch skeptisch, dass es die einzige Ursache ist.
Das mit dem nicht sichtbaren Steuerelement kann ich nicht nachvollziehen. Ich habe die Datei von oben gerade geöffnet. Bei mir ist der Button "Übernehmen" sichtbar.
Ich breche hier einmal ab, da es bereits wieder spät geworden ist und ich wirklich todmüde bin. Ich werde mir Deine Kommentare morgen noch einmal anschauen und Dir entsprechendes Feedback geben.
Zitat:Das werde ich dann morgen testen. Bin aber noch skeptisch, dass es die einzige Ursache ist.
brauchst Du nicht. Ich kann im Nachhinein auch verstehen, warum ich gerade das "falsche" Format genommen habe. Ich habe nämlich das Format genommen, welches so in der Tabelle "Parameter" vorliegt. Du hast aber in der Datentabelle dann ein andres Format genommen.
Zitat:Das mit dem nicht sichtbaren Steuerelement kann ich nicht nachvollziehen.
Mag sein, dass es nicht an der von mir erwähnten Stelle nicht sichtbar ist. Aber nach bestimmten Aktionen verschwindet er und irgendwann wird dann trotzdem der Focus auf dieses Steuerelement gesetzt. Ich schreibe hier nichts an den Haaren herbeigezogenes. Frank hatte das ja auch schon moniert.
Die Inputboxen tauchen auch noch immer auf, obwohl alle Boxen ausgefüllt sind. Das passiert dann, wenn Daten gefiltert und in die Box eingelesen wurden. Wenn man dann die letzte Textbox ausgefüllt hat und verlässt, dann erscheinen die Inputboxen. Wenn dort auf Abbrechen geklickt wird, dann kommt der Debugger. Und wenn man beim Debugger auch auf Abbrechen klickt, dann stürzt Excel ab. Hab es jetzt gerade nachstellen können.
15.12.2014, 12:30 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2014, 12:42 von Max.)
Hallo Uwe, hallo Atilla,
so ich habe es nun endlich geschafft mich einmal in Ruhe mit Euren Anmerkungen auseinander zu setzen.
Ich fange einmal mit dem eigentlichen Problem dieses Threads an. Beim Filtern nach einem exakten Datum, scheint Excel ein wenig "begriffsstutzig" zu sein und man muss das Problem von hinten durch den Rücken ins Auge lösen. Zum einen muss das Datum im richtigen Format für die Filterung vorliegen und zum anderen greift das Kriterium nicht wenn man nach der naheliegensten Lösung greift (Kriterium = Datum). Ich habe das jetzt so gelöst.
Code:
Private Sub Autofilter1() Dim Datum1 As Date Dim Datum2 As Long
Range("A1").AutoFilter 'Alle Sätze, die gleich dem aktuellen Datum sind, werden angezeigt tblDatenbank.Range("A1:G1").AutoFilter Field:=1, Criteria1:=">=" & Datum2, Operator:=xlAnd, Criteria2:="<" & Datum2 + 1
End Sub
Die Änderungen von Uwe oben, habe ich übernommen. Was mir allerdings nicht gelingt, ist das Verhalten der ersten ComboBoxen so zu ändern, wie in Uwe's Upload, obwohl ich den Sytle ebenfalls auf "fmStyleDropDownList" gesetzt habe. Sprich bei Klick in die Box passiert bei mir nix. Das kannte ich übrigens noch nicht. Danke für den Tipp :28:!
Die von Atilla beschriebenen Probleme, habe ich ebenfalls alle reproduzieren können. Das Problem des nicht sichtbaren "Übernehmen" Buttons, hing am "After Update"-Ereignis der Textbox "Gewinn/Verlust". Natürlich ist nach Übernahme der Änderungen die komplette Prozedur durchgelaufen. Es galt also, ein Abbruchkriterium für diese Prozedur bei Änderung der vorhandenen Datensätze in der Listbox zu finden. Das war dann relativ einfach.
Code:
If .cmdÄnderungenÜbernehmen.Visible = True Then Exit Sub End If
Auch wenn es hier jetzt nur noch um "meinen sportlichen Ehrgeiz" geht, stelle ich die Datei noch einmal ein.