• ベストアンサー

【Excel】マクロのエラー

先日、ここで質問させていただきながら、複数のファイルの全シートから、会社名と金額を取り出して、一覧表を作成するマクロを作りました。(Excel2003使用) この複数のファイルと一覧表は同じフォルダに入っているのですが、一覧表が4種類あるので、そのフォルダ内に『一覧表』という名前のフォルダを作って、その中に4つの一覧表を移動しました。 その後、マクロを実行すると時々「ファイルが見つからない」といった内容のエラーが出るようになったのですが、一旦、中止して一覧表の元になるファイルを1つ開いて何もせずにそのまま閉じた後、再度マクロを実行するとエラーは出ません。 このエラーは、やはり『一覧表』フォルダを作って移動させたことが原因でしょうか?また、このエラーが出ないようにする方法はあるのでしょうか? コードは下記のようになっていて、“ファイル名”というシートに一覧表の元になる複数のファイル名が入力してあります。 Sub LISTOUT() OUT_LINE = 1 MY_BOOK = ActiveWorkbook.Name Sheets("ファイル名").Select For FILE_GYO = 2 To Cells(2, 1).End(xlDown).Row Sheets("ファイル名").Select FILE_NAME = Cells(FILE_GYO, 1) Workbooks.Open Filename:=FILE_NAME OPEN_BOOK = ActiveWorkbook.Name SHEET_SU = Sheets.Count For i = 1 To SHEET_SU Sheets(i).Select CODE_NO = ActiveSheet.Name KAISHAMEI = Cells(2, 3) TSUKIKEI = Cells(1, 23) RUIKEI = Cells(1, 25) Workbooks(MY_BOOK).Activate Sheets("一覧表").Select OUT_LINE = OUT_LINE + 1 Cells(OUT_LINE, 1) = CODE_NO Cells(OUT_LINE, 3) = KAISHAMEI Cells(OUT_LINE, 4) = TSUKIKEI Cells(OUT_LINE, 6) = RUIKEI Workbooks(OPEN_BOOK).Activate Next ActiveWorkbook.Close Next End Sub マクロに関しては初心者ですので、詳しく教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。Wendy02です。 >hana-hana3さんだったら、この内容のマクロはどのように書かれるのでしょうか?もし可能でしたら、今後の参考に示していただけると嬉しいです。 しばらく遠慮して、ROMしていましたが、こちらから、私なりのコードを書かせていただきます。 OUT_LINE, OPEN_BOOK こういう大文字は、定数に限ります。変数は、大文字、小文字交じりにします。また、ループカウンターのFILE_GYO などは、i,j,k などを使います。また、Rangeオブジェクトなどは、出来る限り、暗黙のプロパティではなく、明示的に、Value や Text を使います。 '---------------------------------------------------------------- Sub ListOut_R()  Dim MyBook As Workbook  Dim MySheet As Worksheet  Dim FileName As String  Dim i As Integer 'シート数  Dim j As Long  Dim k As Long    Dim mPath As String    Set MyBook = ActiveWorkbook  mPath = ActiveWorkbook.Path & "\" '違う場合は、適宜書き込む  Set MySheet = MyBook.Sheets("一覧表")    k = 1  Application.ScreenUpdating = False  For j = 2 To Cells(2, 1).End(xlDown).Row   FileName = MyBook.Sheets("ファイル名").Cells(j, 1).Value      'ファイルの存在のチェック   If Dir(mPath & FileName, vbNormal) <> "" Then   With Workbooks.Open(mPath & FileName)       For i = 1 To .Worksheets.Count     k = k + 1     MySheet.Cells(k, 1).Value = .Worksheets(i).Name     MySheet.Cells(k, 3).Value = .Worksheets(i).Cells(2, 3).Value     MySheet.Cells(k, 4).Value = .Worksheets(i).Cells(1, 23).Value     MySheet.Cells(k, 6).Value = .Worksheets(i).Cells(1, 25).Value    Next i    .Close False   End With   End If  Next j  Application.ScreenUpdating = True  Set MySheet = Nothing  Set MyBook = Nothing End Sub

rx-z5815
質問者

お礼

