knibbli
Goto Top

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 0face-smile

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

Content-Key: 148075

Url: https://administrator.de/contentid/148075

Printed on: April 24, 2024 at 22:04 o'clock

Mitglied: 76109
76109 Aug 02, 2010 at 07:48:01 (UTC)
Goto Top
Hallo Knibbli!

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
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?face-wink

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
Member: Knibbli
Knibbli Aug 02, 2010 at 11:03:46 (UTC)
Goto Top
Hallo Dieter face-smile

Danke für deine Antwort,

Das mit dem

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 face-smile Die 4 bedeutet die Anzahl der Zeichen. richtig?

Das baue ich so ein.

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? face-plain ?

Habe gerade nur schnell Mittag daher baue ich dies erst heute Abend mal so ein und schaue was passiert.

Ich melde mich dann heute Abend wieder.

Lieben Dank erst mal für deine Mühe

LG

Knibbli
Mitglied: 76109
76109 Aug 02, 2010 at 13:54:52 (UTC)
Goto Top
Hallo Knibbli!

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 face-smile Die 4 bedeutet die Anzahl der Zeichen. richtig?
Richtig. Dachte ich mir, dass Du das gut findestface-smile
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? face-plain ?
Nö, dass hast Du völlig richtig verstandenface-wink
Lieben Dank erst mal für deine Mühe
Gern geschehen.

Gruß Dieter
Member: Knibbli
Knibbli Aug 02, 2010 at 17:50:54 (UTC)
Goto Top
So, Dieter .....

Bin wieder da face-smile Habe den Code von dir eingebaut und funktioniert super,


Nun zur Filterung 2 Variante?

Dieser Filterung

 If Left(WS.Name, 4) Like "Typ-" Then .AddItem WS.Name   

einzufügen bringt ja nun dann bestimmt nichts , face-sad ..... da es ja irgendwie auf die Filterung 1 Typ ankommt?


Hast du eine Idee ? Schritt für Schritt könnte ich es bestimmt verstehen face-smile *bettel bettel *


Hier noch mal der jetzige Code.


Lieb Grüß

Knibbli


Private Sub neuladen_Click()
    Typ_befüllen
    Variante_befüllen
    End Sub

Private Sub Typ_Change()
    Filtern
End Sub

Private Sub Variante_Change()
    Filtern
