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

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

  関連記事

Excelでテキストファイルを開く(OpenText メソッド)

Excelでテキストファイルを開く OpenText メソッドで、テキストファイ …

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

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

Width # ステートメント
テキストファイル:出力する 1 行の幅を設定(Width # ステートメント)

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

no image
XlBuiltInDialog 列挙型

XlBuiltInDialog 列挙型 Excel の組み込みダイアログボックス …

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

FindFile メソッド 「ファイルを開く」ダイアログボックスを表示します。G …

開いているファイルの現在の読み取り位置または書き込み位置を取得(Seek 関数)

Seek 関数 Open ステートメント で開いたファイル内の現在の読み取り位置 …

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

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

Put ステートメント Binary モード 01
テキストファイル:データを書き込む(Put ステートメント)

Put ステートメント Open ステートメント をランダムアクセスモード(Ra …

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

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

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

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