Excel VBA質問箱 IV

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

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


7178 / 13646 ツリー ←次へ | 前へ→

【40527】フルパスから文字列の分割をしてフォルダ名を取得する方法 亜由美 06/7/15(土) 21:43 質問[未読]
【40529】Re:フルパスから文字列の分割をしてフォ... neptune 06/7/15(土) 22:03 回答[未読]
【40531】Re:フルパスから文字列の分割をしてフォル... かみちゃん 06/7/15(土) 22:11 回答[未読]
【40532】Re:フルパスから文字列の分割をしてフォル... かみちゃん 06/7/15(土) 22:33 回答[未読]
【40535】Re:フルパスから文字列の分割をしてフォル... 亜由美 06/7/15(土) 22:54 質問[未読]
【40536】Re:フルパスから文字列の分割をしてフォル... かみちゃん 06/7/15(土) 23:11 発言[未読]
【40537】Re:フルパスから文字列の分割をしてフォル... 亜由美 06/7/15(土) 23:27 質問[未読]
【40538】Re:フルパスから文字列の分割をしてフォル... かみちゃん 06/7/15(土) 23:41 回答[未読]
【40706】Re:フルパスから文字列の分割をしてフォル... 亜由美 06/7/20(木) 19:24 お礼[未読]
【40714】Re:フルパスから文字列の分割をしてフォル... Jaka 06/7/21(金) 9:54 発言[未読]

【40527】フルパスから文字列の分割をしてフォルダ...
質問  亜由美  - 06/7/15(土) 21:43 -

引用なし
パスワード
   こんばんわ。
VBA勉強しはじめたばかりでまったくわかりません。
行き詰ってしまったので、どなたか教えてください。

フルパスから文字列の分割をしてフォルダ名を取得する方法を知りたいのですが

C:\Documents and Settings\AAAA\デスクトップ\元データ1\元データ2

というフルパスを取得することまではできました。
そこから、書き込みのシートのセルA1に「元データ1」を
セルB1に「元データ2」を取得して書き込みたいとおもっているのですが、
初心者なりに調べて考えたら、
なぜか、数字が入ってしまいます。

どうしてだめなのか、そしてどうすればいいのか
おしえていただけませんか?

Sub フォルダ名の取得()
  Dim OpenFileName As String, OpFNam As String
  Dim tmp As Variant  
  Dim PNum As String
  Dim Pos , Pos2 As String
 
  
'開くファイル名を指定する。
  OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
  If OpenFileName = "False" Then
    Exit Sub
  End If
'ファイルを開く
  Workbooks.Open OpenFileName
'開いたファイルを『OpFNam』という名前とする。
  OpFNam = ActiveWorkbook.name
  
'フルパスの取得
PNum = Workbooks(OpFNam).Path
'フルパスの前から\マークの位置を検索
  Pos = InStr(FName, "\")
  Pos2 =InStr(PNum, "\")


Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 1).Value = Pos
Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 2).Value = Pos2

End Sub


なぜか数字になってしまうのですが・・・
どなたか教えてください。

【40529】Re:フルパスから文字列の分割をしてフォ...
回答  neptune  - 06/7/15(土) 22:03 -

引用なし
パスワード
   ▼亜由美 さん:
こんばんは

>VBA勉強しはじめたばかりでまったくわかりません。
エライ!自力でここまで作ったんだから。

