[[20090819130234]] 『コマンドボタンでファイルを探しにいくには』(そい) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『コマンドボタンでファイルを探しにいくには』(そい)

すみません。
どなたか助けてください。
コマンドボタンを押下すると指定したエクセルファイルを探しにいくマクロを書いてます。
判らないのが、現在のマクロだと現在ファイルを置いてある場所(一箇所)しか探しにいってくれません。
あるフォルダ以下に存在する複数のフォルダに該当のエクセルファイルがあるか探しにいくマクロをどなたかご教示いただけませんでしょうか。
時間に余裕のあるときで結構ですので、どうぞよろしくお願いいたします。
直接書き換えて頂けるとたすかります。

Private Sub CommandButton1_Click()

 With ComboBox2
     If .ListIndex > -1 Then _
         Workbooks.Open (ThisWorkbook.Path & "\" & .Value & ".xls")
 End With
 End Sub

 こんにちは。
 HeropaさんのHPに≪ドライブ内のどこかにあるファイルを検索しようと思ったときに使えそうなAPI≫
 というのが紹介されています。(API です)
http://www31.ocn.ne.jp/~heropa/vb24.htm
 これを借用してみました。

 Option Explicit
 '------------------------------------------------------------ UserFormの宣言部に 以下を宣言してください。
 ' RootPath          : 検索を開始する基準のディレクトリ
 ' InputPathName     : 検索するファイル名
 ' OutputPathBuffer  : 見つかったファイル名を格納するバッファ。
 ' 戻り値            : 見つかると0以外を返す。
 Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
    (ByVal RootPath As String, _
     ByVal InputPathName As String, _
     ByVal OutputPathBuffer As String) As Long

 '----------------------------------- 以下のように変更
 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String   '検索を開始するRootフォルダ  (時間はかかるが ドライブ(D:\)などでもよい )
    Dim myFind As String
    Dim myBook As String * 513
    If ComboBox2.ListIndex > -1 Then
        myRootPath = ThisWorkbook.Path & "\"
        myFind = ComboBox2.Value & ".xls"
        ok = SearchTreeForFile(myRootPath, myFind, myBook)
        If ok Then
            myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
            Workbooks.Open myFind
        Else
            MsgBox "見つかりませんでした"
        End If
    End If
 End Sub

   (kanabun)


早速のご回答ありがとうございます。
ただ、素人で大変もうしわけないのですが、
宣言部には具体的にどのように宣言すればよいのでしょうか?

上手くいきません。
すみませんがよろしくおねがいします。


Option Explicit

    Private Sub ComboBox1_Change()
        ' ComboBox1 が変化した時の処理
        Dim si As Integer
        With UserForm1
            .ComboBox2.Text = ""
            si = .ComboBox1.ListIndex   ' ComboBox1 の何番目が選択されたかを得る
            Select Case si
                Case 0
                    ' 0番が選択されていたらComboBox2 の内容をC列から作成する
                    .ComboBox2.RowSource = "Sheet3!C2:C73"
                Case 1
                    ' 1番が選択されていたらComboBox2 の内容をD列から作成する
                    .ComboBox2.RowSource = "Sheet3!E2:E73"
                Case 2
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!G2:G73"
                Case 3
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!I2:I73"
                Case 4
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!K2:K73"
                Case 5
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!M2:M73"
                Case 6
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!O2:O73"
                Case 7
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!Q2:Q73"
                Case 8
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!S2:S73"
                Case 9
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!U2:U73"
                Case 10
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!W2:W73"
                Case 11
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!Y2:Y73"
                Case 12
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AA2:AA73"
                Case 13
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AC2:AC73"
                Case 14
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AE2:AE73"
                Case 15
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AG2:AG73"
                Case 16
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AI2:AI73"
                Case 17
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AK2:AK73"
                Case 18
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AM2:AM73"
                Case 19
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AO2:AO73"
                Case 20
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AQ2:AQ73"
                Case 21
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AS2:AS73"
                Case 22
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AU2:AU73"
                Case 23
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AW2:AW73"
                Case 24
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!AY2:AY73"
                Case 25
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BA2:BA73"
                Case 26
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BC2:BC73"
                Case 27
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BE2:BE73"
                Case 28
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BG2:BG73"
                Case 29
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BI2:BI73"
                Case 30
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BK2:BK73"
                Case 31
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BM2:BM73"
                Case 32
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BO2:BO73"
                Case 33
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BQ2:BQ73"
                Case 34
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BS2:BS73"
                Case 35
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BU2:BU73"
                Case 36
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BW2:BW73"
                Case 37
                    ' 2番が選択されていたらComboBox2 の内容をE列から作成する
                    .ComboBox2.RowSource = "Sheet3!BY2:BY73"

            End Select
        End With
    End Sub

 Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
    (ByVal RootPath As String, _
     ByVal InputPathName As String, _
     ByVal OutputPathBuffer As String) As Long

 '----------------------------------- 以下のように変更
 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String   '検索を開始するRootフォルダ  (時間はかかるが ドライブ(D:\)などでもよい )
    Dim myFind As String
    Dim myBook As String * 513
    If ComboBox2.ListIndex > -1 Then
        myRootPath = ThisWorkbook.Path & "\"
        myFind = ComboBox2.Value & ".xls"
        ok = SearchTreeForFile(myRootPath, myFind, myBook)
        If ok Then
            myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
            Workbooks.Open myFind
        Else
            MsgBox "見つかりませんでした"
        End If
    End If
 End Sub

Private Sub UserForm_Initialize()

    With ComboBox2
       .RowSource = "sheet3!A1:A97"
       End With
 End Sub

 Private Sub UserForm_Activate()
        ' ComboBox がアクティブの時の処理
        With UserForm1
            .ComboBox1.RowSource = "Sheet3!A2:A73"
            .ComboBox2.RowSource = "Sheet3!C2:C73"
        End With
    End Sub

このように書いているのですが、うまくいきません。
どうしたらよいでしょうか。
すみませんが宜しくお願いします。


 あ、
 Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
    (ByVal RootPath As String, _
     ByVal InputPathName As String, _
     ByVal OutputPathBuffer As String) As Long

 の部分を、

  Option Explicit
  のすぐ下に移動してください。

  Option Explicit
   ↑
   この間が 宣言部 です
   ↓
  Private Sub ComboBox1_Change()

  (kanabun)


 それと、本題とは全く関係ないことですが、

 > Private Sub ComboBox1_Change()
 のなが〜いSelect Case文ですが、
 そこ
          si = .ComboBox1.ListIndex   ' ComboBox1 の何番目が選択されたかを得る
          Select Case si
            Case 0 To 37
                ' si番アイテムが選択されていたら ComboBox2 の内容を[C2:C73]からOffset( ,si) した範囲とする
                .ComboBox2.RowSource = _
                   Worksheets("Sheet3").Range("C2:C73").Offset(, si).Address(External:=True)
         End Select

 のようにまとめれないでしょうか?

  (kanabun)


ありがとうございます。
早速試してみます。

また結果ご報告させていただきます。


 すみません。よく見てませんでした。
 Offsetは
          ' si番アイテムが選択されていたら ComboBox2 の内容を[C2:C73]からOffset( ,si*2) した範囲とする
          .ComboBox2.RowSource = _
                   Worksheets("Sheet3").Range("C2:C73").Offset(, si*2).Address(External:=True)

  が正解のようですね。

  (kanabun) 
            ↑ 2009-08-05 20:15 再訂正しました m(__)m


Option Explicit
Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
    (ByVal RootPath As String, _
     ByVal InputPathName As String, _
     ByVal OutputPathBuffer As String) As Long

    Private Sub ComboBox1_Change()
        ' ComboBox1 が変化した時の処理
        Dim si As Integer
        With UserForm1
            .ComboBox2.Text = ""
             si = .ComboBox1.ListIndex   ' ComboBox1 の何番目が選択されたかを得る
          Select Case si
            Case 0 To 37
                ' si番アイテムが選択されていたら ComboBox2 の内容を[C2:C73]からOffset( ,si) した範囲とする
                .ComboBox2.RowSource = _
                   Worksheets("Sheet3").Range("C2:C73").Offset(, si).Address(External:=True)
            End Select
        End With
    End Sub

Private Sub ComboBox2_Change()

End Sub

 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String   '検索を開始するRootフォルダ  (時間はかかるが ドライブ(D:\)などでもよい )
    Dim myFind As String
    Dim myBook As String * 513
    If ComboBox2.ListIndex > -1 Then
        myRootPath = ThisWorkbook.Path & "\"
        myFind = ComboBox2.Value & ".xls"
        ok = SearchTreeForFile(myRootPath, myFind, myBook)
        If ok Then
            myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
            Workbooks.Open myFind
        Else
            MsgBox "見つかりませんでした"
        End If
    End If
 End Sub
Private Sub UserForm_Initialize()
    With ComboBox2
       .RowSource = "sheet3!A1:A97"
       End With
 End Sub
 Private Sub UserForm_Activate()
        ' ComboBox がアクティブの時の処理
        With UserForm1
            .ComboBox1.RowSource = "Sheet3!A2:A73"
            .ComboBox2.RowSource = "Sheet3!C2:C73"
        End With
    End Sub
 With ComboBox2
     If .ListIndex > -1 Then _
         Workbooks.Open (ThisWorkbook.Path & "\" & .Value & ".xls")
 End With
 End Sub
Private Sub UserForm_Initialize()
    With ComboBox2
       .RowSource = "sheet3!A1:A97"
       End With
 End Sub
 Private Sub UserForm_Activate()
        ' ComboBox がアクティブの時の処理
        With UserForm1
            .ComboBox1.RowSource = "Sheet3!A2:A73"
            .ComboBox2.RowSource = "Sheet3!C2:C73"
        End With
    End Sub

経過報告です。
ここまで出来たのですが、エラーになってしまいます。
エラーの理由は
Private Sub UserForm_Initialize()

名前が適切ではありません
となってしまいます。

適切ではないとはどこをどうすればなおるのでしょうか。
すみませんがご教示願います



 > Private Sub UserForm_Initialize() ↓ 名前が適切ではありませんとなってしまいます

 なんか、インデントが崩れていてよく見えないけれど、
 提示のUserFormのコード 
Private Sub UserForm_Initialize()
 が、2か所にないですか?
 どちらか一方は削除してください。

 > Private Sub UserForm_Activate()
 も同様に、2か所ありませんか?

 あと、◆を付けた部分は End Sub のあとにいきなりコードが書いてあるけれど、
 ここも構文エラーになると思います。

 Private Sub UserForm_Initialize()
    With ComboBox2
       .RowSource = "sheet3!A1:A97"
       End With
 End Sub
 Private Sub UserForm_Activate()
        ' ComboBox がアクティブの時の処理
        With UserForm1
            .ComboBox1.RowSource = "Sheet3!A2:A73"
            .ComboBox2.RowSource = "Sheet3!C2:C73"
        End With
 End Sub
 ◆   With ComboBox2
 ◆       If .ListIndex > -1 Then _
 ◆           Workbooks.Open (ThisWorkbook.Path & "\" & .Value & ".xls")
 ◆   End With
 ◆End Sub
Private Sub UserForm_Initialize()
    With ComboBox2
       .RowSource = "sheet3!A1:A97"
    End With
End Sub
 Private Sub UserForm_Activate()
        ' ComboBox がアクティブの時の処理
        With UserForm1
            .ComboBox1.RowSource = "Sheet3!A2:A73"
            .ComboBox2.RowSource = "Sheet3!C2:C73"
        End With
 End Sub

   (kanabun) すみません。レスを見過ごしていました。 2009-08-08 23:35

  .ComboBox2.RowSource = _
                   Worksheets("Sheet3").Range("C2:C73").Offset(, si*2).Address(External:=True)


 あと、
 プロシージャの順番は ABC順でもいいけど、
 処理順のほうが分かりやすいと思います。
  (内容は吟味してませんので あしからず)
 '----------------------------------------------------------------
 Option Explicit
 Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
      (ByVal RootPath As String, _
       ByVal InputPathName As String, _
       ByVal OutputPathBuffer As String) As Long

 Private Sub UserForm_Initialize()
    ComboBox2.RowSource = "sheet3!A1:A97"
 End Sub

 Private Sub UserForm_Activate()
        ' ComboBox がアクティブの時の処理
    ComboBox1.RowSource = "Sheet3!A2:A73"
    ComboBox2.RowSource = "Sheet3!C2:C73"
 End Sub

 ' ComboBox1 が変化した時の処理
 Private Sub ComboBox1_Change()
    Dim si As Integer
    si = .ComboBox1.ListIndex   ' ComboBox1 の何番目が選択されたかを得る
    Select Case si
      Case 0 To 37
          ' si番アイテムが選択されていたら ComboBox2 の内容を[C2:C73]からOffset( ,si*2) した範囲とする
          With ComboBox2
              .Clear
              .RowSource = _
                 Worksheets("Sheet3").Range("C2:C73").Offset(, si * 2).Address(External:=True)
          End With
    End Select
 End Sub

 'ComboBox2でリストのどれかのアイテムが選択された時の処理
 '選択されるたびに BookをOpenできないので、↓の記述 コメント化する
 ' Private Sub ComboBox2_Change()
 '    With ComboBox2
 '        If .ListIndex > -1 Then _
 '            Workbooks.Open ThisWorkbook.Path & "\" & .Value & ".xls"
 '    End With
 ' End Sub

 'ボタンが押されたら、ComboBox2の値で このマクロが書いてあるBookのフォルダ内をサブフォルダも含めて検索する
 '見つかれば そのBookを Openする
 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String   '検索を開始するRootフォルダ  (時間はかかるが ドライブ(D:\)などでもよい )
    Dim myFind As String
    Dim myBook As String * 513
    If ComboBox2.ListIndex > -1 Then
        myRootPath = ThisWorkbook.Path & "\"
        myFind = ComboBox2.Value & ".xls"
        ok = SearchTreeForFile(myRootPath, myFind, myBook)
        If ok Then
            myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
            Workbooks.Open myFind
        Else
            MsgBox "見つかりませんでした"
        End If
    End If
 End Sub

   (kanabun)


大変助かりました!
無事たどり着くことができました。ありがとうございます。
最後にもう一つだけ質問させてください。

   A      B       C
1 0254  ファイル名1
2 0546  ファイル名2
3 7831  ファイル名3
4 7652  ファイル名4
5 4655  ファイル名5

いま現在、B列のファイル名に合致する場合のみ、エクセルファイルを自動的に開くマクロになっています。

上記方法プラス下記の検索方法も追加できるでしょうか?
A列にある数字をList Boxに入力し、 Private Sub CommandButton1_Click()をクリックすると、
そのA列の数字に対応するBのエクセルファイルの名前に合致するファイルを自動的に開く方法をです。
Private Sub CommandButton1_Click()の構文はどうなりますでしょうか?

 'ボタンが押されたら、ComboBox2の値で このマクロが書いてあるBookのフォルダ内をサブフォルダも含めて検索する
 '見つかれば そのBookを Openする
 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String   '検索を開始するRootフォルダ  (時間はかかるが ドライブ(D:\)などでもよい )
    Dim myFind As String
    Dim myBook As String * 513
    If ComboBox2.ListIndex > -1 Then
        myRootPath = ThisWorkbook.Path & "\"
        myFind = ComboBox2.Value & ".xls"
        ok = SearchTreeForFile(myRootPath, myFind, myBook)
        If ok Then
            myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
            Workbooks.Open myFind
        Else
            MsgBox "見つかりませんでした"
        End If
    End If
 End Sub

kanabunさん宜しくお願いします。


 大変助かりました!
 無事たどり着くことができました。ありがとうございます。
 最後にもう一つだけ質問させてください。

    A      B       C
 1 0254  ファイル名1
 2 0546  ファイル名2
 3 7831  ファイル名3
 4 7652  ファイル名4
 5 4655  ファイル名5

 いま現在、B列のファイル名に合致する場合のみ、エクセルファイルを自動的に開くマクロになっています。

 上記方法プラス下記の検索方法も追加できるでしょうか?
 A列にある数字をList Boxに入力し、 Private Sub CommandButton1_Click()をクリックすると、
 そのA列の数字に対応するBのエクセルファイルの名前に合致するファイルを自動的に開く方法をです。
 Private Sub CommandButton1_Click()の構文はどうなりますでしょうか?

 'ボタンが押されたら、ComboBox2の値で このマクロが書いてあるBookのフォルダ内をサブフォルダも含めて検索する
 '見つかれば そのBookを Openする
 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String   '検索を開始するRootフォルダ  (時間はかかるが ドライブ(D:\)などでもよい )
    Dim myFind As String
    Dim myBook As String * 513
    If ComboBox2.ListIndex > -1 Then
        myRootPath = ThisWorkbook.Path & "\"
        myFind = ComboBox2.Value & ".xls"
        ok = SearchTreeForFile(myRootPath, myFind, myBook)
        If ok Then
            myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
            Workbooks.Open myFind
        Else
            MsgBox "見つかりませんでした"
        End If
    End If
 End Sub

 kanabunさん宜しくお願いします。

 リンクしておきます。
[[20090807164841]]『リストボックスに入力した数字をトリガーに、その数字に該当するファイルを開くには』(けい) 

 (HANA)

 こんにちは。

 >     A      B       C
 >  1 0254  ファイル名1
 >  2 0546  ファイル名2
 >  3 7831  ファイル名3
 >  4 7652  ファイル名4
 >  5 4655  ファイル名5
 > 
 上では A列(コード?)とB列(ファイル名) で例が出されていますが、
 そのリストは、これまでのComboBox1〜ComboBox2 が参照しているシートと全然別のシートのリスト
 のことなんでしょうか?

 それとも、これまでのComboBox1〜ComboBox2 が参照しているシートSheet3 のことで、
  Sheet3の
     [B2:B73]にコード、
     [C2:C73]に対応するファイル名、
      [D2:D73]にコード、
      [E2:E73]に対応するファイル名、
      ・・・   
      ・・・
     [BX2:BX73]にコード、
     [BY2:BY73]に対応するファイル名が書いてある、ということなんでしょうか?

 どちらですか?

  (kanabun)


 とりあえず、いまComboBoxで使っているSheet3 とは 別シートのA,B列にListBox用の
 リストがあるばあいですと、こんな感じです。

 'プロシージャの順番は ABC順でもいいけど、
 '処理順のほうが分かりやすいと思います。
 '---------------------------------------------------------------- UserForm1 ?
 '↓変数は必ず宣言してから使うことを誓います!
 Option Explicit

 '↓使用する API関数の宣言
 Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
      (ByVal RootPath As String, _
       ByVal InputPathName As String, _
       ByVal OutputPathBuffer As String) As Long

 '↓ComboBox2 とListBox1 とどちらがアクティブになったかを記憶しておきます
 Private LastFocus As String * 1

 Private Sub UserForm_Initialize()
    ComboBox2.RowSource = "sheet3!A1:A97"
    Dim v
    With Worksheets("ListBox1用のリストがあるSheet名")  ' ◆シート名 要変更
        v = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 2).Value 'A,B列をリスト
    End With
    With ListBox1
        .ColumnCount = 2
        .ColumnWidths = "60;150"
        .List = v
    End With
 End Sub

 Private Sub UserForm_Activate()              '------ ここは意味が分からないので 原コードのまま
        ' ComboBox がアクティブの時の処理
    ComboBox1.RowSource = "Sheet3!A2:A73"
    ComboBox2.RowSource = "Sheet3!C2:C73"

 End Sub

 ' ComboBox1 でどれかのリストが選択された時の処理
 Private Sub ComboBox1_Change()
    Dim si As Integer
    si = ComboBox1.ListIndex   ' ComboBox1 の何番目が選択されたかを得る
    Select Case si
      Case 0 To 37
          ' si番アイテムが選択されていたら ComboBox2 の内容を[C2:C73]からOffset( ,si*2) した範囲とする
          With ComboBox2
              .RowSource = _
                 Worksheets("Sheet3").Range("C2:C73").Offset(, si * 2).Address(External:=True)
          End With
    End Select
 End Sub

 Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    LastFocus = "C"
 End Sub
 Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    LastFocus = "L"
 End Sub

 'ボタンが押されたら、ComboBox2の値で このマクロが書いてあるBookのフォルダ内をサブフォルダも含めて検索する
 '見つかれば そのBookを Openする
 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String   '検索を開始するRootフォルダ  (ドライブ直下なら D:\ とする)
    Dim myFind As String
    Dim myBook As String * 513
    Dim Index As Long

    myRootPath = ThisWorkbook.Path & "\"
    Select Case LastFocus
      Case "C"
          Index = ComboBox2.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ComboBox2.List(Index) & ".xls"
      Case "L"
          Index = ListBox1.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ListBox1.List(Index, 1) & ".xls"
      Case Else
          Exit Sub
    End Select
    ok = SearchTreeForFile(myRootPath, myFind, myBook)
    If ok Then
        myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
        Workbooks.Open myFind
    Else
        MsgBox "見つかりませんでした", , myFind
    End If
 End Sub

 ※シートSheet3のB-C列, D-E列,.... の (コード,ファイル名リスト)を使うのなら、
 もっと簡単になります。
  (kanabun)


すみません。
まだなぜか上手くいきません。
お願いします。

 >     A      B       C
 >  1 0254  ファイル名1
 >  2 0546  ファイル名2
 >  3 7831  ファイル名3
 >  4 7652  ファイル名4
 >  5 4655  ファイル名5
 > 
 上では A列(コード?)とB列(ファイル名) で例が出されていますが、
 そのリストは、これまでのComboBox1〜ComboBox2 が参照しているシートと全然別のシートのリスト
 のことなんでしょうか?

 それとも、これまでのComboBox1〜ComboBox2 が参照しているシートSheet3 のことで、
  Sheet3の
     [B2:B73]にコード、
     [C2:C73]に対応するファイル名、
      [D2:D73]にコード、
      [E2:E73]に対応するファイル名、

ComboBox1〜ComboBox2 が参照しているシートと同じシートを参照しております。
下記の通り書き直してみたのですが、うまくいきません。
具体的には、

Private Sub UserForm_Initialize()

    ComboBox2.RowSource = "sheet3!A1:A97"
    Dim v
    With Worksheets("Sheet3")  ' ◆シート名 要変更
        v = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 2).Value 'A,B列をリスト
    End With
    With TextBox1
        .ColumnCount = 12
        .ColumnWidths = "60;150"
        .List = v
    End With
 End Sub

ColumnCountがメソッドまたはデータ メンバが見つかりません。 (Error 461)
とってしまいます。
ちなみに下記の一部のListBoxではなく、TextBoxに書き換えたくらいで、
他はいじっていません。
素人で大変申し訳ないのですが、よくわからないので、
どなたか全文を書き換えていただけないでしょうか。
すみませんがお願いいたします。
↓↓↓

 Option Explicit

 '↓使用する API関数の宣言
 Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
      (ByVal RootPath As String, _
       ByVal InputPathName As String, _
       ByVal OutputPathBuffer As String) As Long

 '↓ComboBox2 とListBox1 とどちらがアクティブになったかを記憶
 Private LastFocus As String * 1

 Private Sub UserForm_Initialize()
    ComboBox2.RowSource = "sheet3!A1:A97"
    Dim v
    With Worksheets("Sheet3")  ' ◆シート名 要変更
        v = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 2).Value 'A,B列をリスト
    End With
    With TextBox1
        .ColumnCount = 12
        .ColumnWidths = "60;150"
        .List = v
    End With
 End Sub

 Private Sub UserForm_Activate()
        ' ComboBox がアクティブの時の処理
    ComboBox1.RowSource = "Sheet3!A2:A73"
    ComboBox2.RowSource = "Sheet3!C2:C73"

 End Sub

 ' ComboBox1 でどれかのリストが選択された時の処理
 Private Sub ComboBox1_Change()
    Dim si As Integer
    si = ComboBox1.ListIndex   ' ComboBox1 の何番目が選択されたかを得る
    Select Case si
      Case 0 To 37
          ' si番アイテムが選択されていたら ComboBox2 の内容を[C2:C73]からOffset( ,si*2) した範囲とする
          With ComboBox2
              .RowSource = _
                 Worksheets("Sheet3").Range("C2:C73").Offset(, si * 2).Address(External:=True)
          End With
    End Select
 End Sub

 Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    LastFocus = "C"
 End Sub
 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    LastFocus = "L"
 End Sub

 'ボタンが押されたら、ComboBox2の値で このマクロが書いてあるBookのフォルダ内をサブフォルダも含めて検索する
 '見つかれば そのBookを Openする
 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String
    Dim myBook As String * 513
    Dim Index As Long

    myRootPath = ThisWorkbook.Path & "\"
    Select Case LastFocus
      Case "C"
          Index = ComboBox2.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ComboBox2.List(Index) & ".xls"
      Case "L"
          Index = ListBox1.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ListBox1.List(Index, 1) & ".xls"
      Case Else
          Exit Sub
    End Select
    ok = SearchTreeForFile(myRootPath, myFind, myBook)
    If ok Then
        myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
        Workbooks.Open myFind
    Else
        MsgBox "見つかりませんでした", , myFind
    End If
 End Sub


  こんにちは。

 >  >     A      B       C
 >  >  1 0254  ファイル名1
 >  >  2 0546  ファイル名2
 >  >  3 7831  ファイル名3
 >  >  4 7652  ファイル名4
 >  >  5 4655  ファイル名5
 >  > 
 >  上では A列(コード?)とB列(ファイル名) で例が出されていますが、
 >  そのリストは、これまでのComboBox1〜ComboBox2 が参照しているシートと全然別のシートのリスト
 >  のことなんでしょうか?
 > 
 >  それとも、これまでのComboBox1〜ComboBox2 が参照しているシートSheet3 のことで、

 > ComboBox1〜ComboBox2 が参照しているシートと同じシートを参照しております。

 同じシートのことだったのですか?
 Sheet3 のレイアウトをもう一度、説明してくださいませんか?
 A列  コード
 B列  A列コードに対応する「ファイル名」
 [C列]
 [D列]
 [E列]
 [F列] は?
 とくに C列以降の一列置きのリストは A,B列のリストとはなんの関係もないんですか?

 > ColumnCountがメソッドまたはデータ メンバが見つかりません。 (Error 461) とってしまいます。
 > ちなみに下記の一部のListBoxではなく、TextBoxに書き換えたくらいで、他はいじっていません。

 >    With TextBox1
 >        .ColumnCount = 12
 >        .ColumnWidths = "60;150"
 >        .List = v
 >    End With
 そりゃ、TextBoxには .ColumnCount とか .ColumnWidths とか、.List などというプロパティ
 ないですから、エラーになってあたりまえといえばあたりまえですけどね。
 なぜ、ListBoxでなく、TextBoxにされたのですか?

  (kanabun) 2009-08-13 14:18

