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

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

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

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

Q&A

解決済

2回答

917閲覧

エクセル2010 実行時エラー1004

nanami12

総合スコア1015

VBA

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

0グッド

0クリップ

投稿2019/01/12 05:29

前提・実現したいこと

ここに質問の内容を詳しく書いてください。

エクセル2010にてマクロ走行中に実行時エラー1004
アプリケーション定義またはオブジェクト定義のエラーが出力される。

フォルダパスを指定した後、再帰的にフォルダの中身を(サブディレクトリを含む)を参照し
拡張子.log ファイルをエクセルの6行目、D列に書き込ませています。

階層の浅いファイルでは等エラーは発生しませんが
階層が深く、ファイル数が多いと当、現象が発生します

発生している問題・エラーメッセージ

実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。

該当のソースコード

Dim 行 As Long
Dim cnt As Long
Dim c行 As Long
Dim d行 As Long
Dim h行 As Long
Dim i行 As Long

Sub open_dir_and_run()

Dim Folder As Object
Dim strPath As String

Set Folder = CreateObject("Shell.Application"). _ BrowseForFolder(0, "フォルダを選択してください", 0, 0) If Not Folder Is Nothing Then strPath = Folder.Items.Item.Path Else Exit Sub End If cnt = 5 c行 = 5 d行 = 5 h行 = 5 i行 = 5 Call re_call(strPath)

End Sub

Sub re_call(ByVal strPath)

Dim buf As String Dim textbuf As String Dim text_cnt As Long buf = Dir(strPath & "*.log") 'ターゲットのファイル名 tgt_file = strPath & "\" & buf Do While buf <> "" Open tgt_file For Input As #1 Do Until EOF(1) Line Input #1, textbuf cnt = cnt + 1 Cells(cnt, 4) = textbuf <--- ここでエラー Loop Close #1 buf = Dir() Loop With CreateObject("Scripting.FileSystemObject") For Each f In .GetFolder(strPath).SubFolders Call re_call(f.Path) Next f End With

End Sub

VBA エクセル

試したこと

グローバル変数 cnt が694になったときにエラーが出力されます
ウォッチで
Cells(cnt, 4)を監視していると
落ちたときに、中身が
: FormulaLabel : <アプリケーション定義またはオブジェクト定義のエラーです。> : XlFormulaLabel : Module1.re_call

: Name : <アプリケーション定義またはオブジェクト定義のエラーです。> : Variant : Module1.re_call : PivotCell : <アプリケーション定義またはオブジェクト定義のエラーです。> : PivotCell : Module1.re_call : QueryTable : <アプリケーション定義またはオブジェクト定義のエラーです。> : QueryTable : Module1.re_call : ServerActions : <アプリケーション定義またはオブジェクト定義のエラーです。> : Actions : Module1.re_call

が、見えています

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

原因は分かりませんが、この辺りを確認してみてはいかが?

