戻る  □一般操作のサロン  □ 使用方法  □ 新着記事  □ 新規に質問する!  □ トピック一覧  □ 検索  □ 過去ログ
[ 最新記事及び返信フォームをトピックトップへ ]
このトピック参照回数 :
エクセルVBAでショートカットファイルを作成

    [195701] エクセルVBAでショートカットファイルを作成-

    ■親トピック/記事引用/メール受信=OFF■

    □投稿者/ たかこ -(2023/04/22(02:23))
    □U R L/
      現在、WshShellオブジェクトのCreateShortcutメソッドを使って
      下記のように作成しています。
      
      Set objShortcut = objWshShell.CreateShortcut("lnkファイルフルパス")
      With objShortcut
          .TargetPath = "実ファイルフルパス"
          .Save 
      End With
      
      lnkファイルフルパスに260バイトより長いパスを指定すると
      エラーが発生してしまいます。
      
      Windowsには256文字より長いパスは扱えないという制限があるようですが、
      問題が発生するパスは256文字よりは短いです。
      ※Windowsは文字数での制限ですが、
       CreateShortcutの引数はバイト数で制限がかかっているようで、
       日本語(2バイト文字)が含まれていると、
       256文字制限を満たしていても、260バイト制限はすぐにオーバーしてしまいます。
      
      260バイトより長い(ただし256文字よりは短い)パスについて、
      ショートカットファイルを作成する方法はありませんでしょうか?
      
      よろしくお願いします。


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195702] Re[1]: エクセルVBAでショートカットファイルを作成-

    記事引用/メール受信=OFF■

    □投稿者/ MK -(2023/04/22(18:55))
    □U R L/

      参考まで。

      ht tps://knjname.hateblo.jp/entry/2015/01/27/220219




    [195703] Re[2]: エクセルVBAでショートカットファイルを作成-

    記事引用/メール受信=OFF■

    □投稿者/ kazuo -(2023/04/22(21:35))
    □U R L/
      一旦制限内のパスで作成しておき、移動するという手もありそうです。
      
      Sub 一例()
          Dim s As String, lnk As String
          Dim sPath As String, fName As String
          
          s = String(100, "あ") & "\"
          With CreateObject("WScript.Shell")
              sPath = .SpecialFolders("Desktop")
              ChDir sPath
              lnk = "あああああああ.lnk"
              Set objshortcut = .CreateShortcut(lnk)
              With objshortcut
                  .TargetPath = Application.Path
                  .Save
                  fName = .FullName
                  MkDir s '合計200バイト以上
                  ChDir s
                  MkDir s '合計400バイト以上
                  ChDir s
                  With CreateObject("Scripting.FileSystemObject")
                      .getfile(fName).Move ".\"
                  End With
              End With
          End With
          ChDir sPath
      End Sub
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195704] Re[3]: エクセルVBAでショートカットファイルを作成-

    記事引用/メール受信=OFF■

    □投稿者/ まる2021 -(2023/04/23(00:06))
    □U R L/
      「長いパス名」から「短いパス名」を取得するにはUnicode系のAPI関数を呼び出し、パスの先頭に "\\?\" を付与します。
      h ttps://learn.microsoft.com/ja-jp/windows/win32/api/fileapi/nf-fileapi-getshortpathnamew
      又、シンボリックリンクを使えば、ショートカット同等の事ができます。
      「Unicode系のAPIて何」というレベルなら、諦めてください。
      
      Private Declare Function CreateDirectoryW Lib "kernel32.dll" ( _
          ByVal lpPathName As LongPtr, _
          ByVal lpSecurityAttributes As LongPtr) As Long
      Private Declare Function GetShortPathNameW Lib "kernel32" ( _
          ByVal LongPath As LongPtr, _
          ByVal ShortPath As LongPtr, _
          ByVal cchBuffer As Long) As Long
      Function ShortPathNameW$(ByVal LongPath$)
          Dim ret&, strBuffer$
          strBuffer = String(260, vbNullChar)
          ret = GetShortPathNameW(StrPtr("\\?\" & LongPath), StrPtr(strBuffer), Len(strBuffer))
          If ret = 0 Then Exit Function
          ShortPathNameW = Mid$(strBuffer, 5, ret - 4)
      End Function
      Sub 長い名前のショートカット作成()
          Dim LongPath$, ShortPath$, TargetPath$, objShortcut As Object, i&
          LongPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
          TargetPath = LongPath
          For i = 1 To 10
              LongPath = LongPath & "\01234567890123456789012345678901234567890123456789"
              Call CreateDirectoryW(StrPtr("\\?\" & LongPath), 0)
          Next
          ShortPath = ShortPathNameW(LongPath) & "\ショートカット.lnk"
          If ShortPath <> "" Then
              Set objShortcut = CreateObject("WScript.Shell").CreateShortcut(ShortPath)
              With objShortcut
                  .TargetPath = TargetPath
                  .Save
              End With
          End If
      End Sub


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195705] Re[4]: エクセルVBAでショートカットファイルを作成-

    解決!!ありがとうございました! / 記事引用/メール受信=OFF■

    □投稿者/ たかこ -(2023/04/23(01:41))
    □U R L/
      みなさん、ありがとうございます。
      
      まる2021さんの方法を実行してみたところ、
      ショートカットファイルが問題なく作成できていそうです。
      ただデバッグ実行すると、不可解な動作をします。
      
      「長い名前のショートカット作成」関数内に
      キャレット(キーカーソル)を当てて、F8キーを押すと、
      1行ずつステップ実行できますが、
      (F8キーを押すたびに黄色い行が1行ずつ進む)
      
      Set objShortcut = CreateObject("WScript.Shell").CreateShortcut(ShortPath)
      の行まで進んで、F8キーを押すと、
      With objShortcut
      の行に行かずに、終了してしまいます。
      ただ、「ショートカット.lnk」は作成されています。
      
      ----------
      
      kazuoさんの
      >一旦制限内のパスで作成しておき、移動する
      がシンプルで無難かな。。。
      
      一旦解決とさせていただきます。
      
      #まだ時々確認しますので、
      #上記不可解な動作が解消(原因が分かる)ようであれば、
      #まる2021さんの方法を使いたいと思います。
      
      よろしくお願いします。
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195706] Re[5]: エクセルVBAでショートカットファイルを作成-

    記事引用/メール受信=OFF■

    □投稿者/ まる2021 -(2023/04/23(06:27))
    □U R L/
      ちょと、恥ずかしいミスがあったので修正。
      ↑だと最後のIf文が、毎回通ってしまうので、以下にして下さい。
      デバッグの件は、ちょっと、わからないです。
      こちらでは普通に次の行に移行します。
      
      Sub 長い名前のショートカット作成()
          Dim LongPath$, ShortPath$, TargetPath$, objShortcut As Object, i&
          LongPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
          TargetPath = LongPath
          For i = 1 To 10
              LongPath = LongPath & "\01234567890123456789012345678901234567890123456789"
              Call CreateDirectoryW(StrPtr("\\?\" & LongPath), 0)
          Next
          ShortPath = ShortPathNameW(LongPath)
          If ShortPath <> "" Then
              Set objShortcut = CreateObject("WScript.Shell").CreateShortcut(ShortPath & "\ショートカット.lnk")
              With objShortcut
                  .TargetPath = TargetPath
                  .Save
              End With
          End If
      End Sub
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他




    [195707] Re[6]: エクセルVBAでショートカットファイルを作成-

    記事引用/メール受信=OFF■

    □投稿者/ たかこ -(2023/04/23(08:07))
    □U R L/
      LongPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
      で
      LongPath
      に
      C:\Users\xxxx\Desktop
      がセットされた状態で実行すると
      ShortPath = ShortPathNameW(LongPath)
      で
      ShortPath
      に
      C:\Users\xxxxx\Desktop\012~1\012~1\012~1\012~1\012~1\012~1\012~1\012~1\012~1\012~1
      がセットされますが
      
      
      LongPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
      を
      LongPath = "D:\xxxxx\●●●"
      に書き換えて
      LongPathに
      D:\xxxxx\●●●
      がセットされた状態で実行すると
      ShortPath = ShortPathNameW(LongPath)
      で
      ShortPath
      には
      ↑のようにショートパスにならずに、
      ロングパスのままがセットされてしまいます。
      
      -------------
      
      F8キーで1行ずつ処理を進めることはできませんね。
      
      ただ、
      With objShortcut
      の行にF9キーでブレイク(茶色)させると、そこで処理が一時中断するので、
      
      Set objShortcut = CreateObject("WScript.Shell").CreateShortcut(ShortPath & "\ショートカット.lnk")
      の行でブレイク(黄色)されている状態でF8キーを押すと、
      次の行に行くのではなく、ステップアウトしてしまっているようです。
      


      この記事にはVBAのコードが含まれています。

      緑の太文字→注釈
      茶色の太文字→条件分岐
      赤の太文字→ループ
      青の太文字→その他



このトピック内容の全ページ数 / [0]

このトピックに書きこむ
Name/
E-Mail/

└>このツリーのレス記事をメールで受信しますか? YES/ NO/
Title/
URL/
Comment/ 通常モード->  図表モード-> (←の場合適当に改行を入れて下さい)
タグが使用できます。例 ⇒ <font color="blue">文字</font>
解決!!ありがとうございました! 解決       保留中です・・・ 保留        迷宮入りorほかあたって見ます・・ 迷宮入       すいませ〜ん。誰か〜! Help! ←※回答者専用
解決したらチェック       保留(コードテスト中など・・)         解決不可orレスが全く付かなくてほかのサイトに行くときなど・・
削除キー/
(半角8文字以内) 


- Child Forum -
Edit:ゆう-G