わかりずらくて申し訳ありません。
お返事ありがとうございます!
    A     B       C       D      E        F       G
 1 A社    0254   ファイル名1   4561  ファイル9     4646   ファイル52
 2 B社    0546   ファイル名2   7652  ファイル10    8896   ファイル53
 3 C社    7831   ファイル名3   4688  ファイル11    5731   ファイル55
 4 D社    7652   ファイル名4   5555  ファイル12    7921   ファイル85
 5 E社    4655   ファイル名5   4545  ファイル13    

検索方法@
ComboBox1 ではA1〜A5までを参照(A社〜E社)
ComboBox2 ではComboBox1でA1を選択すると、C1〜C5までを表示させる、ComboBox1でA2を選択するとE1〜E5までを表示させています。
A列には社名、B以降は繰り返しです。
複雑ですみませんが宜しくお願いいたします。

検索方法A
B1〜B5、D1〜D5、F1〜F4に表示されている番号をテキストボックスに入力するとそれぞれの番号に対応する
ファイルを開かせたいのです。
対応するファイルはそれぞれの番号の右に表示されているファイル名のエクセルを開かせる方法です。

どちらかの方法が選択できるフォームで、いずれもコマンドボタンを実行することでエクセルを開く指示をしたいのです。

宜しくお願いいたします。