1.エラーが出る時のtextbufの中身は?
2.イミディエイトでCells(694, 4).Value = "aaa"を実行してもエラーが出ますか?
3.新規ワークシートでも再現しますか?
4.一応、モジュール先頭にOption Explicitを付けて変数の宣言を強制してはいかがですか?
5.Cellsの前にシートを指定してはいかがですか?(プログラム序盤にSet WS = ActiveSheetとして、使う時はWS.Cells(・・・).Valueとしては?

ついでに書き下ろしてみました。

vba

1Option Explicit 2 3Const 出力列 = 4 4 5Sub open_dir_and_run() 6 7 Dim Folder As Object 8 Dim strPath As String 9 10 Set Folder = CreateObject("Shell.Application"). _ 11 BrowseForFolder(0, "フォルダを選択してください", 0, 0) 12 13 If Not Folder Is Nothing Then 14 strPath = Folder.Items.Item.Path 15 Else 16 Exit Sub 17 End If 18 19 20 Dim cnt As Long 21 Dim WS As Worksheet 22 Set WS = ActiveSheet 23 24 WS.Columns(出力列).NumberFormatLocal = "@" 25 cnt = 5 + 1 26 Call re_call(strPath, WS, cnt) 27 Debug.Print "次の出力行:" & cnt 28 29End Sub 30 31'strPath : 検索フォルダパス 32'WS : 出力シート 33'outRow : 出力開始行 34Sub re_call(ByVal strPath As String, ByVal WS As Worksheet, ByRef outRow As Long) 35 36 Dim LogArray() As String 37 Dim objFile As Object 38 Dim objFolder As Object 39 40 With CreateObject("Scripting.FileSystemObject") 41 42 'ファイル内容出力 43 For Each objFile In .GetFolder(strPath).Files 44 'logファイルのみ 45 If objFile.Name Like "*.log" Then 46 '※改行コードはCRLF 47 LogArray = Split(objFile.OpenAsTextStream(1).ReadAll, vbCrLf) 48 If UBound(LogArray) > 0 Then 49 'SplitのUboundは要素数-1だがログファイルの末尾が(普通は)空行なので+1され相殺のため無視してOK 50 '両方を想定するなら修正が必要。 51 WS.Cells(outRow, 出力列).Resize(UBound(LogArray) + 1, 1).Value = WorksheetFunction.Transpose(LogArray) 52 outRow = outRow + UBound(LogArray) 53 End If 54 End If 55 Next 56 57 '配下のフォルダを再帰呼び出し 58 For Each objFolder In .GetFolder(strPath).SubFolders 59 Call re_call(objFolder.Path, WS, outRow) 60 Next 61 62 End With 63 64End Sub

追記:エラー1004が出た原因はtextbuf="=="のようです。
WS.Columns(出力列).NumberFormatLocal = "@"を追加して書式設定を「文字列」に変えることで対処できます。

投稿2019/01/12 11:29

編集2019/01/13 02:43
KotorinChunChun

総合スコア73

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

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

nanami12

2019/01/13 02:22

1. エラーが出る時のtextbuf の中身は "================================== 結果 =================================="です。リプライする際結果の後にスペースが 表示されるかもしれませんが、スペース1文字の後に=が続いてます 2.でます 3.再現します 4.Option Explicit をつけました 5. Dim ws As Worksheet Set ws = Sheets(1) Set ws = Worksheets(1) ws.Cells(cnt, 出力列).Value = textbuf    とし実行しましたが グローバル変数 cnt が694になったときにエラーが出力されます
KotorinChunChun

2019/01/13 02:45 編集

なるほど、そういうことでしたか。 犯人は1のtextbuf の内容ではないかと思います。 書式設定が「標準」のセルにイコールが2回続いた値を代入しているため、数式と判断されてエラーが出ているようです。 解決策としては、事前に書式設定を「文字列」に変えてください。 手動でやっても良いですが、VBAでやるならSet ws=・・・の次の行に下記を入れておくだけでOKです。 ws.Columns(4).NumberFormatLocal = "@" 上記の私のコードも直しておきます。 しかし2.Cells(694, 4).Value = "aaa"がエラーになるのが納得いきません。本当に"aaa"を代入した場合もエラーが出るのでしょうか。
nanami12

2019/01/13 03:03

kotori-chunchun 様、適切なご回答、ありがとうございました。 犯人逮捕しました。 無事、マクロが最後まで、走行することを確認しました。
nanami12

2019/01/13 03:10

>しかし2.Cells(694, 4).Value = "aaa"がエラーになるのが納得いきません。本当に"aaa"を代入した場合も>エラーが出るのでしょうか。 落ちた後に値を書き換えた為、エラー表示されただけかとおもいます。 cnt カウントが694になった直後に値を書き換え再度確認しましたが。 走行しました。なのでkotori-chunchun様の認識はあってます。 私のオペミスです。
KotorinChunChun

2019/01/13 03:14

それは幸いでした。 結果報告ありがとうございます。 解決ボタンを押してクローズしておいてください。
guest

0

OPENステートメントのファイルパス文字数制限でエラーが発生していると思われます。
http://mgate.info/computer/software/msoffice/excel/959/

投稿2019/01/12 08:19

TanakaHiroaki

総合スコア1063

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

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

nanami12

2019/01/12 09:38

落ちる、直前のファイルパスが格納されている変数tgt_file は98バイトである事を確認しました。 教えていただいた、URLを参照し、260バイトは超えてませんでした。 ファイルパス文字数制限は、超えてないと思うのですが・・・・
TanakaHiroaki

2019/01/12 09:57 編集

ファイルパス文字数制限は関係ないのですね。 それでは、OPENステートメントは空いている番号を取得して 使用するようにしてはどうでしょうか。 FNo = FreeFile DoEvents Open tgt_file For Input As #FNo
nanami12

2019/01/12 10:36

ご指摘の通り、コーディングし、FreeFile関数で使用可能なファイル番号を取得し、実行しましたが グローバル変数 cnt が694になったときにエラーが出力されます
TanakaHiroaki

2019/01/12 10:38

そうですか。問題が別のところにあるようなので、お役に立てず申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問