Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Makro Hilfe benötigt!
#1
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
Antworten Top
#2
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.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • Loeffelblock
Antworten Top
#3
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
[-] Folgende(r) 2 Nutzer sagen Danke an Kuwer für diesen Beitrag:
  • schauan, Loeffelblock
Antworten Top
#4
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! :)
Antworten Top
#5
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.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • Loeffelblock
Antworten Top
#6
(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
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • Loeffelblock
Antworten Top
#7
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 :)
Antworten Top
#8
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
[-] Folgende(r) 1 Nutzer sagt Danke an Werner.M für diesen Beitrag:
  • Loeffelblock
Antworten Top
#9
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...
Antworten Top
#10
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.
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!

Grüße aus Norderstedt, Peter
[-] Folgende(r) 1 Nutzer sagt Danke an Käpt'n Blaubär für diesen Beitrag:
  • Loeffelblock
Antworten Top


Gehe zu:


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