End Sub

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 = -1
    End With
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 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:P35").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) = "=IF(RC[-2]>0,R2C21,"""")"  
                            .Cells(zeile, 11) = "=IF(RC[-2]>0,INDEX('x2'!R5C3:R25C6,MATCH(RC[-1],'x2'!R5C3:R25C3,0),MATCH(RC[-2],'x2'!R5C3:R5C6,0)),"""")"  
                            .Cells(zeile, 12) = "=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, 13) = "=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, 14) = "=IF(OR(RC[-4]=0,RC[-4]=""""),"""",RC[-4]*R1C14)"  
                            .Cells(zeile, 15) = "0"  
                            .Cells(zeile, 16) = "=IF(RC[-1]>0,RC[-1]*RC[-8],"""")"  
                            zeile = zeile + 1
                        End If
Weiter:
                Next a
    End With
End Sub
Mitglied: 76109
76109 Aug 02, 2010 at 19:51:49 (UTC)
Goto Top
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:
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 Anmerkungface-wink
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 verstehenface-smile
Member: Knibbli
Knibbli Aug 02, 2010 at 22:04:28 (UTC)
Goto Top
Hallö Dieter face-smile

Manno, das ist ja Klasse.

Hätte ich geahnt, dass du heute Abend da schon wieder dran feilst
dann hätte ich mir ne Menge Tüftelarbeit gespart.

Hatte, mit Hilfe eines anderen Forums, noch ne Idee bekommen......

... musste damit aber den Umweg über Modul gehen, damit dann die anderen Sachen weiterhin funktionieren.

z.B. Public Sub Typ_befüllen() hatte ich dann über Modul angesrochen face-smile und dann im Blatt selbst die Typ_Change geschrieben.


Das hier, von dir, ist ja noch viel kürzer und klarer und passt ohne extra Modul meiner Click Buttons face-smile

Habe alles so eingebaut mit ein paar klitzkleinen Änderungen face-devilish Natürlich habe ich die Umlaute auch raus genommen.

Da habe ich im Stress gar nicht dran gedacht face-wink

Deine Private Sub Variante_Befuellen() habe ich so gändert, dass nur einmal der Wert Auswählbar ist, auch wenn dreifach in der Liste.
Falls ich da unnötig mehr im Code rein getan habe............. kannst mich bitte bitte korrigieren !


Option Explicit
Option Compare Text

Private Sub NeuLaden_Click()
    Variante.Clear
    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
    Dim i As Integer
    With Variante
       .Clear
        For Each a In Sheets(Typ.Text).Range("A4: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 With
End Sub


##9206cb| PS : Der Code im Filter funktioniert alles soweit wie ich getestet habe face-smile

Weiß nur nicht ob mans besser machen kann.

Ich denke um da leichter durchzusteigen kann ich dir besser gerne mal die Datei zukommen lassen da ich noch mehr Excelformeln in den VBA code integrieren muss face-big-smile ##

Bis dahin wünsche ich erst mal eine gute Nacht .....

##9206cb| und nochmals vielen Lieben Dank für deine Hilfe und deinen Anmerkungen damit ich die Codes besser verstehe und lernen kann. ##

Muss Morgen wieder zur Arbeit raus.

LG

Knibbli
Mitglied: 76109
76109 Aug 03, 2010 at 07:39:41 (UTC)
Goto Top
Hallo Knibbli!

Hoffe, Du hast noch genügend Schlaf gefundenface-smile

Jetzt verstehe ich die For-Schleife für AddItem. Stand ich wohl etwas auf dem Schlauchface-wink

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...
oder
If "Test String" Like "*String" Then...
oder
If "Ein Test String" Like "*Test*" Then...
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:
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 wiederface-wink

Gruß Dieter
Mitglied: 76109
76109 Aug 03, 2010 at 09:52:27 (UTC)
Goto Top
Hallo nochmal!

So, hier nochmal das Ganze mit umgebauter Filterfunktion (hoffe ohne Fehlerface-smile ):
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
wobei noch die Codezeile 74 durch diese zu ersetzen wäre:
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 Dirface-wink

Gruß Dieter
Member: Knibbli
Knibbli Aug 03, 2010 at 20:54:53 (UTC)
Goto Top
Hallöööööööööööö face-smile

Nun versuche ich dir zum dritten Mal zu antworten. Irgendwie klicke ich ständig ne falsche Taste und alles ist wieder weg face-sad

Nun aber ......

Nach so was wie "& Typ.Text & " hatte ich schon gesucht, da mir die Formel viel zu undynamisch war.
Bin bei der Auswahlliste nicht hinter gekommen, dass ich es auch in der Formel verwenden kann *schäm*

Das war nun das einzige was noch gepflegt hätte werden müssen, nachdem du schon die Auswahl mit Typ- dynamisiert hattest .

Irgendwie ist eigentlich nun alles nicht mehr so wie es war ........ sozusagen komplett neu.
Ist nun richtig übersichtlich, so dass man da auch wesentlich besser durchsteigt.
Das du so viel geholfen hast . Ich freu mich so und habe viel dazu gelernt als Anfänger face-kiss

Habe alles soweit eingebaut und nur meinen eigenen Fehler B2 auf B3 geändert.
Alles ausgetestet und geprüft.
Es klappt alles wunderbar und ich werde damit dann keine Arbeit mehr haben solange die Leute sich bei neuen Tabellenblättern, welche zusätzlich ausgewertet werden sollen, an " Typ-" halten !

Nun habe ich leider ein neues Problem mit meinem E-Mail -Versand den ich dort auch mit eingebaut habe. Dieser funktioniert eigentlich perfekt in Excel 2007 und in Excel 2010 (Beta).

Nur leider ........ bei Excel 2003 macht er es nicht.

Dafür werde ich aber lieber eine Neue Frage eröffnen und diesen Beitragsverlauf als überaus vollkommen Zufrieden gelöst markieren.

Ich drück Dich und ich kann gar nicht oft genug Danke sagen

LG

Knibbli, die heute Abend nicht solange macht face-wink


PS:
Zitat
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.
Zitat Ende

*Grins* ich als absoluter VBA Anfänger und
ohne Schulenglisch (übersetze mir alles beim rumtüfteln, was ich nicht kenne, mit Übersetzer)
habe noch gar keinen Programmierstil, daher kann ich auch noch keinen schlechten Programmierstil haben face-wink *
Mitglied: 76109
76109 Aug 03, 2010 at 22:02:04 (UTC)
Goto Top
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 soface-smile

Zitat von @Knibbli:

Ich drück Dich und ich kann gar nicht oft genug Danke sagen
Gern geschehen und Danke für's drücken, hat gut getanface-smile

Knibbli, die heute Abend nicht solange macht face-wink
Yepp, ich mach mich jetzt auch vom Ackerface-wink

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.
Member: Knibbli
Knibbli Aug 04, 2010 at 19:14:48 (UTC)
Goto Top
und noch mal Hallö Dieter

Danke des Lobes face-smile Aber ich schreibe ja sowas als Anfänger natürlich nicht selbst. face-devilish

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.

So habe ich z.B. meine Excelformeln schnell in VBA umgeschrieben bekommen face-smile Wobei ich nun von Dir gelernt habe wie es besser geht !

Wenn all dies dann nichts weiter bringt, dann frage ich nach, ... so wie hier.

Nur habe ich bisher noch nie so schnell dazu gelernt, wie bei deinen ausführlichen Antworten und guten Anmerkungen face-kiss

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.

Office 2007 hat mich dann ganz schön angenervt Anfangs, weil ich erst nix wieder gefunden habe. Der Mensch ist eben ein Gewohnheitstier face-monkey

Ende 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.

Ich denke, daher, dass ich gerne mal überall alles ausprobiere, weil ich wissen möchte wie es funktioniert was ich im 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.

grins* vorlesen darf ich die ganze englische EDV Sprache aber nicht *grins*


Nun 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*


LIeb Grüß

Knibbli
Mitglied: 76109
76109 Aug 04, 2010 at 21:34:34 (UTC)
Goto Top
Hallo Knibbli!

Zitat von @Knibbli:

Danke des Lobes face-smile Aber ich schreibe ja sowas als Anfänger natürlich nicht selbst. face-devilish
Ich schaue was es so gibt im WWW und versuche es dann entsprechend passend umzuschreiben.
Das machst Du aber sehr geschicktface-smile
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... face-smile ), oder bei Dingen, die ich auch noch nicht gemacht habe.
So habe ich z.B. meine Excelformeln schnell in VBA umgeschrieben bekommen face-smile Wobei ich nun von Dir gelernt habe wie es besser geht
Musst Du denn gleich alles veraten! Sollte doch ein Geheimnis bleiben face-smile

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 Langeweileface-wink

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...
Office 2007 hat mich dann ganz schön angenervt Anfangs, weil ich erst nix wieder gefunden habe. Der Mensch ist eben ein Gewohnheitstier face-monkey
Ich habe immer noch Office 2002, werde aber demnächst auf Excel 2010 umsteigen
Ende 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.
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.
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...face-smile
grins* vorlesen darf ich die ganze englische EDV Sprache aber nicht *grins*
Hast Du es schonmal versucht, vielleicht hilft es ja beim Einschlafenface-wink

Nun zu was anderen,

Ich traue mich gar nicht zu fragen.
Achgottele face-smile

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? face-wink

Gruß Dieter
Member: Knibbli
Knibbli Aug 05, 2010 at 10:32:46 (UTC)
Goto Top
Hallo Dieter face-smile

Ich antworte heute Abend ausführlicher.

Bei einer Listbox kann man mehr als 1 Eintrag auswählen wenn man in den Eigenschaften von Single auf Multi einstellt.


Wenn ich ihm im Standart der Listbox Single lasse liest er es auch aus, wenn ich 2 Werte aber auswähle dann funktioniert das ausfiltern aber nicht mehr.

If a Like Variante.Text Then

Die Filterfunktion müsste also alle angeklickten Werte zum Fitern benutzen. Jetzt geht es nur mit der Übergabe von einem Wert.

Ich steh da aufen Schlauch ....

LG

Knibbli
Mitglied: 76109
76109 Aug 05, 2010 at 11:14:55 (UTC)
Goto Top
Hallo Knibbli!

Aja stimmt. Das schiebe ich dann mal wieder auf Alzheimerface-wink

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 Tunface-wink

Gruß Dieter
Mitglied: 76109
76109 Aug 05, 2010 at 15:47:43 (UTC)
Goto Top
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.:
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 unklarface-sad

Gruß Dieter
Member: Knibbli
Knibbli Aug 05, 2010 at 17:44:13 (UTC)
Goto Top
Hallo Dieter face-smile

mmm Schade.

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 ?


Lieb Grüß

Knibbli
Mitglied: 76109
76109 Aug 05, 2010 at 19:23:47 (UTC)
Goto Top
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.face-wink

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 zumindestface-wink

Damit das funktioniert, habe ich mir einen Trick ausgedachtface-wink Aber in jedem Fall brauchst Du noch einen extra Button, um die Auswahl zu bestätigen und die Filter-Funktion zu starten.


Gruß Dieter