質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

5722閲覧

VBA資料にてエラーが出てしまう

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

1グッド

0クリップ

投稿2016/10/20 06:58

VBAで資料を作成しています。
フォルダをフルパスで指定をして
その中に入っているすべてのテキストファイルの
中から、特定のキーワードが入っている文字列を
抜出たいと考えています。

###発生している問題・エラーメッセージ
フォルダをフルパスで指定しその中のすべてのテキストを
指定する方法がわかりません。

エラーメッセージ
オブジェクトはプロパティまたはメソッドをサポートしていません。

###該当のソースコード
Sub SerchPath()
'

Dim i As Integer
Dim filepath As String

Dim line As Variant 'ファイルの1行毎を配列として格納する変数
Dim outpos As Long '出力セル開始位置

outpos = 10 '10行目から書き出し
filepath = Range("C4").Value '☆

Dim buf As String 'ファイルの全文字列
'ファイルを開いてbuf変数へ格納
With CreateObject("Scripting.FileSystemObject")
With .GetForder(filepath).OpenAsTextStream
buf = .ReadAll
.Close
End With
End With
'改行コードで一行毎に分割し配列変数へ代入
line = Split(buf, vbCrLf)
'一行毎に検索を実行する
Dim str As String '一時的に1行の文字列を格納
Dim startword As String 'この文字から抜き出す
Dim endword As String 'この文字まで抜き出す
Dim startpos As Long '抜き出す文字の開始位置
Dim endpos As Long '抜き出す文字の終了位置
Dim endpos2 As Long 'さらに最後のDMELを抜き出すのでその文字位置
Dim keyword As String 'この文字を含む
Dim keyword2 As String 'この文字も含む

Dim out As String
startword = Range("S1").Text '検索定義をシートから読み込む
endword = Range("V1").Text '検索定義をシートから読み込む
keyword = Range("S2").Text '検索定義をシートから読み込む
keyword2 = Range("V2").Text '検索定義をシートから読み込む

For i = 0 To UBound(line)
str = line(i)
startpos = InStr(str, startword)
endpos = InStr(str, endword)

'行に startword endword keyword 全ての文字列が含まれているか判定 If InStr(str, startword) > 0 And InStr(str, endword) > 0 And InStr(str, keyword) > 0 And InStr(str, keyword2) > 0 Then out = Mid(str, startpos, endpos - startpos) endpos2 = InStrRev(out, keyword3) out = Mid(out, 1, endpos2 - 1) 'セルB10~へ対して行の抜き出した文字列を書き出す Cells(outpos, 3).Value = out outpos = outpos + 1 '書き出し位置を下へずらす End If

Next i
'

'
End Sub

###試したこと
With .GetForder(filepath).OpenAsTextStreamで
エラーがでてしまいます。

###補足情報(言語/FW/ツール等のバージョンなど)
VBAで作成してます。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

m6u様

横入り失礼します。
提示されたコードですが、下記のように訂正すれば大丈夫です。

Excel

1Dim fso as Object 2Set fso = CreateObject("Scripting.FileSystemObject")

参照:OFFICE TANAKA様のサイトの「FileSystemObjectの使い方」

http://officetanaka.net/excel/vba/filesystemobject/first.htm

あとはm6u様のアドバイス通りです。

ちなみに、参照設定にした場合は下記の通りです。
(参照設定にするか、CreateObjectで定義するかはお好みで。
参照設定にすると、FileSystemObjectのメソッドやプロパティが入力時に自動で表示されます。)

Excel

1Dim fso as New FileSystemObject

これで定義すれば、「With fso」 として使用可能です。
(m6u様のアドバイスの「End With」で閉じることも忘れずに。)

私も、FileSystemObjectにつきましては、「参照設定しないと使えない」と、思い込んでいた時期がございます…。Excelマクロを作成する場合、参照設定は「設定したブックのみ」が有効なのと、他の人がソースコードを見た時、「参照設定は外から解りにくい」ので、敢えてオブジェクト宣言で使用される方もいらっしゃるのだとか(「実践ワークシート協会」のツールで、「参照設定」されているオブジェクトが分かるものがあるとか…)。

あと、「もしかしたら」で気になる点が一つございます。

Excel

1endpos = InStr(str, endword)

の位置ですが、先頭から検索して「最初に見つかった文字」でよろしいでしょうか?
同じ文字や文字列が途中にあると、その位置までとなってしまいますので…。

Excel

1endpos = InStrRev(str, endword)

のような、文字列の末尾から検索、というのもございますので、
おせっかいかもしれませんがご参考にしてみてください。

投稿2016/10/23 05:48

編集2016/10/23 06:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/10/24 00:50

わかりやすくご説明頂きありがとうございました。大変助かりました。
guest

0

GetForder → GetFolder
とかいう話?

個人的には、FileSystemObjectオブジェクトやFolderオブジェクトを
ちゃんと変数で管理した方がしっくりきます。

VBA

1Dim fso As Scripting.FileSystemObject 2Dim d As Scripting.Folder 3Set fso = CreateObject("Scripting.FileSystemObject") 4Set d = fso.GetFolder(ActiveSheet.Range("C4").Value)

みたいな。

それと、もしもWithを使うならEnd Withするのも忘れずに。
オブジェクトを初期化したら、Set fso = NothingとNothingを詰めるのを忘れずに。

投稿2016/10/20 07:42

編集2016/10/20 07:54
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ynakano

2016/10/20 07:47

全く気付かなかった…
退会済みユーザー

退会済みユーザー

2016/10/21 01:10

ご回答ありがとうございます。上記の内容にて実行しましたが「fso As Scripting.FileSystemObject」の部分でユーザー定義がされていませんと表示されてしまいます。
退会済みユーザー

退会済みユーザー

2016/10/21 01:14 編集

参照設定で、Microsoft Scripting Runtimeを追加しないと利用できませんよ? 参照設定に追加して私の書いたようなコードにすると、フォルダオブジェクトやファイルオブジェクトのメソッドやプロパティを使うコーディング時にIntellisense(コード補完)が利用できるようになるのでTypoを防げますし。
guest

0

ファイルオープン~クローズはこんな感じでどうですか。

Dim FSO As Object Dim buf As String Set FSO = CreateObject("Scripting.FileSystemObject") With FSO.GetFile(filepath").OpenAsTextStream buf = .ReadAll .Close End With Set FSO = Nothing

投稿2016/10/20 07:05

ynakano

総合スコア1894

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問