アドバイスありがとうございます。 Wendy02さんの書かれたコードでも試してみたところ、そのまま使用するとエラーが出たので、一部変更したら一覧表はできたのですが、一覧表完成後、元になる複数のファイルを何も変更することなく、閉じるようにするにはどのようにしたらいいでしょうか? (元々そういうふうにコードが書かれていたのならスミマセン!)

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんにちは。Wendy02です。 >ファイル名”シートに入力しているファイル名をフルパスで入力し直して & >コード上でフルパスを指定するのと、どちらがいいのでしょう?? 私自身は、コード上でフルパスにしなおすようにします。フルパスは、名前も長い上にミスが見つけにくいです。というよりも、面倒くさいですね。 最初から、読み直してみました。もともと、「一覧表」フォルダと書かれていたのを、私は、ActiveWorkbook に替えています。「適当に替えてください」として、そのままなっていますが、そこが間違いで、すっかり、見落としていました。それで、エラーに、振り回してしまいました。すみませんでした。 私のコードのここがヘンです。自分で最初#1で書いておきながら、すっかり忘れていました。 * Set MyBook = ActiveWorkbook * mPath = ActiveWorkbook.Path & "\" '違う場合は、適宜書き込む * Set MySheet = MyBook.Sheets("一覧表")    ↓ '明示的にフォルダ名を入れるべきでした。  mPath = "C:\○○○\○○○\一覧表\" '実際のパスを入れてください。  Set MyBook = ActiveWorkbook 'データを入れるブックが、自ブックの場合は、ThisWorkbook でも可  Set MySheet = MyBook.Sheets("一覧表") また、以下のファイル名の書き方によって潜在的にエラーが出る可能性があります。   FileName = MyBook.Sheets("ファイル名").Cells(j, 1).Value ただ、それに関しては、少し、様子を見させてください。今書くと混乱させてしまいます。 お手数掛けて、大変申し訳ありません。

rx-z5815
質問者

お礼

こんにちは。 またまたアドバイスいただき、ありがとうございます。 >フルパスは、名前も長い上にミスが見つけにくいです。というよりも、面倒くさいですね。 質問文に記載しているコードを書いてくださった方から、ファイル名はフルパスで入力しておくと説明されていたのですが、ここの部分でエラーが出ないようになるまで、少々手間がかかりました。確かにミスが見つけにくくて面倒でした(^_^;) 再度、Wendy02さんが修正してくださったコードでマクロを実行してみようと思います。 こちらこそ、何度もお手間を取らせて申し訳ありません<(_ _)>

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。Wendy02です。 今、インターネット検索で、「構文エラー」を探してみました。 mPath = ActiveWorkbook.Path & "\" この場合は、「= (イコール)」と「& (アンパサンド)」が、そのエラーの原因になるのだそうです。 ただ、それは書き方の問題で、こちらからでは、ちょっと分かりませんね。^^; VBAの場合は、文字列などと「演算子」とくっついてしまうことがたまにあり、エラーを出しますね。初歩的なことなのですが、あまり考えないでやっていると、そういうことになります。まあ、こういうことはすぐに修正が利くので、あまり考えたことはありませんが・・・。 もう一つおまけに、そのコードは、グローバルなコードの書き方ではなく、あくまでもローカルな書き方です。ただ、グローバルなコードの書き方って、ちょっと嫌味っぽいので書きません。 以下のように書くのが、正式な書き方です。 Dim PathSept As String  PathSep = Application.PathSeparator 'バックスラッシュもありますから。  mPath = ActiveWorkbook.Path & PathSep

rx-z5815
質問者

お礼