追記です。
全て一つのシート、同じシートが情報源となっています。
ご教示願います!

 > どちらかの方法が選択できるフォームで、

 すこし分かってきました。
 ですが、 すみません。ちょっと出かけますんで、
 レスは後ほど。

  (kanabun) 2009-08-13 15:42


あともう1件ご質問がございます。

これらとは別に同じフォームの中にコンボボックスをひとつ足そうとしています。
理由は検索先のシートを同じ仕様でもう1枚作成しました。イメージとしては海外の会社のシートと、国内の会社のシートの計2枚です。

事前に検索するシートを選択または指定する命令を
コンボボックスで指示したいのですが、(コンボボックス3で)
コンボボックスでなくても、チェックボックスでも、ラジオボタンでもぜんぜんかまわないのですが。・・・
すみませんが、宜しくお願いします!

恐縮ですが、お願いいたします。
本当にありがとうございます。


 直前の質問は、そのまえの質問が解決されたらということでしばらく置いておいて、
 ▼<シートのレイアウト>について確認されてください。
  A列には社名のリストがあって、
  B列以降は 
     [B:C]列  A列の最初のリストに対応する コード:ファイル名のセット
     [D:E]列  A列の2番目のリストに対応する コード:ファイル名のセット
     [F:G]列  A列の3番目のリストに対応する コード:ファイル名のセット
     [H:I]列  A列の4番目のリストに対応する コード:ファイル名のセット
      ・・・
      ・・・
  以下同様、と考えていいですか?

 ▼テキストボックスによる<検索方法> ですが、

 >検索方法A B1〜B5、D1〜D5、F1〜F4に表示されている番号をテキストボックスに入力するとそ
