こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【Excel VBA】ファイル名が一定でないファイルの指定方法

Excel2003を使用しています。

メールに添付されてくるExcelファイル(A)のデータを印刷するために、レイアウト等を整えたファイル(B)に値のみコピーというマクロをファイル(B)に作成したいと思っています。

この作業は、ファイル(A)とファイル(B)を並べて作業しますが、毎回メールに添付されてくるファイル(A)の名前が一定ではなく、ファイル名に日付が入っています。『2.07○○○.xls』のような感じですので、ファイル(B)にコードを記述するときに、Excelで開いているもう1つのファイルといったような指定の仕方は可能でしょうか?

やはり、きちんと決まったファイル名でないと不可能であれば、添付されてきたファイルを、ある名前で一旦どこかに保存して…と考えていますが、もし、上記のような指定方法ができるのであれば、教えていただきたいと思い、質問させていただきました。

投稿日時 - 2008-02-07 11:58:44

QNo.3752718

暇なときに回答ください

質問者が選んだベストアンサー

こんにちは。

オープンしているブックが

 ファイル(A)
 ファイル(B)

の2つなら、例えば Workbooks(Index) でとるとか。

Sub SampleProc()

  Dim wb As Workbook
  Dim i As Long
  
  If Workbooks.Count <> 2 Then Exit Sub
  For i = 1 To 2
    Set wb = Workbooks(i)
    If Not wb Is ThisWorkbook Then
      Exit For
    End If
  Next
  MsgBox wb.Name

End Sub

投稿日時 - 2008-02-07 12:35:10

お礼

KenKen_SP さん、こんにちは。
いつもお世話になっております。

いろんな方法があるのですね。勉強になります。
記載していただいたサンプルコードを試してみました。
…が、何も起こりませんでした(^_^;)
てっきり、ThisWorkbook ではないファイル名が表示されると思っていたのですが、なぜなんでしょう??

投稿日時 - 2008-02-07 17:22:24

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

> メールの添付ファイル欄から直接開いた状態では、参照できていない
> のでしょうか…?

当方では問題なく、ThisWorkbook 以外のブック名が表示されますが...
調べるなら、

Dim wb As Workbook
For Each wb in Workbooks
  MsgBox wb.Name
Next

などとして、Workbooks コレクションを回して目的のブック名が表示される
かチェックして下さい。

これで表示されないのであれば、別プロセスの Excel.exe 上のブックである
可能性が高いので、開き方についても再検討が必要です。

ちなみに、*.xls ファイルを DBL クリックして開いた場合、都度新規 Excel
が立ち上がるような設定にしてます?

 # たまに居ますので。。こういう設定にしている人

投稿日時 - 2008-02-09 00:57:41

お礼

KenKen_SP さん、こんにちは。
お礼が遅くなり申し訳ありません。

アドバイスいただいたように、Workbooks コレクションを回してチェックしたところ、目的のブック名は表示されたのですが、『PERSONAL.XLS』も表示されました…。

ということは、前回と同じ状況でチェックしましたので、ファイル(A)とファイル(B)の2つしか開いていないと思っていたのは、間違いだったということですよね?(^_^;)
PERSONAL.XLS は、画面上には出ていないのですが。。。

投稿日時 - 2008-02-13 16:54:09

ANo.7

#4 お礼欄について

前提として、ファイル(A)、ファイル(B)の2つのみを開いた状態で
コードを実行するものとしています。したがって、

> If Workbooks.Count <> 2 Then Exit Sub

ブックが1つ、あるいは3つ以上開いた状態ではここで終了します。
また、

> Set wb = Workbooks(i)

Workbooks(Index) で参照できるのは、同一プロセスにあるブックのみ
です。つまり、VBA を実行している Excel.exe とは別の Excel.exe で
開かれているブックは参照できません。

上記以外に、

> …が、何も起こりませんでした(^_^;)

という可能性は考えにくいのですが....

投稿日時 - 2008-02-08 00:44:47

お礼

KenKen_SP さん、こんにちは。
再度の回答ありがとうございます。

>前提として、ファイル(A)、ファイル(B)の2つのみを開いた状態で
コードを実行するものとしています。

これは、コードの内容でわかりましたので、確認しました。
2つのみ開いた状態でマクロを実行しました。

