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

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

ただいまの
回答率

90.36%

  • VBA

    2059questions

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

  • Excel

    1764questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,137
退会済みユーザー

退会済みユーザー

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で作成してます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

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

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


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

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

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

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

Dim fso as New FileSystemObject


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

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

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

endpos = InStr(str, endword)


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

endpos = InStrRev(str, endword)


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/24 09:50

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

    キャンセル

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

GetForder → GetFolder
とかいう話?

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

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

みたいな。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/20 16:47

    全く気付かなかった…

    キャンセル

  • 2016/10/21 10:10

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

    キャンセル

  • 2016/10/21 10:12 編集

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

    キャンセル

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

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • VBA

    2059questions

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

  • Excel

    1764questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。