FavoritesフォルダやDeskTopフォルダ等のパスを取得する良い方法ってありますか?OSに依存しないで取得したい為、フルパスというのは無しです。

WSHでSpecialFoldersを利用する方法では可能ですが、セキュリティ対策上動かしていません。
GetSpecialFolderメソッドでは定数が足りません。それとも、私が定数を知らないだけなのでしょうか。

何か、良い方法を教えてください。宜しくお願いします。

A 回答 (1件)

torokichiさんはじめまして。



APIのSHGetSpecialFolderLocationを使用すればよいのではないでしょうか?
参考URLを書いておきます。
そのペ-ジにいくつか特殊フォルダの取得方法が書いてありますので。
もちろんSHGetSpecialFolderLocationの使用方法も書いてあり、
サンプルもあります。それでは。

参考URL:http://www.geocities.co.jp/SilkRoad/4511/vb/shge …
    • good
    • 0
この回答へのお礼

saruruさん、はじめまして。
SHGetSpecialFolderLocationというAPIをはじめて知りました。
私が探していた、定数もすべて載っており、SHGetSpecialFolderLocationを使って取得が可能でした。
APIの知識がまだまだ未熟なのを痛感しております。
とても参考になるURLをありがとうございました。

お礼日時:2002/03/18 13:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3コピー元ワークシート3

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピ...続きを読む

Aベストアンサー

今どういうコードを書いているのか不明なので、とりあえず
「1つのシートを別のブックに複数回コピーする」ための参考ソースを書きます。
コピー元のブックに下記ソースを貼り付けて実行してもらえば
新規ブックにコピー元のシートが3枚コピーされると思います。
(新規ブックを追加しているのでシート数は3枚より多くなります)

Sub copySheet()
Dim masterWb As Workbook
Dim masterSh As Worksheet
Dim copyWb As Workbook

Set masterWb = ThisWorkbook
Set masterSh = masterWb.Sheets(1)
Set copyWb = Workbooks.Add

'ここからが実際のコピー処理です。
'単純に3回コピーメソッドを呼び出して3回コピーしています。
masterSh.Copy before:=copyWb.Sheets(1)
masterSh.Copy before:=copyWb.Sheets(1)
masterSh.Copy before:=copyWb.Sheets(1)

End Sub

今どういうコードを書いているのか不明なので、とりあえず
「1つのシートを別のブックに複数回コピーする」ための参考ソースを書きます。
コピー元のブックに下記ソースを貼り付けて実行してもらえば
新規ブックにコピー元のシートが3枚コピーされると思います。
(新規ブックを追加しているのでシート数は3枚より多くなります)

Sub copySheet()
Dim masterWb As Workbook
Dim masterSh As Worksheet
Dim copyWb As Workbook

Set masterWb = ThisWorkbook
Set masterSh = masterWb.Sheets(1)
Set copyWb = W...続きを読む

Qフォルダ内のサブフォルダ名やファイル名の取得

VB初心者です。
あるフォルダ内のサブフォルダ名や数、ファイル名を取得したいのですが・・・
コントロールのDirListBoxを使用するか、Dir関数を使用したいのですが、上手くできません。
ご存知の方、教えてください

Aベストアンサー

>上手くできません。
初心者かベテランかは関係ありません。
うまくいかないなら、うまくいかないそのコードの抜粋でもを公開すると、最適な回答が得られやすくなります。

うまくいかないのには、必ず理由があります。その部分の修正を指摘するだけで、うまくいくようになるはずです。


>コントロールのDirListBoxを使用するか、Dir関数を使用したいのですが、
http://okwave.jp/kotaeru.php3?q=1576659
でファイルリストボックスコントロールについて答えております。
ドライブリストボックスは[Pattern]プロパティの部分だけ行わなければ、そのままListCountで数を取得できます。
名前の取得はどちらも、Pathさえ設定してしまえば、リストボックスと同様にList(Index値)で取得できます。


