Vba - Excel - wenn in combobox 1 Auflistung der Namen Arbeitsblätter gefiltert wurde - dann Auswahl in Combobox 2 nur Filterauswahl der Spalte des gewählten Arbeitsblattes
Hallö,
hoffe auf Eure Hilfe 0
Komme einfach nicht weiter und finde hier und im Netz irgendwie nicht die passende Lösung.
Dazu muss ich sagen, dass ich ein absoluter Anfänger im VBA bin aber nun schon Tage hieran rum tüftle - lese - usw. :'(
Mit Excel selbst, kenne ich mich ganz gut aus......
Es geht mir allerdings nun darum, alles bisherige in einer Datei, was ich in Formeln geschrieben hatte, in VBA zu bekommen
da das Blatt "Auswertung" (automatisiert) - immer wieder aktualisiert - gelöscht und neu überschrieben werden muss
und dies so einfach wie möglich für den Anwender.
Die Datei selbst ist leider nicht besonders ordentlich aufgebaut und wird nicht verändert werden (außer Werte-Inhalte und neue Tabellenblätter),
daher muss ich mich an dem Gegebenen anpassen und daraus das Optimalste zum Auswerten rausholen.
Kann mir jemand sagen wie ich die Comboboxfilterung in VBA Variante so umschreibe,
dass nur das aufgelistet wird, was mit der Typfilterung die Spalte dieses Typ-Blatts ausgewählt wurde?
Anders, wie baut man im unteren VBA Code es so um, dass
wenn im Combobox 1 Auswahlfeld (Typ) z.B. Typ-2 gewählt wurde,
dann im Combobox 2 Auswahlfeld (Variante) nur dies als Auswahlliste zum Auswählen erscheint was im Blatt Typ-2 vorgegeben ist?
Falls die Datei benötigt wird stelle ich sie gerne zur Verfügung.
LG
Knibbli
hoffe auf Eure Hilfe 0
Komme einfach nicht weiter und finde hier und im Netz irgendwie nicht die passende Lösung.
Dazu muss ich sagen, dass ich ein absoluter Anfänger im VBA bin aber nun schon Tage hieran rum tüftle - lese - usw. :'(
Mit Excel selbst, kenne ich mich ganz gut aus......
Es geht mir allerdings nun darum, alles bisherige in einer Datei, was ich in Formeln geschrieben hatte, in VBA zu bekommen
da das Blatt "Auswertung" (automatisiert) - immer wieder aktualisiert - gelöscht und neu überschrieben werden muss
und dies so einfach wie möglich für den Anwender.
Die Datei selbst ist leider nicht besonders ordentlich aufgebaut und wird nicht verändert werden (außer Werte-Inhalte und neue Tabellenblätter),
daher muss ich mich an dem Gegebenen anpassen und daraus das Optimalste zum Auswerten rausholen.
Kann mir jemand sagen wie ich die Comboboxfilterung in VBA Variante so umschreibe,
dass nur das aufgelistet wird, was mit der Typfilterung die Spalte dieses Typ-Blatts ausgewählt wurde?
Anders, wie baut man im unteren VBA Code es so um, dass
wenn im Combobox 1 Auswahlfeld (Typ) z.B. Typ-2 gewählt wurde,
dann im Combobox 2 Auswahlfeld (Variante) nur dies als Auswahlliste zum Auswählen erscheint was im Blatt Typ-2 vorgegeben ist?
Falls die Datei benötigt wird stelle ich sie gerne zur Verfügung.
LG
Knibbli
Private Sub Variante_Change()
Filtern
End Sub
Private Sub Typ_Change()
Filtern
End Sub
Public Sub Variante_befüllen()
Dim a As Range
Dim i As Integer
Dim WS As Worksheet
With ThisWorkbook.Sheets("Auswertung").Variante
.Clear
For Each WS In ThisWorkbook.Worksheets
If WS.Name = "Typ-1" Or WS.Name = "Typ-2" Or WS.Name = "Typ-3" Or WS.Name = "Typ-4" Or WS.Name = "Typ-5" Then
For Each a In WS.Range("A3:A1000")
If a <> "" Then
For i = 0 To .ListCount - 1
If InStr(1, .List(i), a, 1) <> 0 Then GoTo Weiter
Next i
.AddItem a
End If
Weiter:
Next a
End If
Next WS
End With
End Sub
Public Sub Typ_befüllen()
Dim i As Integer
Dim WS As Worksheet
With ThisWorkbook.Sheets("Auswertung").Typ
.Clear
For Each WS In ThisWorkbook.Worksheets
If WS.Name = "Typ-1" Or WS.Name = "Typ-2" Or WS.Name = "Typ-3" Or WS.Name = "Typ-4" Or WS.Name = "Typ-5" Then
For i = 0 To .ListCount - 1
If InStr(1, .List(i), WS.Name, 1) <> 0 Then GoTo Weiter
Next i
.AddItem WS.Name
End If
Weiter:
Next WS
End With
End Sub
Public Sub Filtern()
Dim a As Range
Dim b As Range
Dim Typ As String
Dim zeile As Integer
Dim WS As Worksheet
zeile = 2
With ThisWorkbook.Sheets("Auswertung")
.Range("A2:J40").ClearContents
.Range("O2:O40").ClearContents
If .Variante = "" Or .Typ = "" Then Exit Sub
Typ = .Typ
Set WS = ThisWorkbook.Sheets(Typ)
For Each a In WS.Range("A3:A1000")
If a <> "" And InStr(1, .Variante, a, 1) <> 0 Then
For Each b In .Range("B2:B1000")
If b <> "" And InStr(1, b, a.Offset(0, 2), 1) <> 0 Then
.Cells(zeile - 1, 4) = .Cells(zeile - 1, 4) + a.Offset(0, 4)
.Cells(zeile - 1, 5) = .Cells(zeile - 1, 5) + a.Offset(0, 5)
GoTo Weiter
End If
Next b
.Cells(zeile, 1) = a.Offset(0, 27)
.Cells(zeile, 2) = a
.Cells(zeile, 3) = a.Offset(0, 1)
.Cells(zeile, 4) = a.Offset(0, 2)
.Cells(zeile, 5) = a.Offset(0, 3)
.Cells(zeile, 6) = a.Offset(0, 4)
.Cells(zeile, 7) = a.Offset(0, 5)
.Cells(zeile, 8) = a.Offset(0, 26)
.Cells(zeile, 9) = a.Offset(0, 6)
.Cells(zeile, 10) = Range("U2")
.Cells(zeile, 15) = "0"
zeile = zeile + 1
End If
Weiter:
Next a
End With
End Sub
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 148075
Url: https://administrator.de/contentid/148075
Ausgedruckt am: 26.11.2024 um 04:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo Knibbli!
Das ganze ist mir noch etwas unverständlich, von daher beginn ich mal mit der Routine von Typ befüllen:
Deine For-Schleife mit To .ListCount wird niemals durchlaufen, weil mit der Anweisung .Clear die Liste gelöscht und .ListCount auf -1 gesetzt wird.
In meinem Beispiel werden alle Tabellenblätter in die Liste aufgenommen, die mit "Typ-" beginnen. Hierbei ist allerdings noch unklar, ob die Einträge sortiert werden müssen. Das hängt davon ab, ob die Typ-Blätter der Reihe nach erstellt wurden oder nicht?
Ferner habe ich den ListIndex auf 0 gesetzt, was bedeutet, dass schon mal der erste Eintrag ausgewählt ist und somit auch die 2. ListBox mit einem Aufruf vorinitialisiert werden kann.
Gruß Dieter
Das ganze ist mir noch etwas unverständlich, von daher beginn ich mal mit der Routine von Typ befüllen:
Option Explicit
Option Compare Text
Public Sub Typ_befüllen()
Dim WS As Worksheet
With ThisWorkbook.Sheets("Auswertung").Typ
.Clear
For Each WS In ThisWorkbook.Worksheets
If Left(WS.Name, 4) Like "Typ-" Then .AddItem WS.Name
Next WS
.ListIndex = 0
End With
End Sub
In meinem Beispiel werden alle Tabellenblätter in die Liste aufgenommen, die mit "Typ-" beginnen. Hierbei ist allerdings noch unklar, ob die Einträge sortiert werden müssen. Das hängt davon ab, ob die Typ-Blätter der Reihe nach erstellt wurden oder nicht?
Ferner habe ich den ListIndex auf 0 gesetzt, was bedeutet, dass schon mal der erste Eintrag ausgewählt ist und somit auch die 2. ListBox mit einem Aufruf vorinitialisiert werden kann.
Gruß Dieter
Hallo Knibbli!
Gruß Dieter
Zitat von @Knibbli:
If Left(WS.Name, 4) Like "Typ-" Then .AddItem WS.Name
ist ne super Idee, somit werden dann auch die Tabellenblätter mit diesem Anfang im Tabellennamen eingelesen welche neu
hinzugefügt werden.
Das macht wesentlich weniger Codepflegearbeit Die 4 bedeutet die Anzahl der Zeichen. richtig?
Richtig. Dachte ich mir, dass Du das gut findestIf Left(WS.Name, 4) Like "Typ-" Then .AddItem WS.Name
ist ne super Idee, somit werden dann auch die Tabellenblätter mit diesem Anfang im Tabellennamen eingelesen welche neu
hinzugefügt werden.
Das macht wesentlich weniger Codepflegearbeit Die 4 bedeutet die Anzahl der Zeichen. richtig?
Der Listindex soll am Anfang leer sein, dafür habe ich eine Aktualisierung zusätzlich per Click eingebaut.
Dies weil verschiedene Leute daran arbeiten und wenn sich Veränderungen ergeben haben in den Auswahl Spalten der Listen
sollen sie gezwungen sein zuerst die Aktulisierung durchzuführen bevor sie auswerten können.
Oder habe ich das mit dem Listindex falsch verstanden? ?
Nö, dass hast Du völlig richtig verstandenDies weil verschiedene Leute daran arbeiten und wenn sich Veränderungen ergeben haben in den Auswahl Spalten der Listen
sollen sie gezwungen sein zuerst die Aktulisierung durchzuführen bevor sie auswerten können.
Oder habe ich das mit dem Listindex falsch verstanden? ?
Lieben Dank erst mal für deine Mühe
Gern geschehen.Gruß Dieter
Hallo Knibbli!
Die Routine "Variante" befüllen macht so keinen Sinn, da in der Typ-Box ja noch nix ausgewählt wurde.
Ich stelle mir den Ablauf in etwa so vor:
1. Mit "NeuLaden_Click, wird durch Aufruf der Routine "Typ_befuellen" die Typ-Box initialisiert und die Variante-Box mit Clear gelöscht und fertig.
2. Bei Auswahl eines Typ's in der TypBox, wird über die "Typ_Change"-Routine die Variante-Box initialisiert.
Das wäre zunächst meine Vorstellung vom Ablauf. Da, wie Du heute morgen geschrieben hast, die Typ-Box keine Vorauswahl haben soll (List.Index = 0), muss also beim initialisieren der Typ-Box (Neuladen) verhindert werden, dass die Variante-Box initialisiert wird.
Das sollte dann in etwa so funktionieren:
Noch als Anmerkung
Wenn Du die Steuerelemente anwählst, dann kannst Du das nur, wenn Du dich in dem Activen Sheet befindest, insofern benötigst Du kein ThisWorkbook und Sheet-Name. D.h. Du brauchst die Steuerelemente nur mit ihrem Namen anzusprechen. Ebenso machen Public-Anweisungen in Tabellenblatt-Codes keinen Sinn, da Du diese Funktionen nur innerhalb der aktuellen Codeseite verfügbar sind. Public geht nur in Modulen oder Klassenmodulen, wobei eine einfache "Sub Irgendwas" in einem Modul schon als Public in der aktuellen Arbeitsmappe verfügbar ist, allerdings sind Globale Variablen in Modulen nur mit der Public-Anweisung in der gesamten Arbeitsmappe verfügbar. Auch würde ich generell davon absehen, Umlaute in Codes (Funktionsnamen, Variablen...) zu verwenden.
Gruß Dieter
PS. Oweh Oweh... In der Zwischenzeit versuche ich mal die Filterfunktion zu verstehen
Die Routine "Variante" befüllen macht so keinen Sinn, da in der Typ-Box ja noch nix ausgewählt wurde.
Ich stelle mir den Ablauf in etwa so vor:
1. Mit "NeuLaden_Click, wird durch Aufruf der Routine "Typ_befuellen" die Typ-Box initialisiert und die Variante-Box mit Clear gelöscht und fertig.
2. Bei Auswahl eines Typ's in der TypBox, wird über die "Typ_Change"-Routine die Variante-Box initialisiert.
Das wäre zunächst meine Vorstellung vom Ablauf. Da, wie Du heute morgen geschrieben hast, die Typ-Box keine Vorauswahl haben soll (List.Index = 0), muss also beim initialisieren der Typ-Box (Neuladen) verhindert werden, dass die Variante-Box initialisiert wird.
Das sollte dann in etwa so funktionieren:
Option Explicit
Option Compare Text
Private Sub NeuLaden_Click()
Variante.Clear
Call Typ_Befuellen
End Sub
Private Sub Typ_Change()
If Typ.Text <> "" Then Call Variante_Befuellen
End Sub
Private Sub Variante_Change()
'Filtern
End Sub
Private Sub Typ_Befuellen()
Dim WS As Worksheet
With Typ
.Clear
For Each WS In ThisWorkbook.Worksheets
If Left(WS.Name, 4) Like "Typ-" Then .AddItem WS.Name
Next WS
.ListIndex = -1
End With
End Sub
Private Sub Variante_Befuellen()
Dim a As Range
With Variante
.Clear
For Each a In Sheets(Typ.Text).Range("A3:A1000")
If a <> "" Then .AddItem a
Next
.ListIndex = -1 'oder 1. Eintrag mit Index 0?
End With
End Sub
Noch als Anmerkung
Wenn Du die Steuerelemente anwählst, dann kannst Du das nur, wenn Du dich in dem Activen Sheet befindest, insofern benötigst Du kein ThisWorkbook und Sheet-Name. D.h. Du brauchst die Steuerelemente nur mit ihrem Namen anzusprechen. Ebenso machen Public-Anweisungen in Tabellenblatt-Codes keinen Sinn, da Du diese Funktionen nur innerhalb der aktuellen Codeseite verfügbar sind. Public geht nur in Modulen oder Klassenmodulen, wobei eine einfache "Sub Irgendwas" in einem Modul schon als Public in der aktuellen Arbeitsmappe verfügbar ist, allerdings sind Globale Variablen in Modulen nur mit der Public-Anweisung in der gesamten Arbeitsmappe verfügbar. Auch würde ich generell davon absehen, Umlaute in Codes (Funktionsnamen, Variablen...) zu verwenden.
Gruß Dieter
PS. Oweh Oweh... In der Zwischenzeit versuche ich mal die Filterfunktion zu verstehen
Hallo Knibbli!
Hoffe, Du hast noch genügend Schlaf gefunden
Jetzt verstehe ich die For-Schleife für AddItem. Stand ich wohl etwas auf dem Schlauch
Aber anstelle von InStr kannst Du auch den Like-Operator verwenden, wobei am Blattanfang die Option "Option Compare Text" stehen muss, wenn NICHT zwischen Klein/Groß-Schreibung unterschieden werden soll. Außerdem stehen Dir auch Wildcardszeichen zur Verfügung (siehe Like-Operator) z.B.:
oder
oder
usw.
Einige Leute sind der Meinung, dass Goto-Anweisungen von einem schlechten Programmierstil zeugen. Der Meinung schließe ich mich nicht an und finde die GoTo-Anweisung in diesem Fall als angebracht. Alternativ könnte man es auch so machen:
Noch ein Hinweis zu Formeln in Zellen schreiben. Das geht z.B. so:
Wenn ich mir die Filter-Funktion etwas genauer angesehen habe, dann melde ich mich wieder
Gruß Dieter
Hoffe, Du hast noch genügend Schlaf gefunden
Jetzt verstehe ich die For-Schleife für AddItem. Stand ich wohl etwas auf dem Schlauch
Aber anstelle von InStr kannst Du auch den Like-Operator verwenden, wobei am Blattanfang die Option "Option Compare Text" stehen muss, wenn NICHT zwischen Klein/Groß-Schreibung unterschieden werden soll. Außerdem stehen Dir auch Wildcardszeichen zur Verfügung (siehe Like-Operator) z.B.:
If "Test String" Like "Test*" Then... |
If "Test String" Like "*String" Then... |
If "Ein Test String" Like "*Test*" Then... |
Einige Leute sind der Meinung, dass Goto-Anweisungen von einem schlechten Programmierstil zeugen. Der Meinung schließe ich mich nicht an und finde die GoTo-Anweisung in diesem Fall als angebracht. Alternativ könnte man es auch so machen:
Private Sub Variante_Befuellen()
Dim a As Range, AddList As Boolean, i As Integer
With Variante
.Clear
For Each a In Sheets(Typ.Text).Range("A3:A1000")
If a <> "" Then
AddList = True
For i = 0 To .ListCount - 1
If .List(i) Like a Then AddList = False: Exit For
Next
If AddList Then .AddItem a
End If
Next
End With
End Sub
Noch ein Hinweis zu Formeln in Zellen schreiben. Das geht z.B. so:
Range("A1").Formula = "=IF(B1<>0,1,0)" |
Wenn ich mir die Filter-Funktion etwas genauer angesehen habe, dann melde ich mich wieder
Gruß Dieter
Hallo nochmal!
So, hier nochmal das Ganze mit umgebauter Filterfunktion (hoffe ohne Fehler ):
wobei noch die Codezeile 74 durch diese zu ersetzen wäre:
Ohne entsprechende Daten kann ich es nicht testen. Von daher überlasse ich das gerne Dir
Gruß Dieter
So, hier nochmal das Ganze mit umgebauter Filterfunktion (hoffe ohne Fehler ):
Option Explicit
Option Compare Text
Private Sub NeuLaden_Click()
Variante.Clear
Call Typ_Befuellen
End Sub
Private Sub Typ_Change()
If Typ.Text <> "" Then Call Variante_Befuellen
End Sub
Private Sub Variante_Change()
Range("A2:P35").ClearContents
If Variante.Text <> "" Then Call Filtern
End Sub
Private Sub Typ_Befuellen()
Dim WS As Worksheet
With Typ
.Clear
For Each WS In ThisWorkbook.Worksheets
If Left(WS.Name, 4) Like "Typ-" Then .AddItem WS.Name
Next WS
.ListIndex = -1
End With
End Sub
Private Sub Variante_Befuellen()
Dim a As Range, i As Integer
With Variante
.Clear
For Each a In Sheets(Typ.Text).Range("A3:A1000")
If a <> "" Then
For i = 0 To .ListCount - 1
If .List(i) Like a Then GoTo Weiter
Next i
.AddItem a
End If
Weiter:
Next a
End With
End Sub
Private Sub Filtern()
Dim a As Range
Dim b As Range
Dim i As Integer
Dim Zeile As Integer
Dim Spalten As Variant
Dim WS As Worksheet
Set WS = Sheets(Typ.Text)
Zeile = 2
Spalten = Array(27, 0, 1, 2, 3, 4, 5, 26, 6)
For Each a In WS.Range("A3:A1000")
If a Like Variante.Text Then
For Each b In Range("B2:B1000")
If b <> "" And b Like a.Offset(0, 2) Then
Cells(Zeile - 1, "D") = Cells(Zeile - 1, "D") + a.Offset(0, 4)
Cells(Zeile - 1, "E") = Cells(Zeile - 1, "E") + a.Offset(0, 5)
GoTo Weiter
End If
Next b
For i = 0 To UBound(Spalten): Cells(Zeile, i + 1) = a.Offset(0, Spalten(i)): Next 'Init Spalten A - I
Cells(Zeile, "J").Formula = "=IF(RC[-2]>0,R2C21,"""")"
Cells(Zeile, "K").Formula = "=IF(RC[-2]>0,INDEX('x2'!R5C3:R25C6,MATCH(RC[-1],'x2'!R5C3:R25C3,0),MATCH(RC[-2],'x2'!R5C3:R5C6,0)),"""")"
Cells(Zeile, "L").Formula = "=IF(RC[-2]="""","""",IF(RC[-11]=""Typ-1"",INDEX('Typ-1'!R2C2:R72C28,MATCH(RC[-9],'Typ-1'!R2C2:R72C2,0),MATCH(RC[-2],'Typ-1'!R2C2:R2C28,0)),IF(RC[-11]=""Typ-2"",INDEX('Typ-2'!R2C2:R78C[16],MATCH(RC[-9],'Typ-2'!R2C2:R78C2,0),MATCH(RC[-2],'Typ-2'!R2C2:R2C28,0)),IF(RC[-11]=""Typ-3"",INDEX('Typ-3'!R2C2:R102C[16],MATCH(RC[-9],'Typ-3'!R2C2:R102C2,0),MATCH(RC[-2],'Typ-3'!R2C2:R2C28,0)),IF(RC[-11]=""Typ-4"",INDEX('Typ-4'!R2C2:R102C[16],MATCH(RC[-9],'Typ-4'!R2C2:R102C2,0),MATCH(RC[-2],'Typ-4'!R2C2:R2C28,0)),IF(RC[-11]=""Typ-5"",INDEX('Typ-5'!R2C2:R104C[16],MATCH(RC[-9],'Typ-5'!R2C2:R104C2,0),MATCH(RC[-2],'Typ-5'!R2C2:R2C28,0)),""""))))))"
Cells(Zeile, "M").Formula = "=IF(RC[-3]="""","""",IF(AND(RC[-6]>0,RC[-1]>0),INDEX('x3'!R11C2:R40C23,MATCH((INDEX('x3'!R11C2:R40C2,MATCH(SMALL('x3'!R11C2:R40C2,COUNTIF('x3'!R11C2:R40C2,""<=""&RC[-6])),'x3'!R11C2:R40C2,0))),'x3'!R11C2:R40C2,0),MATCH(RC[-3],'x3'!R11C2:R11C23,0)),""""))"
Cells(Zeile, "N").Formula = "=IF(OR(RC[-4]=0,RC[-4]=""""),"""",RC[-4]*R1C14)"
Cells(Zeile, "O") = "0"
Cells(Zeile, "P").Formula = "=IF(RC[-1]>0,RC[-1]*RC[-8],"""")"
Zeile = Zeile + 1
End If
Weiter:
Next a
End Sub
Cells(Zeile, "L").Formula = "=IF(RC[-2]="""","""",INDEX('" & Typ.Text & "'!R2C2:R72C28,MATCH(RC[-9],'" & Typ.Text & "'!R2C2:R72C2,0),MATCH(RC[-2],'" & Typ.Text & "'!R2C2:R2C28,0)))"
Ohne entsprechende Daten kann ich es nicht testen. Von daher überlasse ich das gerne Dir
Gruß Dieter
Hallo Knibbli!
Also, für ne Anfängerin hast Du zum Thread-Begin aber schon einen sehr guten Code geschrieben. Syntaktisch gut und Stilformat wie ein Profi. Daran gibt es nix auszusetzen. Deine Formeln zeugen ebenfalls von entsprechendem Know How. Alles andere ist Routine und mit der Zeit wirst Du ein echter Profi, da bin ich mir sicher. Was mich auch beeindruckt hat, ist die Tatsache, dass Du alles was ich dazu beigetragen habe, auf Anhieb sehr gut verstanden und umgesetzt hast. Insofern weiter so
Gern geschehen und Danke für's drücken, hat gut getan
Knibbli, die heute Abend nicht solange macht
Yepp, ich mach mich jetzt auch vom Acker
LG Dieter
PS.
Also, für ne Anfängerin hast Du zum Thread-Begin aber schon einen sehr guten Code geschrieben. Syntaktisch gut und Stilformat wie ein Profi. Daran gibt es nix auszusetzen. Deine Formeln zeugen ebenfalls von entsprechendem Know How. Alles andere ist Routine und mit der Zeit wirst Du ein echter Profi, da bin ich mir sicher. Was mich auch beeindruckt hat, ist die Tatsache, dass Du alles was ich dazu beigetragen habe, auf Anhieb sehr gut verstanden und umgesetzt hast. Insofern weiter so
Gern geschehen und Danke für's drücken, hat gut getan
Knibbli, die heute Abend nicht solange macht
LG Dieter
PS.
Nun versuche ich dir zum dritten Mal zu antworten. Irgendwie klicke ich ständig ne falsche Taste und alles ist wieder weg
Das ist mir, wie den meisten auch schonmal passiert. Deshalb ist es ratsam, den Text erst in einem Text-Editor zu erstellen und dann in das Kommentarfeld zu kopieren.
Hallo Knibbli!
Wenn all dies dann nichts weiter bringt, dann frage ich nach, ... so wie hier.
Was für ein Glück, sonnst hätte ich ja Langeweile
Meine ersten Erfahrungen mit EDV war Anfang der 90iger, Da hat man noch unter DOS viel gemacht.
Bisher habe ich in Access (seit ca.1998) und (Excel seit ca. 1996) meine Auswertungen ohne VBA gemacht.
Na, dann besitzt Du doch schon ein gutes Basiswissen und musst es nur in VBA umsetzen.
Der Debugger im VBA-Editor ist ein sehr nützliches Werkzeug um Abläufe in Einzelschritten zu testen, Variablen einzusehen, Ausgaben in das DirektFenster zu schreiben z.B. zusammengesetzte Strings mit "Debug.Print "Text" & "Text".... Oder mal im Lokal-Fenster ein Range-Object ansehen z.B. "Set x = Range("A1")" und Klick auf die Variable x, dann siehst Du die ganze Datenstruktur, die so ein Range-Object beinhaltet. Ebenfalls eine gute Hilfe bietet ein Klick auf den Object-Katalog, in dem alle Funktionen und Konstanten aufgelistet werden und per Suchbegriff-Beispiele der einzelnen Funktionen angezeigt werden...
Nun zu was anderen,
Ich traue mich gar nicht zu fragen.
Achgottele
Aber..... wie würde der Code eigentlich aussehen wenn ich statt der zweiten Combobox (Variante) ein ListBox nehme, wo man
dann mehr als ein Wert auswählen kann zum filtern ?
Würde das funktionieren ? Habe heute schon getüftelt aber ich bekomme die Werte da dann nicht rausgefiltert
*schäm*
Das habe ich jetzt nicht ganz verstanden. Eine ListBox macht schon Sinn. Da kannst Du zwar mehrere Spalten anzeigen lassen, aber auswählen kannst Du da ebenfalls nur eine Zeile bzw. Eintrag oder ist mir da irgendwas entgangen?.
Also bitte etwas genauer erklären, so als wäre ich gerade mal 6 Jahre alt, vielleicht verstehe ich es dann?
Gruß Dieter
Zitat von @Knibbli:
Danke des Lobes Aber ich schreibe ja sowas als Anfänger natürlich nicht selbst.
Ich schaue was es so gibt im WWW und versuche es dann entsprechend passend umzuschreiben.
Das machst Du aber sehr geschicktDanke des Lobes Aber ich schreibe ja sowas als Anfänger natürlich nicht selbst.
Ich schaue was es so gibt im WWW und versuche es dann entsprechend passend umzuschreiben.
Einzelne Schritte, welche ich selbst nach langem tüfteln und nachlesen nicht hinbekomme, zeichne ich,wenn möglich, mit
Macro auf und nehme mir genau das Teilstück raus,
was ich brauche und setze es in die Stelle des aktiven Code wo es hin soll.
Das mach ich hin und wieder auch, wenn mir etwas gerade nicht einfällt (Alzheimer und so... ), oder bei Dingen, die ich auch noch nicht gemacht habe.Macro auf und nehme mir genau das Teilstück raus,
was ich brauche und setze es in die Stelle des aktiven Code wo es hin soll.
So habe ich z.B. meine Excelformeln schnell in VBA umgeschrieben bekommen Wobei ich nun von Dir gelernt habe wie es besser geht
Musst Du denn gleich alles veraten! Sollte doch ein Geheimnis bleiben Wenn all dies dann nichts weiter bringt, dann frage ich nach, ... so wie hier.
Meine ersten Erfahrungen mit EDV war Anfang der 90iger, Da hat man noch unter DOS viel gemacht.
Bisher habe ich in Access (seit ca.1998) und (Excel seit ca. 1996) meine Auswertungen ohne VBA gemacht.
Der Debugger im VBA-Editor ist ein sehr nützliches Werkzeug um Abläufe in Einzelschritten zu testen, Variablen einzusehen, Ausgaben in das DirektFenster zu schreiben z.B. zusammengesetzte Strings mit "Debug.Print "Text" & "Text".... Oder mal im Lokal-Fenster ein Range-Object ansehen z.B. "Set x = Range("A1")" und Klick auf die Variable x, dann siehst Du die ganze Datenstruktur, die so ein Range-Object beinhaltet. Ebenfalls eine gute Hilfe bietet ein Klick auf den Object-Katalog, in dem alle Funktionen und Konstanten aufgelistet werden und per Suchbegriff-Beispiele der einzelnen Funktionen angezeigt werden...
Office 2007 hat mich dann ganz schön angenervt Anfangs, weil ich erst nix wieder gefunden habe. Der Mensch ist eben ein Gewohnheitstier
Ich habe immer noch Office 2002, werde aber demnächst auf Excel 2010 umsteigenEnde der Neuziger und Anfang der 2000er habe ich mich viel mit HTML beschäftigt
und in dem Zusammenhang hier und da mal was mit Grafik, Java und Perl ausprobiert.
Dazu habe ich aber die letzten Jahre überhaupt keine Zeit mehr.
Siehste, von HTML habe ich ganz ganz wenig Ahnung, von HTA ein bisschen, von Java und Perl gar keine Ahnung.und in dem Zusammenhang hier und da mal was mit Grafik, Java und Perl ausprobiert.
Dazu habe ich aber die letzten Jahre überhaupt keine Zeit mehr.
Ich denke, daher, dass ich gerne mal überall alles ausprobiere, weil ich wissen möchte wie es funktioniert was ich im
Vordergrund benutze,
Ich habe damals zu DOS-Zeiten (vergessen wann das war, Alzheimer...) mit Borland 'C' angefangen und bin dann aber, weil ich die Runtime-Bibliothek Schei.e fand, auf Assembler umgestiegen und habe meine eigene Runtime-Bibliothek geschrieben. Dadurch habe ich sehr viel über den Ablauf im Hintergrund an der Quelle erfahren. Das ganze allerdings nur für den privaten Hausgebrauch. Funktionen faszinieren mich, von daher passt Excel und VBA ganz gut ins Schema. Mit VBA habe ich mehr oder weniger nur angefangen, weil ich ein gutes Programm für meine Depot-Verwaltung gesucht habe, aber keines der kommerziellen Programme meine persönliche Anforderungen zufriedenstellte. Anfangs hatte ich mir einen abgebrochen und stand als kurz vor einem Nervenzusammenbruch, aber dann - ab einem gewissen Zeitpunkt - liefs auf einmal und ich konnte all meine Ideen zu meiner vollsten Zufriedenheit umsetzen.Vordergrund benutze,
hat mich auch ohne "sprachliche" englischkenntnisse dazu gebracht
viele Zusammenhänge zwischen diesen Dingen oberflächlich zu erkennen und die EDV Sprache ein wenig besser für mich
selbst zu verstehen.
Das hat etwas mit Intelligenz zu tun, entweder man hat sie oder man hat sie nicht. Das kann man jedenfalls nicht lernen...viele Zusammenhänge zwischen diesen Dingen oberflächlich zu erkennen und die EDV Sprache ein wenig besser für mich
selbst zu verstehen.
grins* vorlesen darf ich die ganze englische EDV Sprache aber nicht *grins*
Hast Du es schonmal versucht, vielleicht hilft es ja beim EinschlafenNun zu was anderen,
Ich traue mich gar nicht zu fragen.
Aber..... wie würde der Code eigentlich aussehen wenn ich statt der zweiten Combobox (Variante) ein ListBox nehme, wo man
dann mehr als ein Wert auswählen kann zum filtern ?
Würde das funktionieren ? Habe heute schon getüftelt aber ich bekomme die Werte da dann nicht rausgefiltert
*schäm*
Also bitte etwas genauer erklären, so als wäre ich gerade mal 6 Jahre alt, vielleicht verstehe ich es dann?
Gruß Dieter
Hallo Knibbli!
Aja stimmt. Das schiebe ich dann mal wieder auf Alzheimer
Habe ich auch noch nicht gemacht und muß mir das selbst erstmal ansehen, was und wie die Auswahl ausgelesen wird....
Das kann aber etwas dauern, habe heute einiges zu Tun
Gruß Dieter
Aja stimmt. Das schiebe ich dann mal wieder auf Alzheimer
Habe ich auch noch nicht gemacht und muß mir das selbst erstmal ansehen, was und wie die Auswahl ausgelesen wird....
Das kann aber etwas dauern, habe heute einiges zu Tun
Gruß Dieter
Hallo Knibbli!
Also, ich habe mir die ListBox mit Mehrfachauswahl (MultiSelect) mal angesehen.
Du kannst zwar mehrere Einträge markieren/demarkieren, aber die Change-Routine wird für jedes markieren/demarkieren eines Eintrages einzeln aufgerufen. Dabei ist <ListBox.Value = Null> und <ListBox.Text = "">.
Dir bleibt daher nur die Möglichkeit, den ListIndex bei jedem Klick einzeln auszuwerten, wobei Du aber keine Möglichkeit hast, zu erkennen ob jetzt markiert/demarkiert wurde.
Den Auswahl-Text kannst Du nur per "List" und "ListIndex" auslesen z.B.:
Inwiefern Dir das bei der Filterfunktion nützlich sein soll, ist mir noch völlig unklar
Gruß Dieter
Also, ich habe mir die ListBox mit Mehrfachauswahl (MultiSelect) mal angesehen.
Du kannst zwar mehrere Einträge markieren/demarkieren, aber die Change-Routine wird für jedes markieren/demarkieren eines Eintrages einzeln aufgerufen. Dabei ist <ListBox.Value = Null> und <ListBox.Text = "">.
Dir bleibt daher nur die Möglichkeit, den ListIndex bei jedem Klick einzeln auszuwerten, wobei Du aber keine Möglichkeit hast, zu erkennen ob jetzt markiert/demarkiert wurde.
Den Auswahl-Text kannst Du nur per "List" und "ListIndex" auslesen z.B.:
Private Sub ListBox1_Change()
Dim Text As String
Text = ListBox1.List(ListIndex, 0) 'List(Zeile, Spalte)
End Sub
Inwiefern Dir das bei der Filterfunktion nützlich sein soll, ist mir noch völlig unklar
Gruß Dieter
Zitat von @Knibbli:
Die Listbox kann ich übrigens so einstellen, dass ich sehen kann was ich ausgewählt habe.
Sehen kann ich es auch, aber das ändert leider nix an der Tatsache, dass ich pro Klick nur einen Index bekomme.Die Listbox kann ich übrigens so einstellen, dass ich sehen kann was ich ausgewählt habe.
Der Sinn ist der, dass vom ausgewählten Typ zur gleichen Zeit verschiedene Variantenwerte ausgewertet werden sollen, aber
nicht alle.
Daher die erste Auswahl als ein Wert auswählbar und die zweite Auswahl als Multiauswahl.
Oder hast du eine andere Idee, wie man das hinbekommen kann ?
Yepp, genauso, wie Du das gerne hättest, wobei ich dann aber in der Variante-ListBox die <ListStyle = fmListStyleOption> mit <MultiSelect = fmMultiSelectMulti> - Variante wählen würde. CheckBoxen mit/ohne Häkchen machen sich irgendwie besser, finde ich zumindestnicht alle.
Daher die erste Auswahl als ein Wert auswählbar und die zweite Auswahl als Multiauswahl.
Oder hast du eine andere Idee, wie man das hinbekommen kann ?
Damit das funktioniert, habe ich mir einen Trick ausgedacht Aber in jedem Fall brauchst Du noch einen extra Button, um die Auswahl zu bestätigen und die Filter-Funktion zu starten.
Gruß Dieter