Wendy02さん、おはようございます。 わざわざ「構文エラー」をインターネットで調べていただき、ありがとうございます。 最初に「構文エラー」が出たときに、どう修正すればいいのかわからなかったので、“ファイル名”シートに入力しているファイル名をフルパスで入力し直して、パスに関するコードをコメント化してみたんです。 (コードの前に『'』を入力すれば、その処理は無視されると聞いていたので) エラーは出なくなりましたが、今回の場合“ファイル名”シートにフルパスでファイル名を入力しておくのと、コード上でフルパスを指定するのと、どちらがいいのでしょう?? どちらにしても、正式な書き方をすれば、こういうエラーは避けられるのでしょうけど(^^ゞ

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。Wendy02です。 ActiveWorkbook.Path & "\" '違う場合は、適宜書き込む > 'ファイルの存在のチェック 新規ブックなどを対象とする場合は、エラーは、ここが発生元になります。保存していない状態は、Excelのブックは、キャッシュの中にしか存在しないので、上手くいかない場合があります。 ちょうと、#2の hana-hana3 さんのところで、ThisWorkbook という書き方がありました。本来は、自ブックにマクロを入れて処理するのが基本ですから、ThisWorkbook ですが、ここらあたりは、その状況にもよります。明示的にパス名を入れたほうが安全だというのは言うまでもありません。

rx-z5815
質問者

お礼

再度のアドバイスありがとうございます。 確か一番最初にマクロを実行した際のエラーで > mPath = ActiveWorkbook.Path & "\" '違う場合は、適宜書き込む の部分が黄色になりました。 実は#2の hana-hana3 さんが書かれていた『ThisWorkbook』 という書き方でも試してみたんです。 私はこのコードは何の処理かということがきちんと理解できている状態ではないのですが、いろいろ触ってみることで、少しずつわかるようになってきたような気がします。 今回も最後までお付き合いくださり、ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。Wendy02です。 どこを修正されたのかな? >元になる複数のファイルを何も変更することなく、閉じるようにするにはどのようにしたらいいでしょうか? 閉じないのですか?  .Close False ここに、このように書いて閉じるようにしてありますし、開ける時は、ひとつずつ開けています。

rx-z5815
質問者

お礼

少し時間を置いて、再度ファイル名をよく見直してみたところ、正しく実行されました。 お騒がせしてスミマセンでした<(_ _)>

rx-z5815
質問者

補足

アドバイスありがとうございます。 エラーが出たときにコードを確認したら、一度に全部出たわけではありませんが、下記の3箇所が黄色になりました。 > mPath = ActiveWorkbook.Path & "\" '違う場合は、適宜書き込む > 'ファイルの存在のチェック  If Dir(mPath & FileName, vbNormal) <> "" Then  With Workbooks.Open(mPath & FileName) > .Close False [.Close False]が黄色になったときは、“構文エラー”と出ていたような気がします。 あいまいな記憶で補足にならないかもしれませんが、よろしくお願いします。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

>Workbooks.Open Filename:=FILE_NAME ブックを開くと一時的にカレントフォルダが変化するので、マクロが正しく動くようになったのでしょう。 正しくファイルを開くには、フルパス指定する必要があります。 Workbooks.Open Filename:="C:\Data1\File_A\FILE_NAME.xls" このデータにはどのように入っているのでしょうか? ファイル名に ブックと同じフォルダなら、「FILE_NAME1.xls」 サブフォルダなら、「一覧表\FILE_NAME1.xls」 と入れておいて、 Workbooks.Open Filename:=ThisWorkbook.Path & "\" & FILE_NAME などのように改善する方が良いでしょう。 >ActiveWorkbook.Close も、Workbooks(OPEN_BOOK).Close とした方が良いですね。 細かい部分での改善点は多々ありますが・・・^^;

rx-z5815
質問者

お礼

回答ありがとうございます。 パスを入れることでエラーは出なくなりました。 >ActiveWorkbook.Close も、Workbooks(OPEN_BOOK).Close とした方が良いですね。 とご指摘がありましたので、早速そのように修正しました。 >細かい部分での改善点は多々ありますが・・・ hana-hana3さんだったら、この内容のマクロはどのように書かれるのでしょうか?もし可能でしたら、今後の参考に示していただけると嬉しいです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 >マクロを実行すると時々「ファイルが見つからない」 はっきりとは言えませんが、パスを入れたほうが安全ですね。 問題はここの部分です。 MyPath = C:\○○○\○○○\一覧表\ Workbooks.Open Filename:=MyPath & FILE_NAME 後、コードをみると、Activate とか、Select がありますが、必要ないように書くと、もう少しわかりやすく、スッキリするでしょうね。

rx-z5815
質問者

お礼

Wendy02さん、こんにちは。 パスを入れたところ、エラーは出なくなりました。 エラーが出たときにコードを見てみたら、 “Workbooks.Open Filename:=FILE_NAME”の部分が黄色になっていたので、ここに何か問題があるのだろうとは思ったのですが、まだ自分でコードを作れる状態ではないので。。。 このマクロも例を示していただいたもので、セルやシートの設定等を変更したぐらいで、そのまま使わせてもらっていて、コードを見ても内容はなんとな~く想像できるかなっていう感じです。 回答ありがとうございました<(_ _)>

関連するQ&A

  • マクロを教えてください

    同じフォルダ内にあるXlsブックのあるSheetのデータを他のBookにコピーして貼り付けて貼り付けた側のBookで加工したいのですがうまくマクロが組めません。 Bookを共有で使っているので困っています。 Sub ワードアート1_Click ' ActiveWindow.ScrollWorkbookTabs sition:=xlLast Workbooks.Open ("販売管理表み.xls") Sheets("在庫一覧").Select Cells.Select Range("A1").Activate Selection.Copy Windows("完成在庫.xls").Activate Sheets("完成在庫一覧").Select Range("A1").Select ActiveSheet.Paste End Sub って書いてみましたが、Workbooks…のところでエラーになってしまいました。(TOT)初心者ですみません。教えてください。

  • Excel2007 コピペエラー

    以下を実行すると、「そのコマンドは複数の選択範囲に対して実行できません」エラーがでます。 Workbooks("Test1").Sheets("Sheet1").Range((.Cells(1, 1), .Cells(100, 20)).Copy Workbooks("Test2").Sheets("Sheet2").Activate Workbooks("Test2").Sheets("Sheet2").Cells(1, 1).Select ActiveSheet.Paste どなたか原因を教えて下さい。

  • Excel2002のマクロについて教えてください

    フィルターオプションの自動化を試みたのですが・・・・ sheet「商品一覧」、sheet「抽出結果」 上記2つのSheetがあったとします。 抽出したい表は「商品一覧」、抽出結果を出したい表は「抽出結果」です。(マクロを実行するコマンドボタンは「商品一覧」に作成します) フィルターオプションは、結果を出したいシートから、操作を行えば、別シートにも、結果を出すことができるので、マクロの自動登録を使って、以下のようなマクロが作成できました。 ---------------------------------- Sheets("抽出結果").Select Sheets("商品一覧").Range("B5:G24").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("B3:B4"), CopyToRange:=Range("B7:G7"), Unique:=False ------------------------------------ もちろん、きちんと動作はするのですが、「商品一覧」の範囲が(B5:G24)が変動する場合があるので、以下のように変更をしました。 ------------------------------------ Dim Gyou As Integer Gyou = Worksheets("商品一覧").UsedRange.Rows.Count + Worksheets("商品一覧").UsedRange.Row - 1 Sheets("抽出結果").Select Sheets("商品一覧").Range(Cells(5, 2), Cells(Gyou, 7)).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("B3:B4"), CopyToRange:=Range("B7:G7"), Unique:=False ----------------------------- しかし、上記の方法では、エラーが出てしまいます。 最初は、CurrentRegion を使用しようと思ったのですが、うまくいきませんでした。 マクロを勉強したばかりで、たぶんとんでもないものを作っているのだと思いますが、ご指摘いただければうれしいです。 よろしくお願いします。

  • マクロ構文エラー

    下記のマクロを記述していますが構文エラーが出ます 何が原因でしょうか。 Sub 会計データ送信() Sheets("工程生産バランス").Select file = "ml" & Cells(8, 12) & Cells(9, 13) & ".xls" Range("E5").Select If Range("E5") = "4月" Then Range("E6:E38").Select Selection.Copy Workbooks.Open Filename:="C:\sdata\ml\生産バランス.xls" Sheets("上期工程生産バランス").Select Range("E6:E38").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Range("E6").Select End If Windows("file").Activate  →エラー箇所(インデックスが有効範囲にありません。) Sheets("工程生産バランス").Select Range("E5").Select End Sub 教えてください。

  • エクセル2000のマクロについて再び

    新しいブックを作りさらに他のブックで作成されているシートをコピーして移動するというマクロを作ります。この時、新しく作ったブックの名前がBook1にならないとその時点でマクロのエラーになりなってしまいますが、たまにBook2になってしまうときがあります。必ずBook1になると指定することはできないのでしょうか。 Sheets(Array("sheet1", "sheet2", "sheet3")).Select Sheets(Array("sheet1", "sheet2", "sheet3")).Copy →新しいシートを作成 Workbooks.Open Filename:="C:xxx\○○\△△.xls" Sheets.Copy after:=Workbooks("book1").Sheets(2) →ここで、Book1が存在しないとエラーになってしまう。 お願いします。

  • ExcelでBookを開くPasswordにエラーを出さないには

    Sub Dim FileName As String FileName = "D:\集計表.xls" Dim Sheet_Name As String Dim Book_Name As String Workbooks.Open FileName:=FileName Sheet_Name = "Sheet1" Book_Name = ActiveWorkbook.Name Workbooks(Book_Name).Sheets(Sheet_Name).Select Range("A1").Select End Sub 上記の構文でBookを開く時に「Password」を要求して開くようにしています。 ただ、Passwordを間違えた時は「実行時エラー1004」とな、「デバック」するか「終了」するしかありません。 デバック」・「終了」をせずに再度Password入力に戻るにはどの様にすれば良いでしょうか。

  • 名前の取得のマクロ

    マクロを使って、ファイルの保存をしようと考えています。 CSVファイルをコピーして、Excelファイルに貼り付けて、名前を付けて保存する。 という流れの処理を考えています。 そこで、CSVファイルの名前を取得して、その名前を Excelファイルの名前にしたいのですが、上手くいきません。 Dim filname As String Application.FindFile filname = ActiveWorkbook.Name Namezu = ActiveWorkbook.Name Cells.Select Selection.Copy Windows("000.xls").Activate Sheets("測定データ").Select ActiveSheet.Paste '名前を付けて保存   ActiveWorkbook.SaveAs Filename:= _ "C:\新しいフォルダ\filname.xls", FileFormat:=xlNormal

  • エクセル2007VBAで新規ファイルを作る場合

    現在A社というファイルのsheet1に電気代と名前を付けたデータ、sheet2に ガス代という名前を付けたデータがあり電気代のブックからコピーして新規ファイルに貼り付けをしたいと思い下記のとおりマクロがありますが、新規ブックを開いた時常に1ではなく他に新規ブックを開いていたら2とか3になってしまいます。すると再度新規ブックに戻ってガス代を貼り付ける時2とか3tpか4とかでしたらエラーになってしまいます。 こういう場合どのように書いたら良いのでしょうか? それから最後に新規ファイルで名前を付けて保存のところまでダイアログ出すところまで 教えていただきたいのですが。 マクロ勉強始めたばかりでよろしくお願います。 Sub DGCopy() Cells.Select Selection.Copy Workbooks.Add Cells.Select ActiveSheet.Paste Sheets("Sheet1").Select Sheets("Sheet1").Name = "電気代" Windows("A社.xls").Activate Sheets("電気代").Select Cells.Select Application.CutCopyMode = False Selection.Copy Windows("Book1").Activate Sheets("Sheet2").Select Cells.Select ActiveSheet.Paste Sheets("Sheet2").Select Sheets("Sheet2").Name = "ガス代" Application.CutCopyMode = False End Sub

  • ThisWorkbookの使い方

    お世話になります。 ThisWorkbookとActiveWorkbookの使い方で悩んでいます。 ThisWorkbookのデータをActiveworkbookにコピーしようとしています。 Sub test() Dim temp As String, lrow As Long temp = "C:\申請.xlt" Workbooks.Open temp MsgBox ThisWorkbook.Name MsgBox ActiveWorkbook.Name ThisWorkbook.Sheets("Sheet3").Range(Cells(6, 3), Cells(lrow, 3)).Copy ActiveWorkbook.Sheets(1).Cells(6, 3) End Sub メッセージボックスで確認するとThisWorkbookとActiveWorkbookを正しく選択してくれているのですが、 実際にコピーをする作業のところでは、ThisWorkbookのデータを同じファイルに書き込んでしまいます。 Dim Sendbook As String Workbooks.Open temp Sendbook = ActiveWorkbook.Name を追加して ThisWorkbook.Sheets("Sheet3").Range(Cells(6, 3), Cells(lrow, 3)).Copy Workbooks(Sendbook).Sheets(1).Cells(6, 3) とすると、アプリケーション定義またはオブジェクト定義のエラーです。となります。 どこが間違っているのか、教えてください。 よろしくお願いします。

  • CSV保存マクロ 日付が逆になり困っています。

    マクロに詳しい方、お願いいたします。 エクセルのシートで2018/1/21とセルに記載したものを 下記マクロ(標準モジュールにコード記載)して、CSVで保存しています。 実行後CSVを開くと、21/1/2018になって逆になります。 調べてもわかりません。よろしくお願いします。 Sub Macro1() Application.DisplayAlerts = False main_f = ActiveWindow.Caption out_pass = ActiveWorkbook.Path & "\" Out_name = ActiveSheet.Name Sheets(Out_name).Select Sheets(Out_name).Copy ActiveWorkbook.SaveAs Filename:= _ out_pass & Out_name & ".csv", _ FileFormat:=xlCSV, CreateBackup:=False ActiveWindow.Close Application.DisplayAlerts = True End Sub

専門家に質問してみよう