[[20180604232605]] 『A列をクリックすると「B列」と「指定文字」が含ま』(ケニヤ) ページの最後に飛ぶ

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

 

『A列をクリックすると「B列」と「指定文字」が含まれたファイルを開く方法』(ケニヤ)

 すみません。業務効率化のために教えてください。

 A列空欄、B列「文字列」が並んでいるシートがありまして、
 A列をダブルクリックすると、同行のB列の「文字列(例:3938A)」と
 不変の「指定文字列(例:2018_)」がファイル名に含まれるファイルを、
 「指定フォルダ(例:C:\ABC)から探して開く方法を御教授願えませんか。

 途中と最後にB列が空欄のセルもありますので、
 当該空欄セルと同行ののA列をクリックしても何も開かない仕様が尚有り難いです。

 不躾ですみません。
 こんなことできたら有り難いということで質問とさせてください。

 よろしくお願いいたします。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


ダブルクリックのイベントプロシージャを調べて下さい。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html
 
フォルダからファイル名を取り出して、
そのファイル名に文字列(2つ)が入っているか調べます。
Likeを使った包含条件を ANDで同時成立かどうかをチェックすればよいでしょう。
 
フォルダからファイル名を取り出す部分は、
http://www.moug.net/tech/exvba/0060001.html
を参考にして下さい。
 
コード作成依頼ではなく、ご自分でどこまでトライしたかを
書いて頂くとよいと思います。

(γ) 2018/06/05(火) 06:55


回答でなくて疑問ですが、
同行のB列の「文字列(例:3938A)」と 不変の「指定文字列(例:2018_)」がファイル名に含まれるファイルが、「指定フォルダ(例:C:\ABC)に【複数含まれている】場合【そのようなファイルが見つからない】場合はどうするんでしょう
(もこな2) 2018/06/05(火) 07:28

文字列の順序を考慮して、
二回Dir関数を使えばいいのかもしれませんね。
(γ) 2018/06/05(火) 08:06

 >方法を御教授願えませんか。
まず、既定のフォルダーはどのようにして指定するつもりですか?
次に、結果的にどのようなフルパスになればいいのですか?

 >不躾ですみません。
そう思うなら、全部を一度に聞くのではなく、
順を追って基礎から学びたいと思いませんか?
誰かに書いてもらって、
「できた」って一人で喜んでいるだけでは、
マクロを作れるようにはならないと思いますよ。

まずは作業の流れをイメージしてください。

1)マクロ起動(ダブルクリックで起動)
  →ダブルクリックされたセルが変数に渡される(以降Targetとする)
2)もし、TargetがA列で無かったらマクロ終了
3)もし、Targetの右隣りが空白ならマクロ終了
(もしかしてこの行は要らないかも?セルが空白ならファイルの存在確認で蹴られるはずだから。)
4)ファイルのプルパスを示す文字列を生成
5)生成した文字列のファイルが存在するか確認してなかったらマクロ終了
6)生成した文字列のファイルを開く
7)マクロ終了

となると思います。
で、この流れの中でどこまでは書けるという説明をし、
どこが上手く書けないかを説明して、
アドバイスを求めてはいかがでしょうか?

(まっつわん) 2018/06/05(火) 08:23


 直接の回答ではないですが・・

 該当ファイルは指定フォルダの直下にありますか?
 それともさらにサブフォルダがありますか?

 対象ファイルの拡張子は何ですか?
(ろっくん) 2018/06/05(火) 08:36

 みなさん、御返信有難う御座います。昨日夜は失礼致しました。
 休憩時間が取れましたので、過去ログやGoogle検索で悩みながら以下の様に作ってみました。

 課題は、

 ・E列の空白セルをダブルクリックすると全てのファイルが開いてしまうこと
 ・E列に「家事支援」と入力した場合、「家事支援_2017」が含まれているファイルを開きたいところ、
  「家事支援ABC_2017」も対象となってしまうこと

 です。あとは素人作成なので、何かしたら変な動作をするのではないかという不安でしょうか・・・。

 上記、課題について御支援頂ければ助かります。
 宜しく御願い致します。

 ---------
 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Const TargetPath As String = "C:\ABC"  

    Dim FSO As Object
    Dim F As Object
    Dim myStr1 As String
    Dim myStr2 As String

    If Target.Row >= 3 And Target.Row <= 502 Then          

    myStr1 = Range("E" & Target.Row).Value                    
    myStr2 = "_2017"                                       

    Set FSO = CreateObject("Scripting.FileSystemObject")

    For Each F In FSO.GetFolder(TargetPath).Files
            If InStr(F.Name, myStr1) * InStr(F.Name, myStr2) Then
                CreateObject("Shell.Application").ShellExecute F
            End If
        Next F
    End If
 End Sub