れぞれの番号に対応するファイルを開かせたいのです。

 (A)テキストボックスに入力するのは ComboBox1で選択した会社グループの中から手操作で入力するということですか?
 (B)それとも、現在 ComboBox1で選択されている会社名に関係なく、Sheet3 にあるすべてのコードのどれが入力されても
  対応するファイル名を(入力されたコードをシート全体から検索して)見つかったセルの右隣りのファイル名を
  取り出したい、ということですか?

  (kanabun) 2009-08-13 16:30頃


わかりずらくて申し訳ありません。
宜しくお願いいたします。

直前の質問は、そのまえの質問が解決されたらということでしばらく置いておいて、

 ▼<シートのレイアウト>について確認されてください。
  A列には社名のリストがあって、
  B列以降は 
     [B:C]列  A列の最初のリストに対応する コード:ファイル名のセット
     [D:E]列  A列の2番目のリストに対応する コード:ファイル名のセット
     [F:G]列  A列の3番目のリストに対応する コード:ファイル名のセット
     [H:I]列  A列の4番目のリストに対応する コード:ファイル名のセット
      ・・・
      ・・・
  以下同様、と考えていいですか?

⇒その通りです。
ありがとうございます。

 ▼テキストボックスによる<検索方法> ですが、

 >検索方法A B1〜B5、D1〜D5、F1〜F4に表示されている番号をテキストボックスに入力するとそ
