2016-05-13 20 views
1

タイトルを読み取るすべての人が「ああ、いや、もう一度」とは言えません。しかしこれを掲示する前に、私は同じようなタイトルで約7〜8の以前の質問を読んだことがあり、誰も働いていないようでした。だから、これは契約です:エラー '1004':Rangeクラスの選択メソッドが失敗しました

マイブックには、ユーザーフォームを表示する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仕事をすることができないと、このコードは、タイトルのようなエラーが発生しました。

このコードを動作させるためにいくつか試みました。

-Tried Application.GoToSelectの代わりにそれを使用します。

- ListBox1_Clickイベントのコードを標準モジュール内のサブに移動し、ListBox1_Clickイベントでこのサブを呼び出そうとしました。

- 最初にワークシートを選択しようとしました。

-Tried 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が何もないかどうかを確認してください。 –

+0

'セルが何もない場合.Range(Cell、Cell.Offset(0、2))。 End If' – 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と記載されているように、まず/表示する前に見つかったものがあるかどうか確認する必要があります。

次は完璧に動作するはずです:UserForm1.ListBox1.MultiSelectを考慮していないあなたがUserForm1.ListBox1.Textを使用していることを

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 

注意を。

+0

非常に良いチップをありがとう! この場合、私はちょうど私のシートにこれが動作するかどうかを確認するために存在していた値を選択すべきだと思った。 いずれにしても、私のコードでこの質問を実装する方が良いです。 – dimitris

関連する問題