Dirを利用するのであれば、サンプルを書かないでも、ヘルプに出ています。
履歴とヘルプを活用しましょう。



参考URL
http://okwave.jp/kotaeru.php3?q=1561188
を流用した、別の取得方法です。


Sub Main()
  Dim strPath As String
  Dim strLog As String
  
  '調査するパス
  strPath = "C:\WINDOWS\system32"
  'ログ出力先
  strLog = "C:\FileList.txt"
  
  'メイン処理でログに結果を出力させる
  Call CreateList(strPath, strLog)
  
  'ログを展開する
  Call CreateObject("WSCript.Shell").Run(strLog)
End Sub


'-----------------------------------------------
'メイン処理
'-----------------------------------------------
Sub CreateList(ByVal inFolderName As String, ByVal inLogFile As String)
  Dim fsoObj     As Object
  Dim fsoFolder    As Object
  Dim fsoSubFolder  As Object
  Dim fsoFile     As Object
  Dim objText     As Object
 
  'オブジェクト生成
  Set fsoObj = CreateObject("Scripting.FileSystemObject")

  'ログファイル準備
  Set objText = fsoObj.OpenTextFile(inLogFile, 2, True, 0)
  
  'フォルダオブジェクト取得
  Set fsoFolder = fsoObj.GetFolder(inFolderName)
  
  '//-----------------------ファイル処理---------------------------------
  'ファイル数を出力
  objText.WriteLine "ファイル数:" & fsoFolder.Files.Count
  
  'フォルダ内/ファイルループ
  For Each fsoFile In fsoFolder.Files
    'ファイル名をログに出力
    objText.WriteLine fsoFile.Path
  Next
 
  '//--区切り線
  objText.WriteLine String(50, "-")
  
  
  '//-----------------------サブフォルダ処理-----------------------------
  'サブフォルダ数を出力
  objText.WriteLine "サブフォルダ数:" & fsoFolder.SubFolders.Count
 
  'フォルダ内/サブフォルダループ
  For Each fsoSubFolder In fsoFolder.SubFolders
    'ログに出力
    objText.WriteLine fsoSubFolder.Path
  Next
  
  objText.Close
  Set objText = Nothing
  Set fsoObj = Nothing
End Sub

>上手くできません。
初心者かベテランかは関係ありません。
うまくいかないなら、うまくいかないそのコードの抜粋でもを公開すると、最適な回答が得られやすくなります。

うまくいかないのには、必ず理由があります。その部分の修正を指摘するだけで、うまくいくようになるはずです。


