[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『コマンドボタンでファイルを探しにいくには』(そい)
すみません。
どなたか助けてください。
コマンドボタンを押下すると指定したエクセルファイルを探しにいくマクロを書いてます。
判らないのが、現在のマクロだと現在ファイルを置いてある場所(一箇所)しか探しにいってくれません。
あるフォルダ以下に存在する複数のフォルダに該当のエクセルファイルがあるか探しにいくマクロをどなたかご教示いただけませんでしょうか。
時間に余裕のあるときで結構ですので、どうぞよろしくお願いいたします。
直接書き換えて頂けるとたすかります。
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)
上手くいきません。
すみませんがよろしくおねがいします。
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
(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枚作成しました。イメージとしては海外の会社のシートと、国内の会社のシートの計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) 先は 長そう で す ね
できればなのですが、
ComboBox1で選択された会社名に対応する「コードとファイル名」を表示
wp『ファイル名のみ表示に変更できないでしょうか』
あと更に、ステップアップとして、
甘えてしまって申し訳ないのですが、
もう1件
下記の件可能でしょうか。
これらとは別に同じフォームの中にコンボボックスをひとつ足そうとしています。理由は検索先のシートを同じ仕様でもう1枚作成しました。イメージとしては海外の会社のシートと、国内の会社のシートの計2枚です。
事前に検索するシートを選択または指定する命令をコンボボックスで指示したいのですが、(コンボボックス3で)コンボボックスでなくても、チェックボックスでも、ラジオボタンでもぜんぜんかまわないのですが。・・・すみませんが、宜しくお願いします!
ただ表示する際にシートをミニマイズにして、フォームを一番最初に出したいだけなのですが。・・・・
すみませんが、宜しくお願いいたします。
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が出る場合と出ない場合があります。 > でも圧倒的にメッセージがでない場合のほうが多いのですが・・・
それはどちらのばあいですか? (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.