Clever-Excel-Forum

Normale Version: Makro Hilfe benötigt!
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo Leute,

bin neu hier und habe auch erst angefangen mit Excel Programmierung.
Kurze Erklärung zu meinem Ziel:
Aus Tabelle1 sollen aus einer Zeile 7 Strings ausgelesen werden, diese dann in Tabelle2 als Filter setzen
Anschließend soll aus Spalte C die Daten (bsp. 10 Zeilen mit verschiedenen Inhalten) kopiert werden und dann in Tabelle 3 eingefügt werden.

Problem: das was ich bis jetzt gemacht habe funktioniert nicht

Code:
Sub Char_einlesen()
'
' Char_einlesen Makro
'
' Tastenkombination: Strg+Umschalt+C
'

Dim filter_daten(6) As String
Dim Zeile As Integer
Dim Spalte As Integer
Dim x As Integer
Dim intI As Integer


Zeile = 2
Spalte = 3
x = 0

While Zeile <= 0

    Worksheets("Tabelle1").Activate
    
    While Spalte <= 9                               'hier werden die Filter gesetzt, insgesamt 7
        
        filter_daten(x) = Worksheets("Tabelle1").Cells(Zeile, Spalte).Value
        
        Filtern filter_daten(x), x
        
        Spalte = Spalte + 1
        x = x + 1
    Wend
    
    Worksheets("Tabelle2").Activate
    
    ActiveSheet.Range("C2:C" & ActiveSheet.UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible).Copy
    
    Worksheets("Tabelle3").Range(B2).Activate
    ActiveSheet.Paste

    With Worksheets("Tabelle1")
        For intI = 3 To 9
            Selection.AutoFilter Field:=intI
    Next
    End With
    
    Zeile = Zeile + 1
    Spalte = 3
    x = 0
    
Wend

End Sub

Sub Filtern(filter_eingabe As String, i As Integer)

Worksheets("Tabelle2").Activate

Select Case i

Case Is = 0
    If filter_eingabe <> "" Then
    Range("C2:C").AutoFilter Field:=3, Criteria1:=filter_eingabe
Case Is = 1
    If filter_eingabe <> "" Then
    Range("F2:F").AutoFilter Field:=6, Criteria1:=filter_eingabe
Case Is = 2
    If filter_eingabe <> "" Then
    Range("Q2:Q").AutoFilter Field:=17, Criteria1:=filter_eingabe
Case Is = 3
    If filter_eingabe <> "" Then
    Range("G2:G").AutoFilter Field:=7, Criteria1:=filter_eingabe
Case Is = 5
    If filter_eingabe <> "" Then
    Range("U2:U").AutoFilter Field:=21, Criteria1:=filter_eingabe
Case Is = 6
    If filter_eingabe <> "" Then
    Range("W2:W").AutoFilter Field:=23, Criteria1:=filter_eingabe

End Select

End Sub

Es wird mir keine Fehlermeldung ausgegeben außer das "Sub Char_einlesen()" in gelb oder rot hinterlegt wird,
und wenn man mit der Maus darauf klickt kommt: filter_daten(x) = "" oder Spalte = 0

Bitte um Hilfe
Hallöchen,

schaue mal in die Überprüfung, ob filter_daten(x) ein String ist. Du könntest auch eine weitere String-Variable programmieren
strX = filter_daten(x)
und dann strX an die Funktion übergeben.
Hallo,

ich würde erst einmal hier anfangen (unahängig von der Frage nach dem Sinn):
Zeile = 2
Spalte = 3
x = 0

While Zeile <= 0
Gruß Uwe
Danke erstmal!

Das mit dem 0 war schonmal ein Fehler. Weiß auch nicht was mich da geritten hat  Blush

Jetzt habe ich ein Laufzeitfehler:

Die Methode 'Range' für das Objekt '_Global' ist fehlgeschlagen

Dabei wird folgende Zeile markiert:
 Range("C2:C").AutoFilter Field:=3, Criteria1:=filter_eingabe

Ich Filtere doch da Spalte C? Wenn ich nur "C" habe, funktioniert das auch nicht.

Danke schonmal! :)
Hallöchen,

wenn Du die komplette Spalte C nehmen willst, dann z.B. mit Columns(3)
Wenn Du Range nimmst, dann entweder nach dem zweiten C eine ausreichend große Zahl nehmen oder mit Cells(rows.count,3).end(xlup).row die letzte belegte Zeilennummer hinzufügen.
(12.11.2017, 17:08)Loeffelblock schrieb: [ -> ]Jetzt habe ich ein Laufzeitfehler:

