Excel (VBA)

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

 
(指定なし : 指定なし)
「Application.Caller の文字数制限について」との関連事項について
投稿日時: 25/07/09 18:01:10
投稿者: simple

「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

回答
投稿日時: 25/07/10 10:37:58
投稿者: Suzu

simple さん わざわざ スレッドを立てて頂きありがとうございます。
 
Cドライブ限定という意味は、
セキュリティーの兼ね合いもあり Cドライブ以外は無効になっている事が多いという事なのですね。
 
ShortPathからの、Path取得もありがとうございます。
FSOでは無理そうだったですが、文字コードを考えれば、API 使った方がよさそうですね。
 
 ShortName(Path)が、事前に作成されている事も初めて知りました。
 
改めてありがとうございます。
 
 
 
 
WinArrow さん
写真選択方法として、Excelのシート上にVBAを使い写真をあらかじめサムネイルとして配置しておき
その中から、画像を選択させる際に、Caller を使うという事なのですね。
 
 
当方も写真アルバムを作る事があり、
省庁の基準に縛られるまでの工事では ないのですが
一応、写真の管理基準等は準拠する様にしています。
(ファイル解像度、サイズ、ファイル名規則、フォルダ構造、保存期間 等も定められています。)
 
写真削除 は、コピーデータの事だとは思いますが
基準準拠も考慮するなら、ファイル名の命名規則がある以上
ファイル名を変える方向の方が良いと思います。
現状、そこまで求められていないかもしれませんが・・・
 
当方もExcelでアルバムを作る事がありますが
写真数が多く、撮影リストを作らずに撮影する案件もあり、
整理されていない状態の 写真群から選択する事もあるので
Excelのシートに、写真をサムネイル配置させシートをスクロールさせるより
写真が見やすいファイラーと、コモンダイアログを併用し写真選択しています。
 (後で、アルバムの配置順番を変えるときには地獄・・
    操作をExcelでするより・・と思いつつそのまま(笑))

投稿日時: 25/07/13 17:25:41
投稿者: simple

私の用事は終了したのですが、閉じてしまってよいものか迷っています。ご返事があるとよいのですが。

投稿日時: 25/07/14 17:01:34
投稿者: simple

余り待ちすぎると私自身が閉じ忘れる恐れがありますので、いったん閉じます。
Suzuさんコメント有難うございました。