>Workbooks(Index) で参照できるのは、同一プロセスにあるブックのみ
です。つまり、VBA を実行している Excel.exe とは別の Excel.exe で
開かれているブックは参照できません。

ファイル(A)のほうは、メールに添付されてきたExcelファイルなのですが、メールの添付ファイル欄から直接開いた状態では、参照できていないのでしょうか…?
上記のアドバイスをいただいて、このへんに問題があったのかなと思ったのですが、いかがでしょうか?

投稿日時 - 2008-02-08 17:24:16

ANo.6

vbのヘルプで
Dir
を参照してみてください。

' 指定した拡張子を持つファイル名を返します。複数の *.INI ファイル
' が存在すると、最初に見つかったファイル名を返します。
MyFile = Dir("C:\WINDOWS\*.INI")

' 引数を指定せずに再度 Dir 関数を呼び出すと、
' 同じフォルダにある次の *.INIファイルを返します。
MyFile = Dir

基本的には上記です。
MyFile = Dir("D:\MyData\207*.xls")
MyFile = Dir("D:\MyData\207????.xls")
というような。

こういうことではなかったかな。

投稿日時 - 2008-02-07 18:15:48

お礼

再度の回答ありがとうございます。

ワイルドカードで指定するほうのファイルがメールに添付されているファイルなので、その添付ファイルが保存されているフォルダを指定してやれば、教えていただいた方法でできるのでしょうね。

丁寧に説明していただいて助かりました。
ありがとうございました。

投稿日時 - 2008-02-08 17:18:36

ANo.5

ファイル(B)のどこかのセルにファイル(A)のブック名を入力して
マクロで使えばいいだけでは?

日付が昨日の日付限定なら
BOOKA = Format(Date-1,"m.dd") & "FILE_A.XLS"
とする手もありますし

投稿日時 - 2008-02-07 12:48:46

お礼

回答ありがとうございます。

>ファイル(B)のどこかのセルにファイル(A)のブック名を入力して

最終手段として、↑の方法で…と思っていました。
日付も規則性はないのですが、昨日の日付など限定されるようならば、教えていただいたような方法もあるのですね。勉強になりました。

投稿日時 - 2008-02-07 17:25:23

ANo.3

マクロの起動方法によりますが、
ActiveWorkbookとThisWorkbookを利用してみては?
(A)をアクティブにし、(B)のマクロを起動する。
キーボードのショートカットからならできるはずです。

投稿日時 - 2008-02-07 12:35:06

お礼

回答ありがとうございます。

>ActiveWorkbookとThisWorkbookを利用してみては?
>(A)をアクティブにし、(B)のマクロを起動する。

なるほど、ファイル(A)から(B)のマクロを実行するわけですね。
この方法で、コードを書いてみたところ、うまくいきました。

ありがとうございました。

投稿日時 - 2008-02-07 17:19:43

ANo.2

どうもです。
保存先フォルダーにファイルAとBしかなければ
ファイル名を変数にして、開いているエクセルのファイルのファイル名を所得してIF文でAならマクロ実行、Bならスルー
って感じでは?
あまりスマートではありませんが・・・・・

投稿日時 - 2008-02-07 12:28:59

お礼

回答ありがとうございます。

>保存先フォルダーにファイルAとBしかなければ

残念ながら、ファイル(B)のほうには、他にもファイルがありまして…。他の方の回答も参考にさせていただきながら、もう少し考えてみます。

ありがとうございました。

投稿日時 - 2008-02-07 17:17:35

ANo.1

ワイルドカードで指定するのはだめですか。
『*』ですべてのファイル、『*.xls』ですべての.xlsファイル、『2.07???.xls』で2.07の後3文字の.xlsファイル、『2.07*.xls』で2.07の後任意の文字数の.xlsファイル
が指定できるとおもいますが・・・。

投稿日時 - 2008-02-07 12:18:07

お礼

回答ありがとうございます。

ワイルドカードで指定する場合は、ファイル(A)が保存されているフォルダの指定等も必要になってくるのでしょうか?

メールに添付されて送られてくるファイル名は、ある程度の規則性がありそうなので、教えていただいた方法でも試してみたいと思い、ヘルプや参考書を見てみたものの、実際にはどのように記述すればいいのかイマイチ理解できなくて…。

投稿日時 - 2008-02-07 17:15:24

あなたにオススメの質問