れぞれの番号に対応するファイルを開かせたいのです。

 (A)テキストボックスに入力するのは ComboBox1で選択した会社グループの中から手操作で入力するということですか?
 (B)それとも、現在 ComboBox1で選択されている会社名に関係なく、Sheet3 にあるすべてのコードのどれが入力されても
  対応するファイル名を(入力されたコードをシート全体から検索して)見つかったセルの右隣りのファイル名を
  取り出したい、ということですか?

⇒(B)です。
やはり無理でしょうか?別シートに一覧で作るしかないでししょうか。

説明が下手で申し訳ございません。
上記でご教示願います。


 ご質問、最初のほうですが、
 テキストボックスに番号を打ち込むのはどう考えても使い勝手が悪そうなので、
 第3のComboBox に換えてみました。

  ┏━━━━━━━━━━━━━━━━━┓
  ┃    ComboBox1                     ┃▼    A列の会社名リストを表示
  ┗━━━━━━━━━━━━━━━━━┛
  ┏━━━━━━━━━━━━━━━━━┓
  ┃    ComboBox2                     ┃▼   ComboBox1で選択された会社名に対応する「コードとファイル名」を表示
  ┗━━━━━━━━━━━━━━━━━┛
                                       【   CommandButton1   】  ←このボタンを押してファイル検索
  ┏━━━━━━━━━━━━━━━━━┓
  ┃    ComboBox3                     ┃▼  手でコード番号を打ち込むTextBox風ComboBox
  ┗━━━━━━━━━━━━━━━━━┛

 これで一度Sheet3に対して使い勝手を試してみてください。

 'プロシージャの順番は ABC順でもいいけど、
 '処理順のほうが分かりやすいと思います。
 '----------------------------------------------------------------
 '↓変数は必ず宣言してから使うことを誓います!
 Option Explicit

 '↓API関数の宣言
 Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
      (ByVal RootPath As String, _
       ByVal InputPathName As String, _
       ByVal OutputPathBuffer As String) As Long

 '↓ComboBox2 とComboBox3 と どちらが最後にアクティブになったかを記憶しておきます
 Private LastFocus As Long
 '--------------------------------------- ここまで宣言部

 Private Sub UserForm_Initialize()
    Dim r As Range
    Dim rCount As Long
    Dim i As Long, j As Long
    Dim dic As Object
    Dim v As Variant

    With ComboBox2      '--------- ComboBox1で選択された会社名グループリストを表示するコンボボックス
        .RowSource = ""
        .ColumnWidths = 350
        .ColumnCount = 2
        .ColumnWidths = "60;200"
        .TextColumn = 2
        .BoundColumn = 2
    End With

    Set dic = CreateObject("Scripting.Dictionary")
    With Sheets("Sheet3")           '------------------ Sheet3内の コードとファイル名の全リスト作成
        Set r = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
        rCount = r.Rows.Count
        For j = 2 To rCount * 2 + 1 Step 2
            v = .Range(.Cells(2, j), .Cells(.Rows.Count, j).End(xlUp)).Resize(, 2).Value
            For i = 1 To UBound(v)
                If Not IsEmpty(v(i, 1)) Then
                    dic(v(i, 1)) = v(i, 2)
                End If
            Next
        Next
    End With
    ComboBox1.RowSource = ""
    ComboBox1.List = r.Value
    With ComboBox3    '------------------ コード番号を入力できるコンボボックス
        .ColumnWidths = 350
        .ColumnCount = 2
        .ColumnWidths = "60;200"
        .TextColumn = 1
        .List = Application.Transpose(Array(dic.Keys, dic.Items))
    End With
    Set dic = Nothing

 End Sub

 ' ComboBox1 が変化した時の処理
 Private Sub ComboBox1_Change()
    Dim si As Integer
    Dim j As Long '列番号
    si = ComboBox1.ListIndex   ' ComboBox1 の何番目が選択されたかを得る
    If si < 0 Then Exit Sub
    j = si * 2 + 2
    With Worksheets("Sheet3")
        ComboBox2.List = .Range(.Cells(2, j), .Cells(.Rows.Count, j).End(xlUp)).Resize(, 2).Value
    End With
 End Sub

 Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    LastFocus = 2
 End Sub
 Private Sub ComboBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    LastFocus = 3
 End Sub

 'ボタンが押されたら、最後にアクティブになったComboBox2またはComboBox3の値で
 'このマクロが書いてあるBookのフォルダ内をサブフォルダも含めて検索する
 '見つかれば そのBookを Openする
 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String   '検索を開始するRootフォルダ  (ドライブ直下なら D:\ とする)
    Dim myFind As String
    Dim myBook As String * 513
    Dim Index As Long

    myRootPath = ThisWorkbook.Path & "\"
    Select Case LastFocus
      Case 2
          Index = ComboBox2.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ComboBox2.List(Index) & ".xls"
      Case 3
          Index = ComboBox3.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ComboBox3.List(Index, 1) & ".xls"
      Case Else
          Exit Sub
    End Select
    ok = SearchTreeForFile(myRootPath, myFind, myBook)
    If ok Then
        myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
        Workbooks.Open myFind
    Else
        MsgBox "見つかりませんでした", , myFind
    End If
 End Sub

 (kanabun) 2009-08-13 19:40頃


 さっそく修正です。
 > Private Sub CommandButton1_Click()
 のところ ↓のように修正ください。 m(_ _)m

 >   Select Case LastFocus
 >     Case 2
 >         Index = ComboBox2.ListIndex
 >         If Index < 0 Then Exit Sub
 >         myFind = ComboBox2.List(Index) & ".xls"   'Code番号をファイル名にしていました
            ↓
          myFind = ComboBox2.List(Index,1) & ".xls"  'Listの2列目が ファイル名でした

   (kanabun)  先は 長そう で す  ね  

