ExcelWork.info

Excel(エクセル)のマクロ・VBA・関数・操作などのメモ

特殊フォルダを取得(wsh.SpecialFolders)

   

CreateObject 関数:特殊フォルダを取得(WSH.SpecialFolders)

Windows Scripting Host(WSH)SpecialFolders プロパティを使うと、Windows の特殊フォルダ(マイドキュメントやデスクトップなど)のパスを取得することができます。WSH を使用するには、CreateObject 関数 を使用します。


【構文】

name で指定した特殊フォルダのパスを取得>
Dim wsh [ As Object ]
Set wsh = CreateObject (“WScript.Shell”)
path = wsh.SpecialFolders(findex)


引数・戻り値

  • wsh  ・・・  Windows Scripting Host(WSH)のオブジェクト
  • findex  ・・・  取得したい特殊フォルダ(文字列または値)を指定します。
    ※ 文字列を指定する場合は、 で囲みます(”AllUsersDesktop”)。
    文字列 内容
    AllUsersDesktop 0 すべてのユーザーに共通のデスクトップ
    AllUsersStartMenu 1 すべてのユーザーに共通のスタートメニュー
    AllUsersPrograms 2 すべてのユーザーに共通のプログラムメニュー
    AllUsersStartup 3 すべてのユーザーに共通のスタートアップ
    Desktop 4 ログインユーザーのデスクトップ
    AppData 5 ログインユーザーのアプリ用データ
    PrintHood 6 ログインユーザーのプリンタ
    Templates 7 ログインユーザーの新規作成のテンプレート
    Fonts 8 フォント
    NetHood 9 ログインユーザーのネットワーク
    Desktop 10 ログインユーザーのデスクトップ
    StartMenu 11 ログインユーザーのスタートメニュー
    SendTo 12 ログインユーザーの送る
    Recent 13 ログインユーザーの最近使ったファイル
    Startup 14 ログインユーザーのスタートアップ
    Favorites 15 ログインユーザーのお気に入り
    MyDocuments 16 ログインユーザーのマイドキュメント
    Programs 17 ログインユーザーのプログラムメニュー

  • path  ・・・  findex で指定した特殊フォルダのパス



Windows 特殊フォルダ取得 使用例

サンプルVBAソース


実行結果

特殊フォルダ



 - Excel・ファイルの操作 , , , , ,

