Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2019)
Application.Caller の文字数制限について
投稿日時: 25/07/08 10:56:34
投稿者: WinArrow

ワークシートに複数の画像(写真)を貼付け、各々のマクロを登録しました。
画像には各々を識別する名前を設定してあります。例、写真ファイルのファイル名です
画像の名前が長く、30桁を越えることあります。
 
Application.Callerで画像の名前を取得するコード
Set Shape = Activesheet.Shapes(Application.Caller)
 
で「指定のアイテムがない」エラーが発生します。
確認の結果、Application.Callerの文字数が不足していることが分かりました。
 
制約事項、対処方法など、ご教示をお願いします。

回答
投稿日時: 25/07/08 14:40:45
投稿者: simple

お久しぶりですね。お元気でしょうか。
 
手元で実験してみましたら、画像の.Nameの長さは30文字までのようですね。
ところで画像の名前が長くなるというのは、どのような作り方をされるとそうなるのでしょうか。
 
画像ファイル名の長さに依存するのであれば、ショートネーム(8.3形式。C:\ドライブに限定ですが)を
使う方法が思いつきましたが、元のファイル名の長さは関係ないようです。
名前の付け方によっては、なんらかの工夫ができそうです。(漠然としてますが)

回答
投稿日時: 25/07/08 14:49:21
投稿者: Suzu

引用:
複数の画像(写真)を貼付け、各々のマクロを登録しました。

 
画像をボタン代わりに、VBAを起動している。
 
各々のマクロ というのが、VBAはボタンごとに別のVBAという事なら、
 Callerから呼び出し元を特定する必要は無いでしょうから、
 どこかで共通となっているなり、一部マクロが共通になっているのでしょうか。
 
Caller が、String型の時には、30文字しか返さないのは
仕様でしょうから、ユーザーがどうこうできる話ではないでしょう。
 
 
そうなると、Spape.Name は 30文字を超えないようにするしかないのでは?
 
代わりに、
Shape.Alternative Text プロパティ
Shape.TopLeftCell.Value プロパティ
あたりにファイル名を埋め込むでしょうか。

回答
投稿日時: 25/07/08 15:48:57
投稿者: simple

読み飛ばしていました。 # なにせ暑いもので
ファイル名を使っているんですね。
 
それならショートネーム利用が有効でしょう。(C:ドライブ限定ですが)
http://officetanaka.net/excel/vba/filesystemobject/file09.htm

回答
投稿日時: 25/07/08 17:13:19
投稿者: Suzu

ShortName は 思いつかなかった。
 
simpleさん、『C 限定』 とは どんな理由でしょうか?
Dなり、割り付け済みネットワークドライブで確認してみましたが、見つかりませんでした。
理由をお教え頂ければ幸いです。
 
 
 
 
多分、わざわざ ファイル名にしているという事は ファイルを参照する事があるのでしょうけど
ShortPath や、ShortName から
GetFile を行うと、Path や、Name が 8.3 にて 得られる・・
 
ショートではなく、ノーマル? Parent Path、Name を
得ようと思うと、For Each で 廻すくらいしか思いつかなかったのですけど、それしかないでしょうかね?
 
xlsx や、 jpeg の様な 4文字の拡張子の場合、
ShortName には、拡張子が含まれなくなり、
GetExtensionName では 拡張子も得られなくなる事に注意が必要ですね。
 
 
セキュリティー上、ショートカット名を無効にしている場合もあるみたいですね。
 
C ドライブのショートパス設定が有効になっていないWindows 10 環境に mailto リンクから iNotes を起動できません
https://support.hcl-software.com/csm?id=kb_article&sysparm_article=KB0082478

回答
投稿日時: 25/07/08 18:37:38
投稿者: abec

すこし手間になるかもしれませんが、画像につける名前はシンプルなものにしておき、ワークシートに画像の名前とファイルパスの対応表を作成してそこから読み込むようにしてはどうでしょうか。

投稿日時: 25/07/08 18:48:59
投稿者: WinArrow

みなさん、お久しぶりです。
 
なが〜いファイル名の理由
 
1年間で20〜30件の工事物件があります。
1件につき、全体風景と、個別風景の2枚、これを工事前と工事後の2回に分けて撮影します。
明細リスト1件につき、2枚の関連つけた写真リストを作成する仕事があります。
撮影は明細リストの順番とは限りません。
明細リストの順序番号と写真を紐付けるためのマクロを組んでいます。
担当者は、毎年変わります。
 
私が考えた、紐付け処理の仕組みは、
サムネイルを作成し、サムネイル画像をクリックして、写真用リストに貼り付ける
というものです。明細リストには、工事場所などの説明文はありますが、説明文が正しいという確証はありません。だから、間違って別の番号に紐付けすることもあり得ます。
 
問題が発生したのは、テストデータなんですが、
iPhondeで撮影のファイルですが、デフォルトのアイル名をわざわざ変更したらしくなが〜いファイル名になっていました、規則正しくなっているのでツールを使ったと思われます。
 
以降は、次回にします。

回答
投稿日時: 25/07/08 19:17:30
投稿者: simple

>simpleさん、『C 限定』 とは どんな理由でしょうか?
>Dなり、割り付け済みネットワークドライブで確認してみましたが、見つかりませんでした。
>理由をお教え頂ければ幸いです。
私も理由は知りませんが、Cドライブしか8.3形式ファイル名は持たないのが仕様のようです。
C以外はそうした必要性が乏しいと判断しているのでしょう。
 
ちなみに、Dir /X とすると8.3形式名が表示されます。(C:ドライブ傘下だけです)
また、ファイルサーチでも8.3形式名もマッチの対象になります。
*.XLS で .xlsxにも.xlsmにもマッチするのは、8.3形式ではいずれも拡張子は.XLSだからです。

投稿日時: 25/07/08 23:09:11
投稿者: WinArrow

続き
 
Application.allerが文字列を返す場合、30文字以内は仕様なんですね。
1日悩んでいました。これですっきりしました。
ありがとうございました。
 
テストデーは、2023年度のものです。当時の担当者が勝手にファイル名を変更したと思います。
工事前の写真はファイル名を変更しているのに
工事後の写真はファイル名は、デフォルトの名前となっています。(iPhoneの規定通り)
ファイル名を変更の意図がわかない状況ですが、いまさら、聞いても覚えていないと思います。
ファイル名を画像の名前に使うことに固執しているわけではありませんので、
検証可能な手段を考えます。
関連付けした写真リストが作成できれば、元の写真ファイルは不要と思われるので、
そのあたりも併せて検討しいます。
 
ありがとうございました。