>コントロールのDirListBoxを使用するか、Dir関数を使用したいのですが、
http://okwave.jp/kotaeru.php3?q=1576659
でファイルリストボックスコントロールについて答えております。
ドライブリストボックスは[Patt...続きを読む

QVBA と コンパイル の関係

VBAのウィキを見ていると
http://ja.wikipedia.org/wiki/Visual_Basic_for_Applications
「基本的にはインタプリタ型の言語であるため、コンパイル(ビルド)の作業は不要である。」

との事ですが
VBE画面のデバッグ画面に「VBAProjectのコンパイル」と言う機能がなぜあるのはなぜでしょうか?
VBAでコンパイル作業は不要だけど、付属として「VBAProjectのコンパイル」機能があるのでしょうか?

Aベストアンサー

こんばんは

私の場合、VBAは何年も使っていますが「VBAProjectのコンパイル」
なんて機能は知りませんでした。

人に教える機会があって、そのときに使ったテキストに出ていたので、初めて知りました。
「VBAProjectのコンパイル」を使わなくても、問題なく動作します。

一つ、使い道をあげるならば、
「VBAProjectのコンパイル」を使うと、実行することなく、文法チェックできます。

もっとも、文法上のエラーがあれば、プログラムが実行される前にエラーが出るように
なっていますので、わざわざ一手間をかける理由は見つかりません。

たぶん、過去のバージョンを使っていた人が「この機能はどこへ行った?」と
ならないように残しているのではないかと思います。
そうはいっても、Excel2000でも、コンパイル操作なしに実行できますから、
当たってないかもしれません。

Qフォルダのパスが見つからない

VB6のプログラムで単純にパスを定義しています。
Folder_Name = "C:\TEMP\TEST" の様に。
ところがWinXP,Win2000Proでは正常に動作するの
ですがWin98SEでは実行時エラーでパス名が見つかりません。
確実に定義したパスはPC内にあります。
なぜかお教えお願いします。
(ファイルシステムのNTFSとFAT32で違いがあるのでしょうか)

Aベストアンサー

そのエラーが出るコードの前後全てのっけてください。

QエクセルVBAでセルの書式設定を出すには

「セルの書式設定」のダイアログを出すには
メニューの「書式」-「セル」-「セルの書式設定」-「罫線」を順番に選らばなければなりません。
これをショートカットキーなどで一発で出す方法はないでしょうか。
恐らくVBAでSendkeysを使って行うことになると思うのですが、
最初のAlt-o、Alt-eは分かるのですが、最後に複数タブからどうやって「罫線」をだしたらよいのでしょうか。
また、Sendkeysを使わないやりかたがあったら教えていただけないでしょうか。
よろしくお願い申し上げます。

Aベストアンサー

こんばんは。Wendy02です。

>メニューの「書式」-「セル」-「セルの書式設定」-「罫線」を順番に選らばなければなりません。

通常は、VBAから、ダイアログを出すのでしたら、「罫線」は罫線単独ダイアログになります。

以下のようなコードになります。

 Application.Dialogs(xlDialogBorder).Show
 

Q指定フォルダの絶対パス取得

初歩的なことですが教えてください。
VB.netにて、指定したフォルダの相対パスに対する絶対パスの取得を行いたいのですが、良い方法が見つかりません。
「Path.GetFullPath メソッド」を使用して見ましたが、存在しないパス「例:\A\」を指定すると、勝手に「例:C:\A\」のように絶対パスが割り付けられてしまいます。実際に存在するパスを検索して取得することは出来ないのでしょうか?
例:「ABC」というフォルダが「C:\program files」や「D:\」などに存在するという結果です。

Aベストアンサー

前置きが長いですが。。。


「パス」について
http://e-words.jp/w/E38391E382B9.html
頂点から目的のファイルやフォルダまでのすべての道筋を記述するのが「絶対パス」
起点となる現在位置から、目的のファイルやフォルダまでの道筋を記述するのが「相対パス」



他に例えます。

[起点]
私の家の住所は、○○県○○市○○区○○町○○番地です
(自宅住所が起点)

[起点からの道筋を辿った相対パス]
家から、南側に3つ目の交差点があり、そこにA点というコンビニがあります
(南側に3つ目の交差点が相対パス)

[絶対パスを算出]
起点の家から辿って、A点までの経路を考えると、そのA点の住所は、△△県△△市△△区△△町△△番地になります。
(A点住所が絶対パス)

上の例から、相対パスから絶対パスを算出するためには、絶対パスの起点が必要となることがわかると思います。



ここから本題
>実際に存在するパスを検索して取得することは出来ないのでしょうか?
>例:「ABC」というフォルダが「C:\program files」や「D:\」などに存在するという結果です。
私が言いたいことは、#1さんが言われている事と、全く一緒です。
フォルダ名だけで存在チェックをしたいのであれば、起点が無いので、全フォルダを調べなければならないです。



それでもよければサンプルです。
http://okweb.jp/kotaeru.php3?q=1561188
をベースに、.NET用に変換しています。
アクセス権の無いフォルダを参照しようとすると落ちます。
(解析しやすいように、あえてエラー処理を入れていません。)



Option Explicit On
Imports System.IO
Imports System.Text

Module Module1

  '-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
  Private Const LIST_FILE As String = "C:\FileList.txt"   '←ログ出力先
  '-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

  Private stmWriter As StreamWriter

  '-----------------------------------------------

  Sub Main()
    Const DEF_検索ルート As String = "C:\WINDOWS"
    Const DEF_検索フォルダ名 As String = "System32"

    Dim l_strWk As String = _
        "以下の論理ドライブが存在しています" & vbCrLf & vbCrLf _
        & Join(System.Environment.GetLogicalDrives(), vbCrLf) & vbCrLf & vbCrLf _
        & "しかし時間がかかるので[" & DEF_検索ルート & "]以下だけを対象にします"

    Call MsgBox(l_strWk, MsgBoxStyle.Information)


    'ログファイルがあったら抹消
    If File.Exists(LIST_FILE) Then
      Call File.Delete(LIST_FILE)
    End If

    'ログファイル準備
    stmWriter = New StreamWriter(LIST_FILE, False, Encoding.GetEncoding(932))

    'リスト作成メイン実行
    Call CreateFileList(DEF_検索ルート, DEF_検索フォルダ名)

    'ログファイルクローズ
    stmWriter.Close()

    'オブジェクト開放
    stmWriter = Nothing


    MsgBox("終了")
    Call System.Diagnostics.Process.Start(LIST_FILE)
  End Sub


  '-----------------------------------------------
  'リスト作成メイン
  '-----------------------------------------------
  Sub CreateFileList(ByVal p_str起点 As String, ByVal p_str検索フォルダ名 As String)
    Dim l_strサブフォルダ As String

    '絶対パスを取得
    Dim l_str絶対パス As String = Path.Combine(p_str起点, p_str検索フォルダ名)

    '存在チェック
    If Directory.Exists(l_str絶対パス) Then
      'ログに出力
      stmWriter.WriteLine(l_str絶対パス)
    End If

    'パラメータの起点フォルダ以下のサブフォルダ階層をチェックする
    For Each l_strサブフォルダ In Directory.GetDirectories(p_str起点)
      'サブフォルダで再帰
      Call CreateFileList(l_strサブフォルダ, p_str検索フォルダ名)
    Next
  End Sub

End Module

前置きが長いですが。。。


「パス」について
http://e-words.jp/w/E38391E382B9.html
頂点から目的のファイルやフォルダまでのすべての道筋を記述するのが「絶対パス」
起点となる現在位置から、目的のファイルやフォルダまでの道筋を記述するのが「相対パス」



他に例えます。

[起点]
私の家の住所は、○○県○○市○○区○○町○○番地です
(自宅住所が起点)

[起点からの道筋を辿った相対パス]
家から、南側に3つ目の交差点があり、そこにA点というコンビニがあります
(南側に3つ目の交差点が相対...続きを読む

QVBAでのセルの選択で Cells Range R1C1 の使い分け

セルを指定するときに
Cells Range R1C1のどれかを使うと思いますが、
どういうときにどれを使うといった決まりはあるのでしょうか?

慣れとか好みで使い分けるのでしょうか?

ひとつのプロジェクトに対して、
CellsならCellsで一貫して使ったほうがわかりやすいと思うのですが
そういう理解でいいのでしょうか?

VBAの勉強をはじめたばかりなので、
おかしな質問だったら失礼します。

Aベストアンサー

こんばんは。

Excel VBA の Cells や Range などの使い分けですが、
(1) Cells
 1つのセル位置に対して操作する場合に使用します。
 また、for 文などで、列方向や行方向に移動しながら
 繰り返し処理する場合に、セル位置をループの
 カウンタ変数を使って指定できます。

 for rowNo = 1 to 3
  for colNo = 1 to 2
   msgbox "行 : " & rowNo & ", 列 : " & colNo & _
     ", 値 : " & Cells( rowNo, colNo ).value
  next
 next

(2) Range
 セル位置が固定で指定する場合やセル範囲を指定する
 場合、あるいは Range でしか使用できないメソッド
 やプロパティを使用する場合に使用します。

 Range("A1").Select
 Range("A1:B3").ClearContents
 Range( Cells(1,1), Cells(2,3) ).Select

こんばんは。

Excel VBA の Cells や Range などの使い分けですが、
(1) Cells
 1つのセル位置に対して操作する場合に使用します。
 また、for 文などで、列方向や行方向に移動しながら
 繰り返し処理する場合に、セル位置をループの
 カウンタ変数を使って指定できます。

 for rowNo = 1 to 3
  for colNo = 1 to 2
   msgbox "行 : " & rowNo & ", 列 : " & colNo & _
     ", 値 : " & Cells( rowNo, colNo ).value
  next
 next

(2) Range
 セル位置が固定で指定する...続きを読む

QDefault Userフォルダのパス取得について

VB.NET又はVBScriptで、Default Userフォルダ内にあるApplication Dataフォルダのパスを取得する方法をご教示いただけないでしょうか。
初心者ですが、よろしくお願いします。

Aベストアンサー

VB.NETの場合は Environment.GetFolderPathメソッドを使用することで使用可能です。

Dim strAppData As String

'Application Dataフォルダを取得する
strAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

で取得できると思います。

私のサイトで紹介していますので、良かったら参考にしてください

参考URL:http://hiro.wankuma.com/VBNET2005/Folder/Folder19.htm

QEXCEL VBA ワークシートのコピーについて

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピー先BOOKに

         ワークシート名
ワークシート1 処理1ワークシート 
ワークシート2 処理2ワークシート
ワークシート3 処理3ワークシート

という具合にワークシートを複数コピーしたいのですが

処理ごとにデータを代入し、コピー処理はできるのですが。

コピー先BOOK

ワークシート3 処理3ワークシート

だけしかコピーされてないBOOKが作成されます。
上書きされているのだと思われます。

対処法が調べましたが見つけられていません。

すいませんが対処法及び参考VBA等ご教授宜しくお願いいたします。

seaclearsky8です。

一つのブックに何枚ものワークシートを追加して保存するVBAについて
ご教授、よろしくお願いします。

コピー元 

MASTER Book MASTER Workseets

コピー先

Copy Book copy Worksheets


コピー元にはワークシートがMASTERワークシートの一枚しかありません。

その一枚のワークシートに値をVBAで入れていき処理し

コピー先のコピーBOOKにワークシートをコピーしていきたいです。

しかし、MASTERBOOKの処理が何通りかあり、

コピー元の一枚のワークシートに
処理別にデータを写し

コピ...続きを読む

Aベストアンサー

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめる。
 新規ブックのオープンをtestwriteを呼ぶ前に1度だけ行い、
 testwriteの中ではその新規ブックに対してシートを追加していく。
 そしてtestwriteの処理が全部終わったら、
 新規ブックの全シートを1度に「記録シートYYYY/MM/DD.xls」にコピーする。

それでも駄目でしたら、以下の回答No.1を試してみてください。
http://oshiete.goo.ne.jp/qa/1822561.html

> 配列にワークシートのオブジェクトを入れることとか可能なのでしょうか?

それは多分できないと思います。


> 複数のセル・シートを何回もコピーする場合にでるらしいです。

多分、メモリをたくさん使っちゃってるせいでしょうね。
まず、メモリ使用を減らすようにしましょうか。

・testwriteの最後にオブジェクト変数のメモリ解放を行う。
 具体的には以下のように書く。もうやってたらすみません。
Set cbook = Nothing
Set mastersheet = Nothing
・testwriteの中でのブックオープンおよび保存をやめ...続きを読む

QVBScriptで「My Documents」フォルダの絶対パスを取得する方法

VBScriptで現在ログイン中のユーザの
「My Documents」フォルダの絶対パスを
取得する方法をご存知でしたらご教授下さい。

よろしくお願いします。

Aベストアンサー

Set wshShell = WScript.Createobject("WScript.shell")
Set sf = wshShell.SpecialFolders
WScript.Echo sf("MyDocuments") '絶対パス


人気Q&Aランキング

おすすめ情報