(ケニヤ) 2018/06/05(火) 21:33


myStr1 & myStr2 が含まれるかどうかを調べるのでしょう。
 
あとは、A列以外だと直ぐ抜けるとか、
Target.Offset(0,1).Value が "" なら直ぐ抜けるとか、
微修正すればよいのでは?
開くときに F.Pathとしたほうが安全かも。

(γ) 2018/06/05(火) 21:58


Private Sub Worksheet_Change(ByVal Target As Range)
    Const sPath As String = "C:\ABC\xxxxx_2017.xlsx"
    Dim myPath As String
    Dim wb As Workbook

    If Target.CountLarge > 1 Then Exit Sub
    If Intersect(Me.Range("A3:A502"), Target) Is Nothing Then Exit Sub

    myPath = Replace(sPath, "xxxxx", Target.Offset(, 4).Value)

    On Error Resume Next
    Set wb = Workbooks.Open(myPath)
    On Error GoTo 0

    If wb Is Nothing Then
        MsgBox "ファイルが存在しません。"
    End If
End Sub

すごい乱暴ですが、
「開く命令をとりあえず出してみて、無かったらエラーだろ?」
という考え方が出来ます。まぁDir関数とかFSOとかで真面目にチェックするのもあり?
「ファイル 存在確認 VBA」で検索したらいいかと。。。
あ、もしかしてエクセルファイルじゃないものを開くのかな???
そうなら、その辺は調べてみてください。

>何かしたら変な動作をするのではないかという不安でしょうか・・・。
この辺は頭でっかちになるより、経験で覚えればいいのではないでしょうか?
人間、どんなことをしでかすか想像がつきません。

(まっつわん) 2018/06/05(火) 22:27


 γさん、もう少しヒントをください。できればヒントを基に調べられる程度の具体的な説明が有り難い。
 まっつわんさん、エクセル以外も開きます。その辺を調べられないので相談しているんですが・・・。
(ケニヤ) 2018/06/05(火) 22:32

 >まっつわんさん、エクセル以外も開きます。
そうなんですね。そうならそうと書いてくれないと、、、ファイルと書いてあるから、
エクセルファイルだろうと思いましたが。。。

 >その辺を調べられないので相談しているんですが・・・。
ん?出来てると思ったけど?

エクセル VBA 他のソフトのファイルを開く

で調べたらでるけど。。。?

https://tonari-it.com/excel-vba-open-file-shell-application/#toc6

ファイル 存在確認 VBA
http://officetanaka.net/excel/vba/file/file06.htm

(まっつわん) 2018/06/05(火) 22:54


 ちょっと修正してみましたけど、どんな展開になりますか?

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     Const TargetPath As String = "C:\ABC"

     Dim FSO As Object
     Dim F As Object
     Dim myStr1 As String
     Dim myStr2 As String
     Dim myStr3 As String

     If Target.Row >= 3 And Target.Row <= 502 Then
         Cancel = True

         myStr1 = Range("E" & Target.Row).Value
         If myStr1 = "" Then
             Exit Sub
         Else

             myStr2 = "_2017"
             myStr3 = myStr1 & myStr2

             Set FSO = CreateObject("Scripting.FileSystemObject")

             For Each F In FSO.GetFolder(TargetPath).Files
                 If InStr(F.Name, myStr3) Then
                     If InStr(UCase(F.Name), ".XLS") Then
                     CreateObject("Shell.Application").ShellExecute F
                     End If
                 End If
             Next F
         End If
     End If
 End Sub

(半平太) 2018/06/05(火) 23:22


半平太さん、有り難う御座います。
試しつつ、コードの違いを切欠に勉強してみます。
取り急ぎ御礼まで。
夜にまた御報告します。
(ケニヤ) 2018/06/06(水) 07:15

 半平太さん、勉強させて頂きました。
 頂戴したコードと自分のコードを比較して、一部修正したところ上手く参りました。
 異なる箇所の幾つかと Cancel = True の意味合いが分からないところですが、
 これは少しずつ調べてみたいと思っております。
 あらためて有難う御座います。
(ケニヤ) 2018/06/06(水) 22:22

コメント返信:

[ 一覧(最新更新順) ]


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