ありがとうございます。
格闘してみた結果なんとか、
形になりました。
本当にありがとうございます。2ヶ月間悩んだ結果、
形になり本当に嬉しく思っています!
感謝です。

できればなのですが、
ComboBox1で選択された会社名に対応する「コードとファイル名」を表示
wp『ファイル名のみ表示に変更できないでしょうか』

あと更に、ステップアップとして、
甘えてしまって申し訳ないのですが、
もう1件
下記の件可能でしょうか。

これらとは別に同じフォームの中にコンボボックスをひとつ足そうとしています。理由は検索先のシートを同じ仕様でもう1枚作成しました。イメージとしては海外の会社のシートと、国内の会社のシートの計2枚です。

事前に検索するシートを選択または指定する命令をコンボボックスで指示したいのですが、(コンボボックス3で)コンボボックスでなくても、チェックボックスでも、ラジオボタンでもぜんぜんかまわないのですが。・・・すみませんが、宜しくお願いします!


すみません。
追記です。
Module1に下記のように書いているのですが、
コンパイルエラー、参照が不正または不完全です。
と表示されるのですが、なぜでしょうか。

ただ表示する際にシートをミニマイズにして、フォームを一番最初に出したいだけなのですが。・・・・
すみませんが、宜しくお願いいたします。

Sub USFormShow()

        ' ユーザーフォームの表示
        伝票.Show
    End Sub

Sub auto_open()

    ActiveWindow.WindowState = xlMinimized
    伝票 .Show
