Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7511 / 13644 ツリー ←次へ | 前へ→

【38642】フォルダ選択ダイアログの表示 aaa 06/6/7(水) 17:28 質問[未読]
【38644】Re:フォルダ選択ダイアログの表示 ichinose 06/6/7(水) 17:52 発言[未読]
【38664】Re:フォルダ選択ダイアログの表示 aaa 06/6/8(木) 10:06 質問[未読]
【38680】Re:フォルダ選択ダイアログの表示 ハト 06/6/8(木) 14:19 発言[未読]
【38691】Re:フォルダ選択ダイアログの表示 aaa 06/6/8(木) 16:23 お礼[未読]
【38705】参考までに ハト 06/6/8(木) 18:25 発言[未読]
【38649】Re:フォルダ選択ダイアログの表示 inoue 06/6/7(水) 18:54 発言[未読]

【38642】フォルダ選択ダイアログの表示
質問  aaa  - 06/6/7(水) 17:28 -

引用なし
パスワード
   自パス配下のフォルダ名をダイアログを使用し表示させてセルにフォルダ名のみを表示させたいのですが、APIやShellを使ってもうまくいきません。

マイコンピュータやマイドキュメント配下などという指定はできるのですが、エクセルブックを保存しているパス配下のものだけを表示させたいのです。
またフォルダ名を選択すればセルに表示できるというものにしたいです。

APIではルートフォルダの位置は定数で定義されているみたいなのですが、自パスという指定は別でできるのでしょうか?

どこを探してみてもわかりません。

もしいい方法がありましたら教えていただけませんか?
よろしくお願い致します。

【38644】Re:フォルダ選択ダイアログの表示
発言  ichinose  - 06/6/7(水) 17:52 -

引用なし
パスワード
   ▼aaa さん:
こんばんは。


>自パス配下のフォルダ名をダイアログを使用し表示させてセルにフォルダ名のみを表示させたいのですが、APIやShellを使ってもうまくいきません。
うまくいかないコードを見せてください。

私は、よくShellを使いますけど・・(よくでもないか・・)
'====================================
Sub main()
  MsgBox get_folder_path("SelectFolder", ThisWorkbook.Path & "\")
End Sub
'====================================
Function get_folder_path(Optional mes As String = "", Optional 初期値 = 17) As Variant
  Dim fld As Object
  Set fld = CreateObject("Shell.Application").BrowseForFolder(0, mes, 0, 初期値)
  On Error Resume Next
  If Not fld Is Nothing Then
    get_folder_path = fld.items.Item.Path
    If Err.Number <> 0 Then
     get_folder_path = False
     End If
  Else
    get_folder_path = False
    End If

End Function


これでもうまくいきませんか?

【38649】Re:フォルダ選択ダイアログの表示
発言  inoue E-MAILWEB  - 06/6/7(水) 18:54 -

引用なし
パスワード
   多少、参考になるかも知れません。

[フォルダの参照]
http://www.asahi-net.or.jp/~ef2o-inue/download/sub09_020_110.html

【38664】Re:フォルダ選択ダイアログの表示
質問  aaa  - 06/6/8(木) 10:06 -

引用なし
パスワード
   ▼ichinose さん:

ありがとうございます。うまくいきました。

「うまくいかない」のではなくて、どこをどうやって変更すれば自パスになるのかわかりませんでした。
表現が間違っていました。

もうひとつ質問があります。
この取得した値をセルに表示させる場合、

Sub main()
  MsgBox get_folder_path("SelectFolder", ThisWorkbook.Path & "\")
End Sub

のところを

Range("A1").value = get_folder_path("SelectFolder", ThisWorkbook.Path & "\")

と変更すればいいと思うのですが、取得したフォルダ名のみを表示させたいのです。
そこで

Dim pas1 As String
Dim pas2 as integer
Dim i As Integer
  pas = get_folder_path("SelectFolder", ThisWorkbook.Path & "\")
  i = InStr(pas, "自分のフォルダ")
  j = Mid(pas, i + 8, 10)
  Range("A1).Value = pas2

なんて風に変えれば「自分のフォルダ」というフォルダ配下のフォルダ名だけは出ますが、その配下のフォルダ名の文字数は一定ではありませんし、最大何文字なのかは今後わかりません。ですからMID関数で値をとるとちょっと複雑になりそうなので、いい方法はありませんか?
それプラスもう一階層下のフォルダ名を別のセルに表示させたいと思っています。フォルダの階層はこのようになっています。
「\自分のフォルダ\01ABC\ABCDEFG」
例 セルA1に「01ABC」、セルA2に「ABCDEFG」と表示

よろしくお願いします。

【38680】Re:フォルダ選択ダイアログの表示
発言  ハト  - 06/6/8(木) 14:19 -

引用なし
パスワード
   おはようございます

>Dim pas1 As String
>Dim pas2 as integer
>Dim i As Integer
>  pas = get_folder_path("SelectFolder", ThisWorkbook.Path & "\")
>  i = InStr(pas, "自分のフォルダ")
>  j = Mid(pas, i + 8, 10)
>  Range("A1).Value = pas2
>
>なんて風に変えれば「自分のフォルダ」というフォルダ配下のフォルダ名だけは出ますが、その配下のフォルダ名の文字数は一定ではありませんし、最大何文字なのかは今後わかりません。ですからMID関数で値をとるとちょっと複雑になりそうなので、いい方法はありませんか?
>それプラスもう一階層下のフォルダ名を別のセルに表示させたいと思っています。フォルダの階層はこのようになっています。
>「\自分のフォルダ\01ABC\ABCDEFG」
>例 セルA1に「01ABC」、セルA2に「ABCDEFG」と表示
>
>よろしくお願いします。

InStr関数を使って"\"の位置を求めて、MID関数を使う
そんなに複雑じゃないですよ
↓のような感じになります


Sub Test()

Dim pas1 As String
Dim pas2 As String
Dim i As Integer
Dim j As Integer

  Range("A1:B1").Clear

  pas = get_folder_path("SelectFolder", ThisWorkbook.Path & "\")
  
  i = InStr(pas, "自分のフォルダ")
  If i = 0 Then Exit Sub
  
  pas = pas & "\"
  i = InStr(i + 1, pas, "\")
  
  j = InStr(i + 1, pas, "\")
  If j = 0 Then Exit Sub
  
  pas2 = Mid(pas, i + 1, j - i - 1)
  Range("A1").Value = pas2

  i = j
  
  j = InStr(i + 1, pas, "\")
  If j = 0 Then Exit Sub
  
  pas2 = Mid(pas, i + 1, j - i - 1)
  Range("B1").Value = pas2

End Sub

【38691】Re:フォルダ選択ダイアログの表示
お礼  aaa  - 06/6/8(木) 16:23 -

引用なし
パスワード
   ▼ハト さん:
できました。ありがとうございます。
複雑に考えすぎていたみたいでした。

【38705】参考までに
発言  ハト  - 06/6/8(木) 18:25 -

引用なし
パスワード
   Split関数を使う手もあります
↓を動かしてみてカスタマイズしてみてください


Sub Test2()

Dim pas As String
Dim i As Integer
Dim DTmp

  Range("A1:E1").Clear

  pas = get_folder_path("SelectFolder", ThisWorkbook.Path & "\")
  
  DTmp = Split(pas, "\")
  
  For i = LBound(DTmp) To UBound(DTmp)
    Cells(1, i + 1) = DTmp(i)    
  Next i

End Sub

7511 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free