Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Autofilterprozedure endet in Fehlermeldung.

Betrifft: Autofilterprozedure endet in Fehlermeldung. von: Peter
Geschrieben am: 23.09.2014 15:41:05

Hallo,

ich verstehe nicht, warum dieser Code in der einen Datei funktioniert.
In der anderen (mit anderen Range angaben jedoch nicht. Aufbau der Filter ist der Gleiche)

Also in "Tabelle12" habe ich diesen Code gesetzt:

Public Sub Autofilter2()
  Range("A1:g1").AutoFilter
End Sub
In "Diese Arbeitsmappe ist dieser Code eingefügt:

Public Sub Autofilter5()

 Worksheets("Tabelle12").Range("e2:e7612").AutoFilter Field:=5, Criteria1:=">=" & Worksheets(" _
Tabelle16").Range("b1").Value, Operator:=xlAnd, Criteria2:="<=" & Worksheets("Tabelle16").Range("b2").Value
 Worksheets("Tabelle12").Range("f2:f7612").AutoFilter Field:=6, Criteria1:=">=" & Worksheets(" _
Tabelle16").Range("c1").Value, Operator:=xlAnd, Criteria2:="<=" & Worksheets("Tabelle16").Range("c2").Value
 
End Sub

In der "Tabelle12" sind die Daten, welche gefiltert werden sollen.

In der Tabelle 16 sind die Filterkriterien. Per Formel berechnet. Die Filterkriterien sind Zahlen.

Wie gesagt, in einer separaten Datei, wo ich den code ausprobiert habe, funktioniert es.

In der Datei, wo ich dies jedoch benötige, leider nicht.

Die Prozedure endet immer in folgender Meldung: Index ausserhalb des gültigen Bereichs.

Wonach muß ich suchen?

Grüße

Peter

  

Betrifft: AW: Autofilterprozedure endet in Fehlermeldung. von: fcs
Geschrieben am: 23.09.2014 16:08:35

Hallo Peter,

die Fehlermeldung deutet Richtung unterschiedliche Namen der Tabellenblätter im Code und auf den Registertabs.

Ansonsten würde ich den Code in die folgende Richtung trimmen.

Public Sub Autofilter5()
  Dim wksKrit As Worksheet
  
  Set wksKrit = Worksheets("Tabelle16")
  
  With Worksheets("Tabelle12")
    If .AutoFilterMode = False Then
      MsgBox "Bitte erst den Autofilter in Blatt """ & .Name & """ aktivieren!"
    Else
      With .AutoFilter.Range
        .AutoFilter Field:=5, Criteria1:=">=" & wksKrit.Range("b1").Value, _
            Operator:=xlAnd, Criteria2:="<=" & wksKrit.Range("b2").Value
        .AutoFilter Field:=6, Criteria1:=">=" & wksKrit.Range("c1").Value, _
            Operator:=xlAnd, Criteria2:="<=" & wksKrit.Range("c2").Value
      End With
    End If
  End With
End Sub
Gruß
Franz


  

Betrifft: AW: Autofilterprozedure endet in Fehlermeldung. von: Peter
Geschrieben am: 24.09.2014 14:29:39

Sauber hat funktioniert.

Ich mußte statt Tabelle 12 jedoch die genaue Bezeichnung des Tabellenblattes eintragen. Danach ging es:-)

Vielen Dank!!

Peter


  

Betrifft: AW: Autofilterprozedure endet in Fehlermeldung. von: Peter
Geschrieben am: 25.09.2014 09:46:17

Guten Morgen,

ich habe folgenden Code:

Sub MinCopy()

Range("A1").CurrentRegion _
.SpecialCells(xlCellTypeVisible).Copy _
Worksheets("fake").Range("A1")
End Sub
Dieser kopiert immer die sichtbaren gefilterten Zeilen in ein anderes Tabellenblatt.
Nun zwei Probleme:
1. Es wird immer der Filterkopf aus der ursprünglichen Tabelle mitkopiert. Das solle nicht sein. Es sollen nur alle sichtbaren Zeilen ab A2 kopiert werden.
Hatte schon im Code A1 mit A2 ersetzt. Hat jedoch nicht funktioniert.

2. Wenn ich mehrere Daten filter und kopiere, möchte ich, daß die neuen Zeilen unter die bereits kopierten Zeilen angefügt werden.
Heißt also, es muß die erste freie Zeile nach der letzten belegten Zeile gefunden werden und die neuen Daten sollen darunter angefügt werden.

Gibt es für Punkt 2 eine Struktur, wie man das grundsätzlich immer bauen/programmieren kann? Habe öfter das Problem und würde gern wissen, wie man die Code aufbaut.

Grüße

Peter


  

Betrifft: AW: Autofilterprozedure endet in Fehlermeldung. von: Peter
Geschrieben am: 25.09.2014 09:53:06

ok. so funktioniert schon mal das untereinander kopieren.
Jedoch wird es nicht ab Zeile 2 eingefügt sondern ab Zeile 8850 irgendwo am ende des Tabellenbblattes:-/

Sub MinCopy()

letztezeile = Sheets("Burgenlink Bd 5").UsedRange.SpecialCells(xlCellTypeLastCell).Row
letztezeileFake = Sheets("fake").UsedRange.SpecialCells(xlCellTypeLastCell).Row

Range("A2:H" & letztezeile).Copy _
Worksheets("fake").Range("A" & letztezeileFake + 1)
End Sub



  

Betrifft: AW: Autofilterprozedure endet in Fehlermeldung. von: Peter
Geschrieben am: 25.09.2014 10:51:49

ich möchte aus jedem TAbellenblatt dieses Makro auf den Reiter "Fake" anwenden können.

Der Code ist in einem Modul untergebracht.

Momentan wird das Makro abgebrochen und kehrt in den Debug Modus:-/

Sub Makro1()
'
' Makro1 Makro
'

'
With ActiveWorkbook

.Worksheets("fake").Range("2:2").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Delete Shift:=xlUp
Range("A2").Select

End With

End Sub



  

Betrifft: AW: Autofilterprozedure endet in Fehlermeldung. von: fcs
Geschrieben am: 25.09.2014 16:56:23

Hallo Peter,

du hast ja jetzt schon etliche Methoden zur Bestimmung der nächsten freien Zeile kennengelernt und auch deren unerwünschten Ergebnise.

Es gibt neben den beiden von dir schon mehr oder weniger erfolgreich angewendeten noch 2 andere gängige Methoden zur Bestimmung der letzten benutzten Zeile bzw. der nächsten freien Zeile. Welche geeignet ist bzw. verwendet werden muss hängt z.T. von den Daten in der Tabelle ab.

Dein Problem mit dem letzten Makro ist wahrschscheinlich, dass du Select auf ein Objekt versuchst, das nicht auf dem aktiveb Blatt ist.

Nachfolgenden die Makros/Functions.

Gruß
Franz

Sub aaTest()'Testmakro zur berechnung der letzten Zeile mit Daten
  Dim lngZeileN As Long
  lngZeileN = fncZeileNaechste1(Spalte:=2)
  MsgBox lngZeileN, , "fncZeileNaechste1"
  
  lngZeileN = fncZeileNaechste2
  MsgBox lngZeileN, , "fncZeileNaechste2"
  
  lngZeileN = fncZeileNaechste3
  MsgBox lngZeileN, , "fncZeileNaechste3"
  
  lngZeileN = fncZeileNaechste4
  MsgBox lngZeileN, , "fncZeileNaechste4"
  
End Sub

Sub MinCopy()
  Dim ZeileN As Long
  ZeileN = fncZeileNaechste3(wks:=Worksheets("fake"))
  ActiveSheet.AutoFilter.Range.Offset(1, 0).Copy _
    Worksheets("fake").Cells(ZeileN, 1)
'  ActiveSheet.AutoFilter.Range.Offset(1, 0) _
    .SpecialCells(xlCellTypeVisible).Copy _
    Worksheets("fake").Cells(ZeileN, 1)
End Sub


Public Function fncZeileNaechste1(Optional Spalte As Long = 1, Optional wks As Worksheet)
  'Zeile nach letzter Zeile mit Inhalt in der Spalte
  'Diese Function nur verwenden, wenn in der Spalte in jeder Zeile Werte eingetragen werdn.
  If wks Is Nothing Then Set wks = ActiveSheet
  With wks
    If IsEmpty(.Cells(.Rows.Count, Spalte)) Then
      fncZeileNaechste1 = .Cells(.Rows.Count, Spalte).End(xlUp).Row
      If fncZeileNaechste1 = 1 And IsEmpty(.Cells(1, Spalte)) Then
        fncZeileNaechste1 = 1
      Else
        fncZeileNaechste1 = fncZeileNaechste1 + 1
      End If
    Else
      fncZeileNaechste1 = 0
    End If
  End With
End Function

Public Function fncZeileNaechste2(Optional wks As Worksheet)
  'Zeile nach letzter Zeile mit Inhalt
  Dim Zelle As Range
  If wks Is Nothing Then Set wks = ActiveSheet
  With wks
    Set Zelle = .Cells.Find(what:="*", after:=.Cells(1, 1), LookIn:=xlFormulas, _
        lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious)
    If Zelle Is Nothing Then
      fncZeileNaechste2 = 1
    Else
      If Zelle.Row = .Rows.Count Then
        fncZeileNaechste2 = 0
      Else
        fncZeileNaechste2 = Zelle.Row + 1
      End If
    End If
  End With
End Function

Public Function fncZeileNaechste3(Optional wks As Worksheet)
  'Zeile nach letzter Zelle mit Inhalt ungleich ""
  Dim Zelle As Range
  If wks Is Nothing Then Set wks = ActiveSheet
  With wks
    Set Zelle = .Cells.Find(what:="*", after:=.Cells(1, 1), LookIn:=xlValues, _
        lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious)
    If Zelle Is Nothing Then
      fncZeileNaechste3 = 1
    Else
      If Zelle.Row = .Rows.Count Then
        fncZeileNaechste3 = 0
      Else
        fncZeileNaechste3 = Zelle.Row + 1
      End If
    End If
  End With
End Function

Public Function fncZeileNaechste4(Optional wks As Worksheet)
  'Zeile nach letzter benutzter Zeile (auch Zellen mit Formatierung gelten als benutzt)
  Dim Zeile As Long
  If wks Is Nothing Then Set wks = ActiveSheet
  With wks
    With .UsedRange
      Zeile = .Row + .Rows.Count - 1
    End With
    If Zeile = .Rows.Count Then
      Zeile = 0
    Else
      If Zeile = 1 And Application.WorksheetFunction.CountA(.Rows(1)) = 0 Then
        Zeile = 1
      Else
        Zeile = Zeile + 1
      End If
    End If
  End With
  fncZeileNaechste4 = Zeile
End Function