コモンダイアログコントロールを使用してフォルダ名称のみを取得する方法を教えてください(WORDなどで規定のフォルダを指定するときのような機能です)。
よろしくお願いします。

A 回答 (1件)

あんまり自信ないんですが、VBの範囲ではできないんじゃないかなぁ。

APIとか、使ってやる必要があるかも…

ちなみに、同様の機能を持ったフォームなら、すぐに出来ますよ(最近作った)。



フォーム上にドライブリストボックス(Drive1)と、ディレクトリリストボックス(Dir1)、そして、ボタンを二つ(決定ボタン,キャンセルボタン)を配置して、以下のようなコードを記述します。

-+-+-+-+
Option Explicit

Dim mResult As FolderSelectResultEnum
Public Enum FolderSelectResultEnum
  Canceled = 0
  Selected = 1
End Enum

'最後に押されたボタンを返す。
Property Get Result() As FolderSelectResultEnum
  Result = mResult
End Property

'選択されたフォルダを取得、設定する
Property Let Path(strPath As String)
  Me.Dir1.Path = strPath
End Property
Property Get Path() As String
  Path = Me.Dir1.Path
End Property



'ドライブ変更時の処理
Private Sub Drive1_Change()
  Me.Dir1 = Me.Drive1
End Sub

Private Sub Form_Unload(Cancel As Integer)
  '×ボタンで終わる時は、キャンセル
  If Me.Visible = True Then
    Cancel = True
  End If
  Me.Visible = False
End Sub

Private Sub キャンセルボタン_Click()
  mResult = Canceled
  Me.Visible = False
End Sub

Private Sub 決定ボタン_Click()
  mResult = Selected
  Me.Visible = False
End Sub

-+-+-+-+

そして、こんな感じで呼び出します。

Private Sub フォルダ選択_Click()
  Dim FSel As New frmFolderSelect
  '表示されるフォルダの初期値
  FSel.Path=Curdir()
  'モーダルフォームとして表示
  FSel.Show 1
  '結果を取得
  If FSel.Result = Selected Then
    MsgBox FSel.Path
  Else
    MsgBox "キャンセルされました"
  End If
End Sub

この回答への補足

回答ありがとうございます。
ただ、その方法は私も知っていまして...
見た目などを考えて標準のものを使用したいんです。
APIなどを使用する必要があるのでしたらご存知の方は教えていただけないでしょうか。

補足日時:2000/12/11 11:09
    • good
    • 0
この回答へのお礼

この件はご存知の方がいないようなので締めきろうと思います。
今後のVBの新しいバージョンかSPに期待したいと思います。
回答ありがとうございました。

お礼日時:2001/01/03 11:52

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

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

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つ目の交差点が相対...続きを読む

QDirListBoxに指定フォルダのみ表示したい

こんにちは。
いつもお世話になっております。
早速ですが質問させて下さい。

DirListBoxについて、指定フォルダ以下から表示したいのですが可能でしょうか?
例えば、以下のようなパスを表示する場合に
D:\Test\Sample\aaa
通常はDirListBoxに「D:\Test\Sample\aaa」全てが表示されますが、
これを「\Sample\aaa」というように表示したいのです。

よろしければご教示下さい。

Aベストアンサー

お世話になります。

VB のバージョンは VB6.0 ですよね?

DirListBox にそのような機能があるのか
私はわかりません。
代替案として、DirListBox のとなりに、
ListBox を配置して、
こんな感じではどうでしょうか。
(実行する際は、プロジェクト→参照設定→Microsoft Scripting Runtime にチェックを付けてください)

