「Application.Caller の文字数制限について」
https://www.moug.net/faq/viewtopic.php?t=83078
に関連して、ShortNameについて若干の補足をしておきます。
(1)
| Windows Vista 以降、パフォーマンスやセキュリティ、ディスクI/O削減の観点から、
| ShortNameの自動作成は無効にされていることが多いです。
| 特に、
| ・システムドライブ(C:)は従来のアプリとの互換性のため有効なことが多い
| ・データドライブ(D:, E: など)は無効化されていることが多い
| という傾向があります。
(2)
| ドライブ単位でShortNameが利用できるかどうかは決められています。
| 管理者権限で fsutil 8dot3name query D: というコマンドを発行すると使用可否がわかります。
(dir /X で確認するほうが手っ取り早いですけど。)
(3)
なお、有効化・無効化の切り替え(必要な場合)が可能だそうです。
| 管理者としてコマンドプロンプトを開き、以下のように設定可能です。
| fsutil 8dot3name set D: 0 ← 有効化
| fsutil 8dot3name set D: 1 ← 無効化
| ⚠注意:既存のファイルに retroactive に 8.3名が付与されるわけではありません。
(今後作成されるファイルについて有効になるということでしょうか)
D:\にショートネームが使えても余り益もないですし(ぶっちゃけ過ぎかも)、
リスクもあるかもしれないので、非推奨です。
なお、上記の引用はネット上のものからです。
-------
質問の最初に戻ると、
シートに挿入した画像の名称は30文字以下で設定し、
それと、元のファイル名の対応表を持つのが最適でしょう。
その際、シートに挿入した画像の名称の候補として
8.3形式のShortNameを使用すること
も可能です。
対応表を持つのが最適ですが、仮にそれが無い場合でも、
ShortName(とフォルダのShort名)から ShortPath を作り、そこからLongPathを再現することが可能です。
参考になるかもと思い、その方法をメモしておきます。
Option Explicit
'32bit Officeの場合
Declare Function GetLongPathNameW Lib "kernel32" ( _
ByVal lpszShortPath As Long, _
ByVal lpszLongPath As Long, _
ByVal cchBuffer As Long) As Long
Declare Function lstrlenW Lib "kernel32" ( _
ByVal lpString As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
ByVal Destination As Long, _
ByVal Source As Long, _
ByVal Length As Long)
' システムに依存せず Unicode で安全に LongPath を得る関数
Function GetLongPathUnicode(ByVal shortPath As String) As String
Dim buffer As String
Dim bufferSize As Long
Dim resultLen As Long
' 初期バッファ確保(MAX_PATH: 260)
bufferSize = 260
buffer = String(bufferSize, vbNullChar)
' API呼び出し(Unicode対応)
resultLen = GetLongPathNameW(StrPtr(shortPath), StrPtr(buffer), bufferSize)
If resultLen > 0 And resultLen <= bufferSize Then
GetLongPathUnicode = Left$(buffer, resultLen)
Else
GetLongPathUnicode = ""
End If
End Function
Sub test()
Dim shortPath$, longPath$
'過去に作成したファイルのショートネームとフォルダのショートネームから
'ショートパスを作れば、それを元にして、Long形式のパス名を知ることができます。
shortPath = "C:\Users\XXXXX\Pictures\SAVEDP~1" & "\" & "2025-0~2.PNG" '仮の例
longPath = GetLongPathUnicode(shortPath)
Debug.Print shortPath
Debug.Print longPath
End Sub