プロが教える店舗&オフィスのセキュリティ対策術

Excel2010で以下のようにwindowsオブジェクトのcaption判定をしているのですが、
エクセルで表示される名前とcaptionの値が不一致になります。

wd.Captionの値をwatchしたところ、
wd.Caption:(GIP)エクセルシート・・・・.xls
wName :[GIP]エクセルシート
と、”[]”が”()”に変わってました。
エクセル内のウィンドウの左上で表示されるのは、[GIP]エクセルシート・・・.xlsと
表示されてるのですが、何故かcaptionの値だけ違っており、見つけることができません。
何か制約事項があるのでしょうか。

'検索ウィンドウ名
wName="[GIP]エクセルシート"
'ウィンドウ発見フラグ
wdflag = False
For Each wd In Windows
If InStr(wd.Caption, wName) > 0 Then
wbn = wd.Caption
wdflag = True
Exit For
End If
Next

If wdflag = False Then
MsgBox "ウィンドウがみつかりません。", vbCritical + vbOKOnly, "Not found!!!"
Exit Sub
End If

A 回答 (2件)

こんにちは。



この件の問題点は、不適切なブック名にあります。
決してバグではありませんし、VBAというよりは、Excelの仕様に関わります。
ファイル名はユーザーの好き勝手に付けられるものではなくて
OS:オペレーティングシステム
Excel:アプリケーション
それぞれに命名規則があるということはご理解頂けるものと思います。
この場合は、Excelのブック名には用いることの出来ない文字
"["と"]"が使われていることが問題になります。
Excelにとって角括弧は、数式上で別のブックを参照する際に、
[ブック名]のように表記し、「角括弧の内側にブック名を記してある」
というように、特別な意味を持つ記号です。

実際、XL2010で、新規のブックを[名前を付けて保存]する際に、
[GIP]エクセルシート.xls
という名前を指定しようとすると、警告ダイアログが表示されて
 ファイルにアクセスできませんでした。次のいずれかを行ってみてください。
 ・ 指定したフォルダがあることを確認します。
 ・ ファイルを含むフォルダが読み取り専用になっていないことを確認します。
 ・ 指定したファイルの名前に次のいずれかの文字も含まれていないことを確認します : < > ? [ ] : | *
 ・ ファイル名およびパス名が半角で 218 文字より長くないことを確認します。
と表示されます。
つまり、角括弧を使ったブック名を指定して保存することを禁じています。
ブック名に角括弧を指定できるのは、エクスプローラから直接ファイル名を書き換えた場合になります。
[GIP]エクセルシート.xlsと名前を変更したなら、ブックを開くことも参照することも可能ですが、
他のブックから数式で参照する場合でも、
='[(GIP)エクセルシート.xls]Sheet1'!A1
のように、別のブックを参照していることを示す角括弧と明確に区別をする意味で、
ブック名にある角括弧[]を括弧()に置換して表示することになります。
そうしなければ、システムとして正常に機能しない、ということは、理解できると思います。
ウィンドウのキャプションは、
表示する文字列自体が何らかの制御に関連付けられている訳ではありませんから、
忠実に文字列としてのファイル名を表示しますが、
内部的には、制御(約物)記号である角括弧[]を括弧()に置換しています。

以上の理由から、ご提示の記述については、
アプリケーションの仕様に合わせる形で、
wName="(GIP)エクセルシート"
のように括弧()に置換した上で検索するしかありません。

尚、
[GIP]エクセルシート.xls
というブックと
(GIP)エクセルシート.xls
というブックとをExcel2010は判別しませんし、
同時に開くこともできません。
また、
[GIP]エクセルシート.xls
というブックをそのままの名前で上書き保存することは出来ますが、
他のフォルダ等に同じ名前で[名前を付けて保存]しようとしても、
候補として表示されるのは、
(GIP)エクセルシート.xls
になります。

私からの説明としては以上です。
納得いかない面もあるかと思いますが、何分にも仕様上のことですので
ありのまま理解につとめてくださいませ。⁓
    • good
    • 0
この回答へのお礼

丁寧な説明ありがとうございます。
該当ブックを保存したのが自分ではないために、エクセルから保存したのか、エクスプローラからファイル名だけを変更したのかわからない(恐らくは後者)のですが、エクセルの仕様であるということがはっきりしただけでOKです。
何らか判定、取得方法が間違ってるかと思ったので質問させて頂きました。
[]を()で読み替えるようにしたいと思います。

お礼日時:2014/03/14 17:19

こんばんは。



>[GIP]エクセルシート・・・.xlsと
>表示されてるのですが、何故かcaptionの値だけ違っており、見つけることができません。
>何か制約事項があるのでしょうか。

基本的には、ファイル名の規則として、Excelでは、[] 角括弧は使えないはずです。それは、#1さんが書いているとおりですが、ただ、正直なところは、意図的にCaptionを変えているとか、そのあたりは、ご質問者側の事情だろうし、それを質問されても、こちら側では分かりません。

>Excel2010で以下のようにwindowsオブジェクトのcaption判定をしているのですが、

もうひとつは、マクロをみると、ファイル(ブック名)名を検索しないで、Window のCaption名を検索するのはなぜか、今ひとつ理解できません。ありえないコードはあるものの、一般的ではありません。ExcelのWindow は、一つのブックにいくつも存在するものですから、通常、Workbooks で、ループして、その中でNameを取るなどします。キャプションを取るのは、コントロール・オブジェクトがほとんどです。(ただし、私個人は、違う書き方をすることもあります。)

後は、お決まりなのですが、
>For Each wd In Windows
ではなく、WorkbookのWindowのCaption を探すのではないかと思います。
元のマクロとおなじようでいて、違います。

For Each wb In Workbooks で、wb.Windows(1).Captionを取るなり、Book名を取るなり、どちらかだと思います。(wd は、Word と見間違うので変えました)

>wName="[GIP]エクセルシート" 調べるのでしたら、最初に、ローカルウィンドウやマクロでキャプションやブック名で、名前の確認を取ってからでもよいのではないでしょうか?

別に、こちらの書いた内容を無視しても構いませんが、もし、その事情が正しいなら、別なマクロが最初に動いているかもしれません。
少なくとも、今のところ、「、”[]”が”()”に変わってました」という再現性が得られませんでした。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
>ファイル(ブック名)名を検索しないで、Window のCaption名を検索するのはなぜか、今ひとつ理解できません。ありえないコードはあるものの、一般的ではありません。

開いているファイルを検索するのにWindowsを使いましたが、これは一般的ではないのですね。
勉強不足ですね。ご指摘ありがとうございます。

お礼日時:2014/03/14 17:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!