Comment

  1. vvv より:

    はじめまして

    デスクトップにMoro というフォルダがあります。
    その中に123.txtと456.txtと789.txtという隠しファイルがあります。
    そのファイルをProgram files (x86)のSakiというフォルダにコピーし、隠し属性を解除したいのですが可能でしょうか?
    また、パソコン毎にユーザー名が変わります。
    そして、メッセージボックスで
    コピーする前にOKとキャンセルボタンを表示し、OKならばコピーし、コピーが終わると完了しました。とメッセージが出て、キャンセルならば中断しました。とメッセージが出るようにすることは、可能でしょうか?
    VBSでしたいのですが可能でしょうか?
    できればコードを提示して頂けるとありがたいです。
    以上、上手く説明できませんがよろしくお願いします。

    • サイト管理人 より:

      コメントありがとうございます。
      VBSは普段殆ど使わないのですが一応作ってみました。
      多分管理者権限で実行しないとエラーが発生します(コピーに失敗)。
      エラー処理は行っていません。

  2. vvv より:

    ありがとうございます。
    感謝、感激です。
    管理人様の言う通り管理者権限で実行しないと、エラーになります。
    管理者権限で実行することは、可能でしょうか?
    また、今は、ファイル一つずつの確認してコピーですが、まとめて確認してコピーすることは可能でしょうか?
    お手数をお掛けしますが見て頂けたら嬉しいです。

    • サイト管理人 より:

      前回も書きましたが、VBSは普段使いません。
      一応自分の環境では動きました。

  3. iP より:

    管理人さん
    はじめまして
    いつも参考にさせて頂いております。

    「VBSは普段使いません。」とのことですが
    質問させて下さい。

    上のコピーのコードを参考に削除する方を作成しているのですが

    C:\Program Files (x86)\bbb\b1.txt
    C:\Program Files (x86)\bbb\b2.txt
    C:\Program Files (x86)\ccc\c1.txt
    C:\Program Files (x86)\ccc\c2.txt
    C:\Program Files (x86)\ddd\d1.txt

    このようにファイルがあります。

    \bbb\、\ccc\、\ddd\の中に対象のファイルが一つでもあれば削除して
    MsgBox “削除を完了しました”
    \bbb\、\ccc\、\ddd\の中に対象のファイルが一つもなければ
    MsgBox “ファイルがありません”

    このようにしたいのですが、どのように修正すれば良いのでしょうか?
    ご迷惑をお掛けいたしますが、ご教授願います。

    以下コードです。
    見て頂ければわかると思うのですが、最初にOKを押すと
    「ファイルがありません」と表示され、
    またOkを押すと「ファイルがありません」が続きます。
    最後に「削除を完了しました」と表示されます。

    Option Explicit

    Dim fso, wsh
    Dim FileNameFrom, FileNameTo
    Dim ArrayFileNames, myDir1, myDir2, f
    Dim Result, Prompt, Buttons, Title
    Dim obj

    ‘管理者としてVBS実行
    Set obj = Wscript.CreateObject(“Shell.Application”)
    if Wscript.Arguments.Count = 0 then
    obj.ShellExecute “wscript.exe”, WScript.ScriptFullName & ” runas”, “”, “runas”, 1
    Wscript.Quit
    end if

    Set fso = CreateObject(“Scripting.FileSystemObject”)
    Set wsh = CreateObject(“WScript.Shell”)

    myDir1 = “\bbb\”
    myDir2 = “\ccc\”
    myDir2 = “\ddd\”

    ArrayFileNames = Array(“b1.txt”,”b2.txt”,”c1.txt”,”c2.txt”,”d1.txt”)

    Prompt = “削除しますか?”
    Buttons = vbOKCancel + vbInformation + vbDefaultButton2
    Title = “VBS”

    Result = MsgBox(Prompt, Buttons, Title)

    If Result = vbOK Then
    for each f in ArrayFileNames
    if fso.FileExists(FileNameTo) = true Then
    FileNameTo = “C:\Program Files (x86)” & myDir1 & f
    FileNameTo = “C:\Program Files (x86)” & myDir2 & f
    FileNameTo = “C:\Program Files (x86)” & myDir3 & f

    Call fso.CopyFile(FileNameTo, True) ‘ファイル削除実行
    else
    MsgBox “ファイルがありません”
    end if
    next
    MsgBox “削除を完了しました”
    Else
    MsgBox “キャンセルしました”
    End If

    Set obj = Nothing
    Set fso = Nothing
    Set wsh = Nothing

    • サイト管理人 より:

      コメントありがとうございます。

      >Call fso.CopyFile(FileNameTo, True) ‘ファイル削除実行

      この部分ですが、
      CopyFile メソッドは、ファイルをコピーするメソッドです。
      削除するには、いくつか方法があるのですが、
      DeleteFile メソッドなどを使います。
      詳細は、FileSystemObject:ファイル・フォルダを削除する(DeleteFile メソッド,DeleteFolder メソッド) で説明しています。よかったら参考にしてみてください。
      ※ vbs ではエラーになる部分もあるかもしれないので注意してください。

      ※ファイルシステムオブジェクトに関しては、ファイルシステムオブジェクト(FileSystemObject)の使い方 で説明しています。

      また、以下の部分に関して

      >\bbb\、\ccc\、\ddd\の中に対象のファイルが一つでもあれば削除して

      「対象のファイル」がどういうものかわからなかったのですが、
      \bbb\ の場合、b1.txt、b2.txt
      \ccc\ の場合、c1.txt、c2.txt
      \ddd\ の場合、d1.txt
      上記ファイルが存在する場合、そのファイルを削除、それ以外のファイルは削除しない
      という形でソースを書いています。

      ※正規表現に関しては、VBA で正規表現を使う(RegExp オブジェクト) で説明しています。
      また、VBA では、Like演算子が使えるのですが、VBSでは使えないようです。

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

  関連記事

Excel の組み込みダイアログボックス(Dialog, Dialogs)

Excel の組み込みダイアログボックスを表示 Dialog オブジェクト を使 …

Write # ステートメント 00
テキストファイル:データを書き込む(Write # ステートメント)

Write # ステートメント Open ステートメント をシーケンシャル出力モ …

「名前を付けて保存」ダイアログボックスを表示(GetSaveAsFilename メソッド)

GetSaveAsFilename メソッド 「名前を付けて保存」ダイアログボッ …

テキストファイル:データを読み込む(Input # ステートメント)

Input # ステートメント Open ステートメント をシーケンシャル入力モ …

「ファイル」ダイアログボックスを表示・設定(FileDialog オブジェクト)

FileDialog オブジェクト FileDialog オブジェクト のメソッ …

テキストファイル:データを読み込む(Input 関数・InputB 関数)

Input 関数・InputB 関数 Open ステートメントをシーケンシャル入 …

「ファイルを開く」ダイアログボックスを表示(GetOpenFilename メソッド)

GetOpenFilename メソッド ファイル名を取得するための、「ファイル …

フォルダ名・ファイル名を変更(Name ステートメント)

フォルダ名およびファイル名を変更 Name ステートメント で、ファイル、ディレ …

Open ステートメントで使用できるファイル番号を取得(FreeFile 関数)

FreeFile 関数 Open ステートメントで使用するファイル番号( 1 ~ …

FileDialog オブジェクトを取得する(FileDialog プロパティ)

FileDialog プロパティ FileDialog オブジェクト を取得しま …