2016-05-13 98 views
1

我確信每個讀取標題的人都會說「哦不,不是」。但在發佈之前,我已經閱讀了大約7-8個類似標題的以前的問題,似乎沒有人能夠工作。因此,這是這筆交易:錯誤'1004':選擇範圍級失敗的方法

我的工作簿中使用Workbook_Open事件來顯示用戶窗體:

Sub Workbook_Open() 
    UserForm1.Show 
End Sub 

Userform1包括一個文本框和一個列表框。根據用戶在文本框中輸入的內容,動態地爲列表框填充數據。到目前爲止一切都好。

當用戶單擊列表框中的某個值時,我想要選擇一個特定的單元格。所以我用這個:

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 

但正如我之前許多人一樣,我不能讓Select正常工作,這給了代碼如標題錯誤。

我嘗試了幾件事情來使這個代碼工作。

- 已結束Application.GoTo,用它來代替Select,正如某人的建議。

- 已將ListBox1_Click事件的代碼移動到標準模塊內的子代碼中,並使用ListBox1_Click事件調用該子代碼。

- 嘗試首先按其他人的建議選擇工作表。

- 已結束Worksheets(1).Visible = True正如其他人所建議的。

- 先用AppActivate Application.Caption激活應用程序的主窗口。

-Tried滾動到所需的細胞,而不是選擇的:

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 

我也嘗試過其他不太重要的變化,但我堅持了下來。有趣的是,在使用Workbook_Open事件之前,我有UserForm1通過宏分配給工作表中的按鈕/形狀,然後一切正常。

有誰知道我會如何使Select工作在我的情況?

另一方面,很好理解Select會導致很多問題,所以我沒有卡住它。如果任何人有另一種方式來獲得相同的結果,我全部耳朵。

+3

我敢打賭,「細胞」是沒有什麼。 –

+0

是否已找到導致單元格成爲範圍的值。在麻煩的線上劃一個斷點,看看Cell是不是Nothing –

+0

'如果沒有單元沒有,那麼.Range(Cell,Cell.Offset(0,2))。Select else msgbox「找不到單元格值!結束如果' – Dave

回答

1

我能夠複製這個問題,首先我遵循你所描述的內容,製作一份清單並從中挑選出來,看看是否會滾動到視圖中,並且工作正常。

如果我關閉了表單,請更改活動工作表。然後使用您看到的錯誤消息運行失敗的表單。

嘗試了很多我發現的事情,如果它不是活動工作表(這是合乎邏輯的,用戶無法點擊他們正在查看的工作表上沒有的單元格)

以下Activate行應該修復它。

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

這麼簡單。非常感謝您的寶貴時間。工作完美。 – dimitris

0

正如@ScotCraner和shown in the sample code on MSDN所指出的那樣,您應該首先檢查在使用/顯示它之前是否發現了某些東西。

以下應工作得很好:

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 

請注意,您所使用UserForm1.ListBox1.Text不考慮UserForm1.ListBox1.MultiSelect

+0

非常感謝您的提示! 在這種情況下,我只是認爲我應該選擇一個確實存在於我的工作表中的值,看看它是否有效。 在任何情況下,最好在我的代碼中實現這個cheking。 – dimitris

相關問題