- ベストアンサー
エクセルでワイルドカード文字
エクセル2002使用です。 VBAでワイルドカード文字に使っての検索について教えていただきたいのですが・・・ *が任意の文字列 ?が任意の1文字 であることまでは理解できたのですが、例えば、文字の頭4文字が決まっていてその4文字の後は必ず文字は入りますが、何文字がわからないような場合はどうすればよいのでしょうか? 例えば、「会社情報大日本銀行」を検索したい場合、 「会社情報*.xls」で良いと思っているのですが、うまくできません。 (半角入力は確認してます) よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#4です。 Range の expression を 明示的に指定する必要があります。 ActiveXコントロールで使う場合は特に注意が必要です。 括弧内の Rangeの前にも . があるのに注意して下さい。 好みの問題でもありますが、Cells が多いと見ずらいので、 Private Sub CommandButton1_Click() Dim myws As String, i As Integer Dim wb As Workbook myws = Dir("C:\*.xls") If myws <> "" Then Set wb = Workbooks.Open("C:\" & myws) With wb.Worksheets("Sheet1") .Range("A1:AX" & .Range("A65536").End(xlUp).Row + 1).Copy _ Destination:=Workbooks("原紙.xls").Worksheets("sheet1").Range("A1") ' ↑の変わりにデータの持ち方によっては↓でも出来るかも ' .UsedRange.Copy Destination:=Workbooks("原紙.xls"). _ ' Worksheets("sheet1").Range("A1") End With Workbooks(myws).Close Else MsgBox "ファイル名が間違っています" End If End Sub あと、Workbooks("原紙") は Workbooks("原紙.xls") にしないと拡張子を表示しているPCでエラーになります。
その他の回答 (6)
- papayuka
- ベストアンサー率45% (1388/3066)
#4です。 せっかくWorkbook型の変数 wb に開いたブックを代入しているので、 End With Workbooks(myws).Close は .Close End With で良いですね。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#2です。 Set fs = Application.FileSearch With fs .LookIn = "C:\" .FileName = "会社情報*.xls" If .Execute > 0 Then MsgBox .FoundFiles.Count &" 個のファイルが見つかりました。" For i = 1 To .FoundFiles.Count MsgBox .FoundFiles(i) Next i Else MsgBox "ファイルは見つかりませんでした。" End If End With て感じでいけると思います。 ちなみに、上のソースは、ヘルプから持ってきて .LookIn = "C:\" .FileName = "会社情報*.xls" を修正しただけのものです。
お礼
早速のご回答ありがとうございました。 わかりました!! お手数をお掛けし申し訳ございませんでした。 今後ともよろしくお願いします。
- papayuka
- ベストアンサー率45% (1388/3066)
Workbooks.Open に * でパスを渡しても開けません。 指定したパス(フォルダ)に 会社情報*.xls は必ず1つのファイルしか無いのでしょうか? もしそうなら下記でも出来ますが、 Sub Test() Dim fPath As String, fName As String fPath = "C:\" fName = Dir(fPath & "会社情報*.xls") If fName <> "" Then Workbooks.Open fPath & fName End Sub 通常なら「会社情報*.xls」を探して複数の場合はUserFormのListBoxか何かで表示し、選択させてから Open するなり、素直に Dialog で選ばせるなりするところでしょう。 Sub Test1() Dim fName fName = Application _ .GetOpenFilename("Excel (*.xls), *.xls") If fName <> False Then Workbooks.Open fName End Sub Dirの他に、既に回答がある FileSearch でも出来ますが、特定環境(具体的には Windows2000 + Excel97)だとバグがあるようで上手く動かない事があります。
お礼
papayuka様早速のご回答ありがとうございます。 大変参考になりました。今回はとりあえずファイルは1つでいけそうですので、#3さんのお礼欄のように記述させていただきました。 ところで、そこにもまた質問をさせていただいたのですが、取得したファイルのセルを取得できません。 もし、お時間ございましたらよろしくお願いします。
- imogasi
- ベストアンサー率27% (4737/17069)
#1です。 補足に関連して。 >ファイルの検索を行いたくてもともと入力されている文字列を探すことはできません。 初めの質問には、「ファイル(名)の検索」とはかいてなかったですね。だからセル検索を例として上げたまでです。 ファイル検索でも、Dir関数か何かで、ファイル名を文字列として取らえ、その文字列を条件に合うかどうかチェックして合わなければ捨てる、合えば何か処理するの繰り返しでしょうから、ロジックは同じでは。ファイル名が1箇所に集まったところは、捉えられない(存在しない?)でしょうから。 >ワイルドカード文字って難しいのでしょうか ワイルドカード文字は*と?ですから、これらを使って 、「うまくできません」の例のコードを上げて見られては どうでしょう。コーディングの質問にコードも見せないで 質問するのは適切に答えられない気がしますが。 INSTRの例を上げたのは、ひょっとして、やりたいことに対して、自由度があるかなと思っただけです。
お礼
mogasi 様 ありがとうございます。 質問もうまくできず申し訳ございません。 まだ、やっとセルの取得くらいが理解できるくらいになった程度で・・・あとは参考書を手にしてやっておりどこまでが常識の範囲かもわからず・・・ ワイルドカード文字も何でもかんでも使えるわけじゃないんですね。今回は、Dir関数を教えていただき、下記のように組みました。 Private Sub CommandButton1_Click() Dim myws As String Dim i As Integer myws = Dir("C:\*.xls") If myws <> "" Then Workbooks.Open "C:\" & myws Worksheets("Sheet1").Activate Range("A1").Activate Range(Cells(1, 1), Cells(Cells(65536, 1).End(xlUp).Row + 1, 50)).Select Selection.Copy Destination:=Workbooks("原紙").Worksheets("sheet1").Range("A1") Workbooks(myws).Close Else MsgBox "ファイル名が間違っています" End If End Sub ところで、上記コードは、標準モジュール内では、問題なく動くのに、Sheet2のモジュール内でPrivate Sub CommandButton1_Click()でイベントプロシージャにするとRange("A1").Activateが取得できません?? 原因が何かあるようでしたらよろしくお願いできませんでしょうか? (標準モジュール内ではsubプロシージャです)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
Application.FileSearch を使って、「会社情報*.xls」のような形でファイルの検索をすることができます。 詳しくはヘルプを見て下さい。
お礼
BLUEPIXY 様 早速のご回答ありがとうございました。 今回は#3さんのようにくまさせていただきました。 ところで、教えていただきましたFileSearchメソッドで Dim myws As FileSearch Set myws = Application.FileSearch With myws .NewSearch .LookIn = "C:\" .Filename = "会社情報*.xls" .FileType = msoFileTypeExcelWorkbooks End With までは調べられたのですが、ファイル名を取得するために myws=の続きをどう記述すれば良いのかわかりませんでした。 もし、よろしければ、ファイル名を取得するための参考例を教えていただけませんでしょうか? (workbooks.open myws では無理でした。。。)
- imogasi
- ベストアンサー率27% (4737/17069)
VBAですか。 無理してワイルドカードを使わずとも、INSTR関数で何とかなるのでは。 シートのA列に文字列を色々入れて、下記実行してみて 考えてください。 sdのところを「会社情報」とかに変えて。 P=1なら左端に、P>1なら第2文字目以右にあり、など 選べるでしょう。 Sub test01() d = Range("A65536").End(xlUp).Row For i = 1 To d p = InStr(Cells(i, 1), "sd") If p >= 1 Then MsgBox p '実際は処理を書く Else End If Next i End Sub 「会社情報」のあとに1文字でも欲しいなら 長さがp+4より長いか聞く。
補足
imogasi様、早速のご回答ありがとうございます。 今回は、ファイルの検索を行いたくてもともと入力されている文字列を探すことはできません。 必ず頭4文字は会社情報で始まるファイル名で保存されていますが、後は具体的な会社名なので何文字になるか分かりません。 workbooks.open "C:\会社情報*.xls" のような感じで使いたいと思っています。 ワイルドカード文字って難しいのでしょうか?
お礼
papayuka 様いつもご丁寧なご指導ありがとうございました。 完璧です。うまくいきました。 質問他にもいろいろとご指摘いただき大変勉強になりました。何分、はじめてVBAをさわるもので、基本的なことがわからずご迷惑をお掛けいたしました。 今後とも何卒よろしくお願いいたします。