Private Sub Dir1_Change()
  
  Dim objFso As FileSystemObject
  Set objFso = New FileSystemObject

  Dim objFolder As Folder
  Set objFolder = objFso.GetFolder(Me.Dir1.Path)

  ' リスト作成
  Dim objSubFolder As Folder
  Dim strPath As String
  strPath = Me.Dir1.Path
  strPath = Split(strPath, "\")(UBound(Split(strPath, "\")))
  For Each objSubFolder In objFolder.SubFolders
    Call Me.List1.AddItem(strPath & "\" & objSubFolder.Name)
  Next objSubFolder

  Set objFolder = Nothing
  Set objSubFolder = Nothing

End Sub

お世話になります。

VB のバージョンは VB6.0 ですよね?

DirListBox にそのような機能があるのか
私はわかりません。
代替案として、DirListBox のとなりに、
ListBox を配置して、
こんな感じではどうでしょうか。
(実行する際は、プロジェクト→参照設定→Microsoft Scripting Runtime にチェックを付けてください)

Private Sub Dir1_Change()
  
  Dim objFso As FileSystemObject
  Set objFso = New FileSystemObject

  Dim objFolder As Folder
  Set objFolder = objFso.G...続きを読む

Q指定したフォルダ内の最新ファイルのみをコピー

WinXP Pro × VB6

指定したフォルダ内で「更新日時」が最新のファイルの名前を取得するにはどのようにすればよいでしょうか?
ファイル名がランダムのため、困っています。

Aベストアンサー

FileSystemObjectのFileオブジェクトのDateLastModifiedプロパティを参照するようにしてみてはいかがでしょう

dim fso, fol, fc, f
dim col as new Collection
Set fso = CreateObject("Scripting.FileSystemObject")
Set fol = fso.GetFolder(フォルダーパス)
Set fc = fol.Files
for each f in fc
if f.DateLastModified > "2007/4/30" then
col.Add f.Name
end if
next
といった具合で ...

QVB2008 iniファイルの指定セクション内の値のみを取得

VB2008 iniファイルの指定セクション内の値のみを取得
VB2008でiniファイルの読込みを行いたいと思っています。
指定セクション内の値のみを取得したいのですが、自分の知る限りではキー名も一緒についてきて
しまいます。
簡単に値のみを取得する方法を助言いただきたいと思います。
自分が検討した一番近かった方法は、GetPrivateProfileSection関数を使用し、キー名と値を取得。
↑ただし、キー名はいらない。

関数で出来ればいいのですが、出来なければ、プログラミングで値のみを抜き取る方法でもいいので
なるべく簡単な方法を宜しくお願いします。

  

Aベストアンサー

通常のiniファイルなら下記で取得できるかと。

Private Sub Button1_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) Handles Button1.Click
  Dim fileName As String = "test.ini"
  Dim sr As New System.IO.StreamReader(fileName, System.Text.Encoding.Default)
  Do Until sr.Peek() = -1
    Dim temp() As String
    temp = Split(sr.ReadLine(), "=")
    If temp.GetUpperBound(0) = 1 Then
      Debug.WriteLine(temp(1))
    End If
  Loop
  sr.Close()
End Sub

Q指定したフォルダからファイル名を取得する方法

指定したフォルダからファイル名を取得するプログラムを作成しています。カレントディレクトリは上手く読み込めるのですが、サブディレクトリに入ると、アルファベット順にファイルを読んでいくため、そのサブディレクトリのファイルを全て読み込む前にまた別のサブディレクトリに飛んでしまいます。

何か良い方法はないでしょうか?

宜しくお願い致します。

Aベストアンサー

実際のプログラムを見ないことには、なんともいえないので、
適当な、想像での回答です。

dirでファイルorディレクトリを順に読んでいると思いますが、
ディレクトリを読み出したところで、直ぐにそのディレクトリの処理を
しにいかないようにして、配列なりコレクションに貯めるだけにして、
ファイルだけ先に全て終わらせます。
そのあとで、貯めたディレクトリについて、処理すればいいかと。

「別のサブディレクトリに飛んでしまいます」ってもしかして、
カレントディレクトリを移動させている?


人気Q&Aランキング

おすすめ情報