>'フルパスの前から\マークの位置を検索
>  Pos = InStr(FName, "\")
>  Pos2 =InStr(PNum, "\")
instr の中にカレットを移動させてF1を押しましょう。
するとHelpが出ますよね。こう書いています。

/////////////以下Helpより引用////////////
バリアント型 (内部処理形式 Long の Variant) の値を返します。ある文字列 (string1) の中から指定した文字列 (string2) を検索し、最初に見つかった文字位置 (先頭からその位置までの文字数) を返す文字列処理関数です。
///////////引用ここまで/////////////
>なぜか数字になってしまうのですが・・・
これを読めば数値を返すから数字になると言うのが分かります。

目的が
>フルパスから文字列の分割をしてフォルダ名を取得する方法を知りたいのですが
ということなので
「文字列の分割」に着目するとSplit関数と言うのがあります。
Excel2000以降で使用可能です。

////////文字列をある区切りで分割する例//////
以下を実行して、イミディエイトウィンドウを見たら結果が出ます。
Sub t()
Dim a() As String
Dim I As Long
a = Split("C:\Documents and Settings\AAAA\デスクトップ\元データ1\元データ2", "\")
  For I = 0 To UBound(a)
    Debug.Print a(I)
  Next I
End Sub

【40531】Re:フルパスから文字列の分割をしてフォ...
回答  かみちゃん  - 06/7/15(土) 22:11 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>'フルパスの前から\マークの位置を検索
>  Pos = InStr(FName, "\")
>  Pos2 =InStr(PNum, "\")
>
>
>Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 1).Value = Pos
>Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 2).Value = Pos2
>
>End Sub
>
>
>なぜか数字になってしまうのですが・・・

変数 Pos と Pos2 は、検索文字列の見つかった位置ですから、文字列そのものではありません。
詳しくは、InStr関数をヘルプで調べてみてください。

ちなみに、僭越ながら、添削させていただくと以下のような感じになります。

Sub フォルダ名の取得2()
 Dim OpenFileName As String, OpFNam As String
 Dim tmp As Variant
 Dim PNum As String
' Dim Pos, Pos2 As String
 Dim Pos As Long
 Dim Pos2 As Long
 
 '開くファイル名を指定する。
 OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
 If OpenFileName = "False" Then
  Exit Sub
 End If
 'ファイルを開く
 Workbooks.Open OpenFileName
 '開いたファイルを『OpFNam』という名前とする。
 OpFNam = ActiveWorkbook.Name
 'フルパスの取得
 PNum = Workbooks(OpFNam).Path
 'フルパスの前から\マークの位置を検索
' Pos = InStr(FName, "\")
' Pos2 = InStr(PNum, "\")
' Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 1).Value = Pos
' Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 2).Value = Pos2

 Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 1).Value = Mid(OpenFileName, 1, InStrRev(OpenFileName, "\"))
 Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 2).Value = Mid(OpenFileName, InStrRev(OpenFileName, "\") + 1)
End Sub

【40532】Re:フルパスから文字列の分割をしてフォ...
回答  かみちゃん  - 06/7/15(土) 22:33 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>フルパスから文字列の分割をしてフォルダ名を取得する方法を知りたい

文字列の分割をしなくてもフルパスからフォルダ名等を取得する方法もあります。
FileSystemObject(FSO)を使って以下のような感じにします。

Sub フォルダ名の取得3()
 Dim OpenFileName As String, OpFNam As String
 Dim PNum As String
 Dim FSO As Object
 
 Set FSO = CreateObject("Scripting.FileSystemObject")
 
 '開くファイル名を指定する。
 OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
 If OpenFileName = "False" Then
  Exit Sub
 End If
 'ファイルを開く
 Workbooks.Open OpenFileName
 '開いたファイルを『OpFNam』という名前とする。
 OpFNam = ActiveWorkbook.Name
 'フルパスの取得
 PNum = Workbooks(OpFNam).Path
 Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 1).Value = FSO.GetFile(OpenFileName).ParentFolder
 Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 2).Value = FSO.GetFile(OpenFileName).Name
End Sub

FileSystemObjectについては、以下が参考になるかと思います。
http://www.officetanaka.net/excel/vba/filesystemobject/index.htm

【40535】Re:フルパスから文字列の分割をしてフォ...
質問  亜由美  - 06/7/15(土) 22:54 -

引用なし
パスワード
   ■neptune さん

ありがとうございます。
めちゃくちゃ汗をかきながらがんばっています。

元々InStr が間違っていたのですね;;

イミディエイトウィンドウってのを見たのですが
(初心者すぎてイミディエイトウィンドウがなんだかわかりません・・・

なんか、分割されてて
「これだ!」と思ったのですが
はてさて、これをどう生かせばいいのかが、まったく・・・
役立たずですいません。

もうちょっと細かくおしえていただけますか?

■かみちゃん さん

2種類も教えてくださってありがとうございます。
2個目のFileSystemObjectを使って取得したいとおもうのですが
(今後も役にたちそうなので、こちらで覚えていきたいなと

ただ、Cells(1, 1)には、フルパスが、
Cells(1, 2)にはファイル名が入ってしまいます;;

Cells(1, 1)にはフォルダ名「元データ1」の部分、
Cells(1, 2)にはフォルダ名「元データ2」の部分を入れたいのですが

こうするのには、1個目をつかったほうがいいのですかね?
しかし、1個目でもどこをどう変えていいのか
頭がこんがらがってしまって・・・・

すいませんが教えてください。

【40536】Re:フルパスから文字列の分割をしてフォ...
発言  かみちゃん  - 06/7/15(土) 23:11 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>めちゃくちゃ汗をかきながらがんばっています。

がんばってくださいね。

>イミディエイトウィンドウってのを見たのですが
>(初心者すぎてイミディエイトウィンドウがなんだかわかりません・・・
>
>なんか、分割されてて
>「これだ!」と思ったのですが
>はてさて、これをどう生かせばいいのかが、まったく・・・

Splitで分割された変数aは、配列というものになっています。
その配列の最後の要素と最後から2つ目の要素を取得するということであれば、
以下のような感じになります。

Sub t2()
 Dim a() As String
 Dim I As Long
 a = Split("C:\Documents and Settings\AAAA\デスクトップ\元データ1\元データ2", "\")
 For I = 0 To UBound(a)
  Debug.Print a(I)
 Next I
 MsgBox a(UBound(a) - 1)
 MsgBox a(UBound(a))
End Sub

>2個目のFileSystemObjectを使って取得したいとおもうのですが
>(今後も役にたちそうなので、こちらで覚えていきたいなと
>
>ただ、Cells(1, 1)には、フルパスが、
>Cells(1, 2)にはファイル名が入ってしまいます;;

「フルパス」という表現がちょっと違っているように思います。
フルパスとは、パス名+ファイル名のことを指します。
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv9136.html

>Cells(1, 1)にはフォルダ名「元データ1」の部分、
>Cells(1, 2)にはフォルダ名「元データ2」の部分を入れたいのですが

確認せていただきたいのですが、
「元データ2」というのは、ファイル名ではないのですね?
C:\〜\元データ1\元データ2
がフォルダ名であるならば、この場合は、FileSystemObjectは使えないと思います。

ただし、それでは、「元データ1」「元データ2」をなぜ取得したいのかちょっと
わからないのですが・・・
どうしても、そのような情報が取得したいのならば、
1個目の方法も難しいので、neptuneさんの方法をおすすめします。

【40537】Re:フルパスから文字列の分割をしてフォ...
質問  亜由美  - 06/7/15(土) 23:27 -

引用なし
パスワード
   ■かみちゃん さん
 
早速ありがとうございます。
フルパスという表現、まちがっていてすいませんでした。
もう、必死になってやっているので
頭がまわらなくて・・・


すいませんでした。

どうしてこのような処理をしたいかについてですが、
沢山ある検査データベースの中から、集計表をつくりたいのです。
フォルダが、その検査テスト名になっているので、
そのフォルダ名をセルに書き込みたいと思いました。

Sub t2()
 Dim a() As String
 Dim I As Long
 a = Split("C:\Documents and Settings\AAAA\デスクトップ\元データ1\元データ2", "\")
 For I = 0 To UBound(a)
  Debug.Print a(I)
 Next I
 MsgBox a(UBound(a) - 1)
 MsgBox a(UBound(a))
End Sub

をやってみたのですが、
開いたファイルとどう関連つければいいのかが
まったくわかりません。

頭が悪くて本当にごめんなさい。
せっかく教えていただいているのに
わからないことばかりで。。。

本当にすいませんが
もう一度おしえていただけますか?


ちなみに
元データ1も2もフォルダ名です。

【40538】Re:フルパスから文字列の分割をしてフォ...
回答  かみちゃん  - 06/7/15(土) 23:41 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>開いたファイルとどう関連つければいいのか

落ち着いて考えましょう。以下のような感じです。

Sub フォルダ名の取得4()
 Dim OpenFileName As String, OpFNam As String
 Dim PNum As String
 Dim a() As String

 '開くファイル名を指定する。
 OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
 If OpenFileName = "False" Then
  Exit Sub
 End If
 'ファイルを開く
 Workbooks.Open OpenFileName
 '開いたファイルを『OpFNam』という名前とする。
 OpFNam = ActiveWorkbook.Name
 'フルパスの取得
 PNum = Workbooks(OpFNam).Path
 
 a = Split(OpenFileName, "\")
 Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 1).Value = a(UBound(a) - 2)
 Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 2).Value = a(UBound(a) - 1)
End Sub

【40706】Re:フルパスから文字列の分割をしてフォ...
お礼  亜由美  - 06/7/20(木) 19:24 -

引用なし
パスワード
   ▼かみちゃん さん:
>こんにちは。かみちゃん です。
>
>>開いたファイルとどう関連つければいいのか
>
>落ち着いて考えましょう。以下のような感じです。
>
>Sub フォルダ名の取得4()
> Dim OpenFileName As String, OpFNam As String
> Dim PNum As String
> Dim a() As String
>
> '開くファイル名を指定する。
> OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
> If OpenFileName = "False" Then
>  Exit Sub
> End If
> 'ファイルを開く
> Workbooks.Open OpenFileName
> '開いたファイルを『OpFNam』という名前とする。
> OpFNam = ActiveWorkbook.Name
> 'フルパスの取得
> PNum = Workbooks(OpFNam).Path
> 
> a = Split(OpenFileName, "\")
> Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 1).Value = a(UBound(a) - 2)
> Workbooks("書き込みデータ.xls").Sheets(1).Cells(1, 2).Value = a(UBound(a) - 1)
>End Sub


ありがとうございますw
おかげで仕事がはかどりましたーーーーw

またわからなくなったらおしえてくださいw


本当にありがとうございました

【40714】Re:フルパスから文字列の分割をしてフォ...
発言  Jaka  - 06/7/21(金) 9:54 -

引用なし
パスワード
   一応昔の
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=6616;id=excel

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