2016-05-13 9 views
1

Ich bin sicher, dass jede Person, die den Titel liest, würde sagen "oh nein, nicht schon wieder". Aber bevor ich das hier gepostet habe, habe ich ungefähr 7-8 vorherige Fragen mit ähnlichem Titel gelesen und niemand schien zu funktionieren. Das ist also der Deal:Fehler '1004': Wählen Sie die Methode der Range-Klasse fehlgeschlagen

Meine Arbeitsmappe verwendet das Workbook_Open Ereignis ein Benutzerformular zeigen:

Sub Workbook_Open() 
    UserForm1.Show 
End Sub 

Userform1 enthält eine Textbox und ein Listenfeld. Die Listbox wird dynamisch mit Daten gefüllt, je nachdem, wie der Benutzer das Textfeld eingibt. Soweit alles in Ordnung.

Wenn ein Benutzer auf einen Wert in der Listbox klickt, möchte ich eine bestimmte Zelle auswählen. So habe ich dies:

Private Sub ListBox1_Click() 
    Dim Cell As Range 

    With ThisWorkbook.Worksheets(1) 
     Set Cell = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues) 
     .Range(Cell, Cell.Offset(0, 2)).Select 
    End With 
End Sub 

Aber wie viele andere vor mir, ich kann nicht Select richtig funktioniert und dieser Code gab einen Fehler wie den Titel.

Ich habe verschiedene Dinge ausprobiert, damit dieser Code funktioniert.

-Tried Application.GoTo, mit es statt Select, wie jemand vorgeschlagen.

-Tried, um den Code des ListBox1_Click Ereignisses zu einem Sub innerhalb eines Standardmoduls zu verschieben und dieses Sub mit dem ListBox1_Click Ereignis aufzurufen.

-Tried, um zuerst das Arbeitsblatt auszuwählen, wie andere vorgeschlagen haben.

-Tried Worksheets(1).Visible = True als jemand anderes vorgeschlagen.

-Tried, um das Hauptfenster der Anwendung zuerst mit AppActivate Application.Caption zu aktivieren.

-Tried auf die gewünschte Zelle zu bewegen, anstatt die Auswahl:

Private Sub ListBox1_Click() 
    Dim foundRow As Integer 

    With ThisWorkbook.Worksheets(1) 
     foundRow = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues).Row 
    End With 
    ActiveWindow.ScrollRow = foundRow - 1 
End Sub 

ich andere, weniger wichtige Änderungen auch versucht, aber ich bin mit ihm stecken. Die lustige Sache ist, dass vor der Verwendung der Workbook_Open Ereignis, ich hatte UserForm1 über ein Makro gezeigt, um eine Schaltfläche/Form im Arbeitsblatt zugewiesen und alles hat dann gut funktioniert.

Weiß jemand, wie ich in meinem Fall Select arbeiten werde?

Auf der anderen Seite ist es gut verstanden, dass Select eine große Anzahl von Problemen verursacht, so dass ich nicht fest damit bin. Wenn jemand einen anderen Weg hat, das gleiche Ergebnis zu erzielen, bin ich ganz Ohr.

+3

Ich wette, dass 'Cell' nichts ist. –

+0

Wurde der Wert gefunden, der dazu führt, dass die Zelle eine Reichweite hat. Setze einen Unterbrechungspunkt in die problematische Zeile und sieh nach, ob Zelle nichts ist –

+0

'Wenn keine Zelle nichts ist, dann .Range (Zelle, Zelle.Offset (0, 2)). Wähle sonst msgbox" Den Zellwert nicht gefunden! " Ende If' – Dave

Antwort

1

Ich war in der Lage, das Problem zu replizieren, zuerst folgte ich, was Sie beschrieben, machte eine Liste und wählte daraus aus, um zu sehen, ob in Sicht scrollen würde, und es hat funktioniert.

Wenn ich das Formular geschlossen habe, änderte das aktive Blatt. und führen Sie dann das Formular aus, das mit der Fehlermeldung, die Sie sehen, fehlschlug.

eine Reihe von Dingen versuchen, entdeckte ich, man kann nicht eine Zelle auswählen, wenn es nicht das aktive Blatt ist (was logisch ist, kann ein Benutzer nicht auf eine Zelle klicken, die nicht auf dem Blatt ist sie sehen)

Die folgende Activate Zeile sollte es beheben.

Private Sub ListBox1_Click() 
    Dim Cell As Range 

    With ThisWorkbook.Worksheets(1) 
     Set Cell = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues) 

     ThisWorkbook.Worksheets(1).Activate 

     .Range(Cell, Cell.Offset(0, 2)).Select 
    End With 
End Sub 
+0

so einfach wie das. Vielen Dank für Ihre Zeit. hat perfekt funktioniert. – dimitris

0

Wie von @ScotCraner und als shown in the sample code on MSDN angegeben, sollten Sie zuerst prüfen, ob etwas gefunden wurde, bevor Sie es verwenden/anzeigen.

Folgendes sollte einwandfrei funktionieren:

Private Sub ListBox1_Click() 

    Dim Cell As Range 
    Application.DisplayStatusBar = True 

    With ThisWorkbook.Worksheets(1) 
     Set Cell = .Range("C3", .Cells(.Rows.Count, 3).End(xlUp)).Find(UserForm1.ListBox1.Text, LookIn:=xlValues, LookAt:=xlWhole) 
     If Not Cell Is Nothing Then 
      Application.StatusBar = "Found " & UserForm1.ListBox1.Text 
      .Activate 
      .Range(Cell, Cell.Offset(0, 2)).Select 
     Else 
      Application.StatusBar = "Couldn't find " & UserForm1.ListBox1.Text 
     End If 
    End With 

End Sub 

Beachten Sie, dass Sie UserForm1.ListBox1.Text verwenden, die nicht UserForm1.ListBox1.MultiSelect betrachten ist.

+0

Vielen Dank für Ihren sehr treffenden Tipp! In diesem Fall dachte ich nur, ich sollte einen Wert wählen, der sicher in meinem Blatt existierte, um zu sehen, ob das funktioniert. In jedem Fall ist es besser, dieses Cheking in meinem Code zu implementieren. – dimitris

Verwandte Themen