End Sub

 > 2ヶ月間悩んだ結果、形になり本当に嬉しく思っています!感謝です。 
 おー、形になりましたか? それは良かったです。
 SearchTreeForFile 関数を紹介してくださった Heropaさんに感謝です(^^。

 >ComboBox1で選択された会社名に対応する「コードとファイル名」を表示wp『ファイル名のみ表示に変更できないでしょうか』 
 現在のUserFormのコード内から ComboBox2 を検索し、片っぱしから 『ファイル名のみ表示』に「戻せば」よいのでは?

 (1) まず  Private Sub UserForm_Initialize() 内の
     以下の部分、すべて削除
    With ComboBox2      '--------- ComboBox1で選択された会社名グループリストを表示するコンボボックス
        .RowSource = ""
        .ColumnWidths = 350
        .ColumnCount = 2
        .ColumnWidths = "60;200"
        .TextColumn = 2
        .BoundColumn = 2
    End With

 (2) Private Sub ComboBox1_Change() プロシージャ内の
    'j = si * 2 + 2
    'With Worksheets("Sheet3")
    '    ComboBox2.List = .Range(.Cells(2, j), .Cells(.Rows.Count, j).End(xlUp)).Resize(, 2).Value
    'End With

     ここを 以下のように変更

    j = si * 2 + 3
    With Worksheets("Sheet3")
        ComboBox2.List = .Range(.Cells(2, j), .Cells(.Rows.Count, j).End(xlUp)).Value
    End With

  (3)Private Sub CommandButton1_Click() プロシージャ内の 
     Case 2 のところを
    Select Case LastFocus
      Case 2
          Index = ComboBox2.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ComboBox2.List(Index) & ".xls"
                             ~~~~~~~~~~~~ とする
 ざっと見た限りでは
 以上(1),(2),(3)の変更でいいように見受けられますが? どうですか?

 '-------------------
 >これらとは別に同じフォームの中にコンボボックスをひとつ足そうとしています。
 > 理由は検索先のシートを同じ仕様でもう1枚作成しました。イメージとしては海外の会社のシートと、国内の会社のシートの計2枚です。 
 >
 >事前に検索するシートを選択または指定する命令をコンボボックスで指示したいのですが、
 というより、現在のUserFormのコードで 
         Worksheets("Sheet3") 
  と決め打ちしている部分を
         ActiveSheet
  に変更すれば、UserFormを開くときアクティブになっているシートがリストに表示されますよ!

 '-------------------
 ただし、
 > Sub auto_open() 
 >     ActiveWindow.WindowState = xlMinimized
 >     伝票.Show
 > End Sub

 と、最小化していると先ほどの「ActiveSheet案」は難しいですね。

  (kanabun) 2009-08-14 16:14


ありがとうございます。
更に追記になってしまうのですが、
なぜか、開けるファイルと開けないファイルが存在します。
検索を実行しても表示されない場合があります。

あと、番号での検索ですが、まったく反応しなくなってしまいました。
該当番号を入力してもエクセルが開けません。
最初は開けたのですが・・・

原因がもしわかったらご教示ください。
お忙しいとこすみませんが、宜しくお願い致します。


追記です。
エクセルファイルがひらけない場合、
MSGが出る場合と出ない場合があります。
でも圧倒的にメッセージがでない場合のほうが多いのですが・・・

 > エクセルファイルがひらけない場合、MSGが出る場合と出ない場合があります。
 > でも圧倒的にメッセージがでない場合のほうが多いのですが・・・

 それはどちらのばあいですか?
  (ComboBox2でファイルを指定した場合? 
    ComboBox3で番号からファイル名を指定した場合?)

   Select Case LastFocus
      Case 2
          Index = ComboBox2.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ComboBox2.List(Index) & ".xls"
      Case 3
          Index = ComboBox3.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ComboBox3.List(Index, 1) & ".xls"
      Case Else
          MsgBox "最後にフォーカスをもった ComboBox番号が不正です" & LstFocus  '◆この行を追加してみてください  
          Exit Sub
    End Select


コンパイルエラーになってしまいます。
変数が定義されていませんと。・・・

コンボボックス1で会社を選択してコンボボックス2でファイルを開く場合は
開けるファイルと開けない(実行をおしても無反応)が存在します。

番号から検索する方法は番号を入力して実行してもまったく反応しません。

MsgBox "最後にフォーカスをもった ComboBox番号が不正です" & LstFocus '◆この行を追加してみてください

 ⇒これをたしたところ。       
コンパイルエラーになってしまいます。
変数が定義されていませんと。・・・
表示されてしまいます。

道程が遠いです。
・・・・
すみません、
ゆっくりでよいのでお願いします。


 失礼 タイプミスです

 >MsgBox "最後にフォーカスをもった ComboBox番号が不正です" & LastFocus '◆この行を追加してみてください 
                                                             ~~~~~~~~~
 (kanabun)


最後にもう一度だけ教えてください。
本当に困ってしまいました。

下記内容でコマンドボタンをクリックしたところ、
うまくいきません。

コンボボックス1,2を選択することは可能なのですが、
コマンドボタンにより実行しても無反応です。

さらに、コンボボックス3に該当する番号を入れましても
これもまたまったく反応しなくなってしまいました。
あと一歩のところで大変悔しいので、解決していただけないでしょうか。泣
ここまで教えて頂いたのに。

 Option Explicit

 '↓API関数の宣言
 Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _
      (ByVal RootPath As String, _
       ByVal InputPathName As String, _
       ByVal OutputPathBuffer As String) As Long

 '↓ComboBox2 とComboBox3 と どちらが最後にアクティブになったかを記憶しておきます
 Private LastFocus As Long
 '--------------------------------------- ここまで宣言部

 Private Sub UserForm_Initialize()
    Dim r As Range
    Dim rCount As Long
    Dim i As Long, j As Long
    Dim dic As Object
    Dim v As Variant

    Set dic = CreateObject("Scripting.Dictionary")
    With Sheets("Sheet3")           '------------------ Sheet3内の コードとファイル名の全リスト作成
        Set r = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
        rCount = r.Rows.Count
        For j = 2 To rCount * 2 + 1 Step 2
            v = .Range(.Cells(2, j), .Cells(.Rows.Count, j).End(xlUp)).Resize(, 2).Value
            For i = 1 To UBound(v)
                If Not IsEmpty(v(i, 1)) Then
                    dic(v(i, 1)) = v(i, 2)
                End If
            Next
        Next
    End With
    ComboBox1.RowSource = ""
    ComboBox1.List = r.Value
    With ComboBox3    '------------------ コード番号を入力できるコンボボックス
        .ColumnWidths = 350
        .ColumnCount = 2
        .ColumnWidths = "60;200"
        .TextColumn = 1
        .List = Application.Transpose(Array(dic.Keys, dic.Items))
    End With
    Set dic = Nothing

 End Sub

 ' ComboBox1 が変化した時の処理
 Private Sub ComboBox1_Change()
    Dim si As Integer
    Dim j As Long '列番号
    si = ComboBox1.ListIndex   ' ComboBox1 の何番目が選択されたかを得る
    If si < 0 Then Exit Sub
     j = si * 2 + 3
    With Worksheets("Sheet3")
        ComboBox2.List = .Range(.Cells(2, j), .Cells(.Rows.Count, j).End(xlUp)).Value
    End With
 End Sub

 Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    LastFocus = 2
 End Sub
 Private Sub ComboBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    LastFocus = 3
 End Sub

 'ボタンが押されたら、最後にアクティブになったComboBox2またはComboBox3の値で
 'このマクロが書いてあるBookのフォルダ内をサブフォルダも含めて検索する
 '見つかれば そのBookを Openする
 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String   '検索を開始するRootフォルダ  (ドライブ直下なら D:\ とする)
    Dim myFind As String
    Dim myBook As String * 513
    Dim Index As Long

    myRootPath = ThisWorkbook.Path & "\"
   Select Case LastFocus
      Case 2
          Index = ComboBox2.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ComboBox2.List(Index) & ".xls"

      Case 3
          Index = ComboBox3.ListIndex
          If Index < 0 Then Exit Sub
          myFind = ComboBox3.List(Index, 1) & ".xls"
      Case Else
          Exit Sub
    End Select
    ok = SearchTreeForFile(myRootPath, myFind, myBook)
    If ok Then
        myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
        Workbooks.Open myFind, ReadOnly:=True
    Else
        MsgBox "見つかりませんでした", , myFind
    End If

Hide

    Workbooks("伝票検索.xls").Close

 End Sub

Private Sub CommandButton2_Click()
End
End Sub
Private Sub CommandButton3_Click()

 ThisWorkbook.FollowHyperlink "S:\mizuho\pag\pa_amo\(新)伝票 工事中 使用不可\国内籍 投資信託\"
 End Sub


 > 本当に困ってしまいました。 
 > 下記内容でコマンドボタンをクリックしたところ、うまくいきません。 

 > コンボボックス1,2を選択することは可能なのですが、コマンドボタンにより実行しても無反応です。 
 ということは、ComboBox1〜ComboBox2の連動表示はうまくいっている、ということですね?
 ComboBox2でリストからファイル名をひとつ選択して
 CommandButton1 をクリックしても、検索されないということですか?

 > さらに、コンボボックス3に該当する番号を入れましてもこれもまたまったく反応しなくなってしまいました。
 > あと一歩のところで大変悔しいので、解決していただけないでしょうか。泣ここまで教えて頂いたのに。
 「該当する番号」をタイプする(入力する)と入力ボックスに入れた番号は反転表示してますか?
  反転表示していれば、入力した番号は ComboBox3のリストにあるということです。
  そうでなければ、入力した番号は ComboBox3のリストにない、ということです。
  それらを確認するために、
  CommandButton1 が押された時、どのように処理が実行されているか、ステップ実行して確認してみてください。
  まず、Sub CommandButton1_Click() プロシージャの先頭に
  Stop を入れてください (下の ◆この行を挿入 の位置)
  CommandButton1が Clickされると、実行はこの Stop行で「一時中断」します。
  [F8]キーを押して 一行だけ実行してください。
 >    myRootPath = ThisWorkbook.Path & "\"
  コードの myRootPath のところにマウスをあててちょっと待つと、myRootPath の内容が変数の下に表示されると
  思います。内容を確認したら、また [F8]キーを押します。
 >   Select Case LastFocus
 が実行され、そのときの LastFocus の内容によって、処理は分岐します。
 どの行へジャンプしましたか?
   (ComboBox2でファイル名が選択された直後なら LastFocus は 2 ですから、 Case 2 の行へ、
     ComboBox3 で 番号が入力された直後なら LastFocus は 3 ですから、 Case 3 の行へ 実行が移ると思います)

  '下記コード ◆の部分を追加修正して、じっくりデバッグしてみてください。

  なお、原因が分かって、ステップ実行モードから、通常の実行に切り替えるときは、
  [F8]ではなく、[F5]キーを押してください。

 'ボタン CommandButton1 が押されたら、最後にアクティブになったComboBox2またはComboBox3の値で
 'このマクロが書いてあるBookのフォルダ内をサブフォルダも含めて検索する
 '見つかれば そのBookを Openする
 Private Sub CommandButton1_Click()
    Dim ok As Long
    Dim myRootPath As String   '検索を開始するRootフォルダ  (ドライブ直下なら D:\ とする)
    Dim myFind As String
    Dim myBook As String * 513
    Dim Index As Long

    Stop                                                                '◆この行を挿入
    myRootPath = ThisWorkbook.Path & "\"
    Select Case LastFocus
      Case 2
          Index = ComboBox2.ListIndex
          If Index < 0 Then MsgBox "ComboBox2 選択なし": Exit Sub        '◆デバッグ用修正  MsgBoxを表示してから Exitする
          myFind = ComboBox2.List(Index) & ".xls"                        '【ComboBox2】に表示されている「ファイル名」で検索

      Case 3
          Index = ComboBox3.ListIndex
          If Index < 0 Then  MsgBox "ComboBox3 選択なし": Exit Sub       '◆デバッグ用修正  MsgBoxを表示してから Exitする
          myFind = ComboBox3.List(Index, 1) & ".xls"                     '【ComboBox3】で選択された番号のリスト行の「ファイル名」で検索
      Case Else
          MsgBox "ComboBox2 または ComboBox3 で選択してからこのボタンを押してください  " & LastFocus '◆この行を追加してみてください 
          Exit Sub
    End Select
    ok = SearchTreeForFile(myRootPath, myFind, myBook)
    If ok Then
        myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1)
        Workbooks.Open myFind, ReadOnly:=True
        Hide                                                      '◆移動  ファイルを開いたら UserFormを閉じる
        Workbooks("伝票検索.xls").Close
    Else
        MsgBox "見つかりませんでした", , myFind
    End If

 End Sub

 (kanabun) 2009-08-17 11:15


