2016-04-25 91 views
0

Jedes Mal, wenn ich mein Makro (unten) ausführen, um nach einer Zeichenfolge zu suchen, die in mein Suchfeld eingegeben wird, erhalte ich einen Laufzeitfehler '1004'. AutoFilter-Methode der Range-Klasse ist fehlgeschlagen. Ich habe versucht, eine Weile nach einer Antwort auf dieses Problem zu suchen, aber nichts scheint mir eine Lösung zu bieten.VBA Laufzeitfehler '1004'. AutoFilter-Methode der Range-Klasse fehlgeschlagen

Wenn ich auf "Debug" klicke, wird der folgende Abschnitt des Codes hervorgehoben.

Ich weiß, dass dies nicht viel Info ist, aber jede Hilfe wäre sehr geschätzt.

P.S. Ich bin ein absoluter Neuling mit VBA und habe den Code von einer Website kopiert, die eine Schritt-für-Schritt-Anleitung zum Erstellen eines Suchfilters in Excel erstellt hat.

Sub SearchBox() 

Dim myButton As OptionButton 
Dim SearchString As String 
Dim ButtonName As String 
Dim sht As Worksheet 
Dim myField As Long 
Dim DataRange As Range 
Dim mySearch As Variant 

'Load Sheet into A Variable 
    Set sht = ActiveSheet 

'Unfilter Data (if necessary) 
    On Error Resume Next 
    sht.ShowAllData 
    On Error GoTo 0 

'Filtered Data Range (include column heading cells) 
    Set DataRange = sht.Range("A5:Z40000") 'Cell Range 
    'Set DataRange = sht.ListObjects("Table1").Range 'Table 

'Retrieve User's Search Input 
    mySearch = sht.Shapes("UserSearch").TextFrame.Characters.Text 'Control Form 
    'mySearch = sht.OLEObjects("UserSearch").Object.Text 'ActiveX Control 
    'mySearch = sht.Range("A1").Value 'Cell Input 

'Determine if user is searching for number or text 
    If IsNumeric(mySearch) = True Then 
    SearchString = "=" & mySearch 
    Else 
    SearchString = "=*" & mySearch & "*" 
    End If 

'Loop Through Option Buttons 
    For Each myButton In sht.OptionButtons 
    If myButton.Value = 1 Then 
     ButtonName = myButton.Text 
     Exit For 
    End If 
    Next myButton 

'Determine Filter Field 
    On Error GoTo HeadingNotFound 
    myField = Application.WorksheetFunction.Match(ButtonName, DataRange.Rows(1), 0) 
    On Error GoTo 0 

'Filter Data 
    DataRange.AutoFilter _ 
    Field:=myField, _ 
    Criteria1:=SearchString, _ 
    Operator:=xlAnd 

'Clear Search Field 
    sht.Shapes("UserSearch").TextFrame.Characters.Text = "" 'Control Form 
    'sht.OLEObjects("UserSearch").Object.Text = "" 'ActiveX Control 
    'sht.Range("A1").Value = "" 'Cell Input 

Exit Sub 

'ERROR HANDLERS 
HeadingNotFound: 
    MsgBox "The column heading [" & ButtonName & "] was not found in cells " & DataRange.Rows(1).Address & ". " & _ 
    vbNewLine & "Please check for possible typos.", vbCritical, "Header Name Not Found!" 

End Sub 
+0

Ist das Blatt geschützt? – Rory

+0

@Rory Ich habe das Arbeitsblatt nicht geschützt, aber es hat eine Verbindung zu SQL Server, wenn das einen Unterschied macht. – RH56

+0

Also ist das eine Tabelle dann? Wenn dies der Fall ist, sollten Sie das 'Listobject' und sein' Autofilter'-Objekt verwenden. – Rory

Antwort

0

Überprüfen Sie den Wert von myField, muss sie zwischen 1 und 26 sein, weil Ihr Bereich A -> Z.

+0

'myField' wird von' Application.WorksheetFunction.Match (ButtonName, DataRange.Rows (1), 0) 'so gesetzt, dass es nicht außerhalb dieses Bereichs liegen kann (dies würde einen Fehler verursachen, der direkt zum Beenden des Subs verwendet wird) ... –

Verwandte Themen