Die Methode 'Range' für das Objekt '_Global' ist fehlgeschlagen

Dabei wird folgende Zeile markiert:
 Range("C2:C").AutoFilter Field:=3, Criteria1:=filter_eingabe

Ich Filtere doch da Spalte C? Wenn ich nur "C" habe, funktioniert das auch nicht.

Wenn nur eine Spalte gefiltert wird, gibt es keinen .AutoFilter Field:=3 , denn das wäre die 3. Spalte des Autofilters. Wink

Du schriebst, dass Du mit Excelprogrammierung gerade anfängst. Dann schlage ich Dir vor, einfach anzufangen ohne irgendwelche "Optimierungen" mit ausgelagerten Subs/Functions und Schleifen, die Dir um die Ohren fliegen.
Zum Beispiel so:
Sub FilternTab2NachTab3()
 With Worksheets("Tabelle2").Range("A2:W2")
   .AutoFilter Field:=3, Criteria1:=Worksheets("Tabelle1").Range("C2").Value
   .AutoFilter Field:=6, Criteria1:=Worksheets("Tabelle1").Range("D2").Value
   .AutoFilter Field:=17, Criteria1:=Worksheets("Tabelle1").Range("E2").Value
   .AutoFilter Field:=7, Criteria1:=Worksheets("Tabelle1").Range("F2").Value
   .AutoFilter Field:=21, Criteria1:=Worksheets("Tabelle1").Range("G2").Value
   .AutoFilter Field:=23, Criteria1:=Worksheets("Tabelle1").Range("H2").Value
   .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy Worksheets("Tabelle3").Range(B2)
   .Parent.ShowAllData
 End With
End Sub
Gruß Uwe
Danke für eure Unterstützung!

Mit Schleifen kann ich eigentlich durch meine C Kenntnisse gut umgehen.
Mir fehlt noch ein bisschen das Verständnis für dem Aufbau von den Befehlen bei Excel.

Habe jetzt nach deiner Vorlage umgebaut und sieht ganz gut aus.

Folgende Probleme habe ich noch:

1.Es sollen die Filter nur gesetzt werden, wenn in der Zelle etwas steht. Wenn nichts drin ist, soll das nicht passieren.
Das würde ich mit einer if Anweisung realisieren, weiß aber nicht was dann als Bedingung da stehen muss.

2. Nach dem Filtern sollen die Werte aus Spalte E kopiert werden und dann im anderen Tabellenblatt eingefügt werden.
Da das komplette Makro über eine Schleife mehrmals Zeile für Zeile Filtern, kopieren, einfügen soll, habe ich das Problem, dass das Einfügen jedes mal unter dem schon eingefügten eingesetzt werden soll.
Hoffe das ist verständlich..
Wie krieg ich das hin?

Sehr freundliche Grüße :)
Hallo,

dann musst du bei jedem Schleifendurchlauf die letzte belegte Zelle in Spalte B von deinem Blatt 3 ermitteln und die Daten dann eine Zelle weiter unten einfügen.


Code:
'nicht vergessen die Variable loLetzte im Makrokopf
'zu Dim(ensionieren) Dim loLetzte As Long
With Worksheets("Tabelle3")
   loLetzte = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
End With
.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy Worksheets("Tabelle3").Cells(loLetzte, 2)


Gruß Werner
Guten Abend!

Also der Zähler funktioniert, danke.

Aber das kopieren von Spalte E (Ab E2) an und das einfügen funktionieren nicht.

Hier ist der Befehl dazu:
Worksheets("Tabelle2").Range("A2:X2").AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy Worksheets("Tabelle3").Cells(loLetzte, 2)

Was mach ich falsch? Was muss in das rotmarkiete?
Ich versteh leider nicht ganz was hinter dem Befehl steht...
Hallo,

Was Du willst, darfst Du mir gerne mal anschaulich erklären,
denn ich verstehe das wirklich aus Deiner jetzigen Beschreibung
nicht.

Wenn Du nur die Spalte E übertragen willst, warum gibst Du dann 
Worksheets("Tabelle2").Range("A2:X2"). ... an?
Da stimmt ja dann höchstens, daß E eine Teilmenge von A:X ist.

Es mag sein, daß ich was falsch verstanden habe. Formeln und ich
kämpfen nicht unbedingt auf der gleichen Seite. Aber drum frage ich
mal nach. Kann ja sein, daß ich danach wat schlauer bin.

Da Du ja Makrohilfe brauchst, jedenfalls schreibst Du das so für den Thread, würde ich
gerne den momentanen Stand erfahren. Möglichst mit einer aussagekräftigen Datei.
Seiten: 1 2