コンボボックス1,2を選択することは可能なのですが、コマンドボタンにより実行しても無反応です。
 ということは、ComboBox1〜ComboBox2の連動表示はうまくいっている、ということですね?
⇒ComboBox1〜ComboBox2の連動表示はうまくいってます。問題なしです。

 ComboBox2でリストからファイル名をひとつ選択して
 CommandButton1 をクリックしても、検索されないということですか?
⇒その通りです。1/10くらいの確立でファイルによっては開ける場合があります。
でも、開かれた瞬間エクセルがフリーズしてしまいます。
原因は不明です。

 > さらに、コンボボックス3に該当する番号を入れましてもこれもまたまったく反応しなくなってしまいました。
 > あと一歩のところで大変悔しいので、解決していただけないでしょうか。泣ここまで教えて頂いたのに。
 「該当する番号」をタイプする(入力する)と入力ボックスに入れた番号は反転表示してますか?
  反転表示していれば、入力した番号は ComboBox3のリストにあるということです。
  そうでなければ、入力した番号は ComboBox3のリストにない、ということです。
⇒反転表示は問題なくされます。しかしコマンドボタンを押してもまったく反応しません。

  それらを確認するために、
  CommandButton1 が押された時、どのように処理が実行されているか、ステップ実行して確認してみてください。
  まず、Sub CommandButton1_Click() プロシージャの先頭に
  Stop を入れてください (下の ◆この行を挿入 の位置)
  CommandButton1が Clickされると、実行はこの Stop行で「一時中断」します。
  [F8]キーを押して 一行だけ実行してください。
 >    myRootPath = ThisWorkbook.Path & "\"
  コードの myRootPath のところにマウスをあててちょっと待つと、myRootPath の内容が変数の下に表示されると
  思います。内容を確認したら、また [F8]キーを押します。
 >   Select Case LastFocus
 が実行され、そのときの LastFocus の内容によって、処理は分岐します。
 どの行へジャンプしましたか?
   (ComboBox2でファイル名が選択された直後なら LastFocus は 2 ですから、 Case 2 の行へ、
     ComboBox3 で 番号が入力された直後なら LastFocus は 3 ですから、 Case 3 の行へ 実行が移ると思います)

  '下記コード ◆の部分を追加修正して、じっくりデバッグしてみてください。

結果報告:
本当に素人で申し訳ないのですが、結果報告いたします。

 (ComboBox2でファイル名が選択された直後なら LastFocus は 2 ですから、 Case 2 の行へ、
⇒LastFocus は 2ではなく”0”に移動してしまいました。
またComboBox2で実行をおしたところ、選択した項目によっては、
オブジェクト変数またはWithブロック変数が設定されていませ・・・
と表示されてしまいました。

⇒ComboBox3 で 番号が入力された直後なら LastFocus は 3 ですから、 Case 3 の行へ 実行が移ると思います
LastFocus は3ではなく”2”に移動してしまいました。
ComboBox3では入力した番号によっては
Listプロパティを設定できません。
プロパティの配列のインデックスが不正です。と番号によっては表示されてしまいます。

すみません。何がなんだかさっぱりわかりません。
だんだん複雑になってきてますが、お助けいただけそうでしょうか?
宜しくお願いいたします。kanabunさん。


 > 何がなんだかさっぱりわかりません。
 う〜ん。。。それは誰のセリフでしたっけ?

 > ⇒ComboBox3 で 番号が入力された直後
 > LastFocus は3ではなく”2”に移動してしまいました。 
 > ComboBox3では入力した番号によっては 
 >    Listプロパティを設定できません。プロパティの配列のインデックスが不正です。
 >と番号によっては表示されてしまいます。 

 ComboBox3とか ComboBox2 とかのコントロール名は正しいのですよね?

 最悪、メニュ−[挿入]-[ユーザーフォーム]で 新規UserFormを(外観だけ)作りなおして、

  ┏━━━━━━━━━━━━━━━━━┓
  ┃    ComboBox1                     ┃▼    A列の会社名リストを表示
  ┗━━━━━━━━━━━━━━━━━┛
  ┏━━━━━━━━━━━━━━━━━┓
  ┃    ComboBox2                     ┃▼   ComboBox1で選択された会社名に対応する「コードとファイル名」を表示
  ┗━━━━━━━━━━━━━━━━━┛
                                       【   CommandButton1   】  ←このボタンを押してファイル検索
  ┏━━━━━━━━━━━━━━━━━┓
  ┃    ComboBox3                     ┃▼  手でコード番号を打ち込むTextBox風ComboBox
  ┗━━━━━━━━━━━━━━━━━┛

 そこに
 今のコードを丸ごとコピペしたら、何か状況は改善されませんかね?

  (kanabun) 2009-08-17 14:09


 復元しました(kazu)2009/08/19 13:03

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.