ExcelVBA マクロエラー値の取り出し方

このQ&Aのポイント
  • Excel2002VBAを利用してcsvファイルを読込み、任意のシートへ貼り付ける処理を作成しています。
  • フォームのボタン押下により、マクロ記録で作成したシートへの貼りつけ処理を行う際、csvファイルが存在していないと、Err.Number=1004が発生してしまいます。
  • これをOnErrorでキャッチしてマクロの中でWk_ErrCode(フォームモジュールでPublicで定義)へセットし、フォームモジュールへ戻る処理を組んだのですが、戻り値が0になってしまい、後続処理を迂回出来ない様です。
回答を見る
  • ベストアンサー

ExcelVBA マクロエラー値の取り出し方

Excel2002VBAを利用してcsvファイルを読込み、任意のシートへ貼り付ける処理を作成しています。 フォームのボタン押下により、マクロ記録で作成したシートへの貼りつけ処理を行う際、csvファイルが存在していないと、Err.Number=1004が発生してしまいます。 これをOnErrorでキャッチしてマクロの中でWk_ErrCode(フォームモジュールでPublicで定義)へセットし、フォームモジュールへ戻る処理を組んだのですが、戻り値が0になってしまい、後続処理を迂回出来ない様です。  出来れば、Err.Numberを利用したままエラー判定処理をフォームモジュールで行いたいのですが、良い方法は有りませんでしょうか。。。

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

  • ベストアンサー
  • komet163
  • ベストアンサー率51% (22/43)
回答No.3

たびたび済みません。#2のコードは誤りでした。 エラー処理内で On Error Resume Next を 実行しいるので、エラー処理部分の意味が消失しています。 流れ的に正しいのは以下になります。 Public Wk_ErrCode As long Sub main() On Error Resume Next 'エラーは流す Workbooks.Open _ Filename:="C:\..\Book.csv" 'エラー発生行 Wk_ErrCode = Err.Number 'パブリック変数に格納 If Wk_ErrCode <> 0 Then 分岐作業1 Else 分岐作業2 End If End Sub すっきりしましたね。エラーを流して、予期されるエラーコードに対応した処理を用意しています。 なんか混乱させてしまいました。申しわけ有りません。

Adenau
質問者

お礼

 こちらこそ何度も有難うございました。 勉強させて頂きました。 また宜しく御願いします。

その他の回答 (2)

  • komet163
  • ベストアンサー率51% (22/43)
回答No.2

ご質問の内容の処理はこんな感じですか? Public Wk_ErrCode As long Sub main() On Error GoTo ERRCODE Wk_ErrCode = 0 '初期化 Workbooks.Open _ Filename:="C:\..\Book.csv" 'エラー発生行 If Wk_ErrCode <> 0 Then 分岐作業1 Else 分岐作業2 End If Exit Sub '以下エラー処理 ERRCODE: Wk_ErrCode = Err.Number 'パブリック変数に格納 On Error Resume Next 'この処理内でエラーを解決してないので必要 Resume 'エラー発生行に戻る End Sub 上記の流れだと動く事は確認しました。 また、ファイルの有無で分岐するには、 If Dir("C:\..\Book.csv") = "" Then CSVファイルが存在しない処理 Else CSVファイルが存在する処理 End If が簡単だと思います。

Adenau
質問者

補足

 何度もご迷惑掛けます。  概ね記入して頂いた流れの処理で私の方の処理と有っております。OnErrの処理へ飛ばした後、selectで Err.Numberが1004のケースは、MsgBoxで”ファイル無し”の旨を表示し、Wk_ErrCodeにErr.Numberをセットしてメイン処理に戻してます。メインの次行でWk_ErrCodeを判断、後続処理の迂回判定としております。  後ろに書いて頂いた判定処理を該当処理の前へ付けておくのが無難な気がして来ました…。  質問をUPしているPCとVBA作っているPCが異なり、環境を接続できない為、ソースを貼り付け出来ず御面倒をお掛けしました。

  • komet163
  • ベストアンサー率51% (22/43)
回答No.1

Err の内部情報は、明示的に Clear したり、 エラー処理先で、再度 On Error 構文を使用 しない限り保持すると考えています。 対処としては、コードをチェックされてみては? しかし、エラー発生のプロセスが判っているときは、 発生を未然に防ぐ方がスマートですよ。

Adenau
質問者

補足

回答有難うございます。  マクロ内部でOn Error処理を行い、その値をPublic定義したWk_ErrCodeにセット、戻り行(マクロ呼出し行の次行)で判定(Wk_ErrCode<>0)しているので、問題ないと思ったのですが、0で通過してしまいました。Wk_ErrCodeをErr.Numberに変更し、試しても状況に変更は有りませんでした。尚、Err.Numberのリセットは実施していないのですが・・・

関連するQ&A

  • エクセルマクロでファイルを開いて保存したいです。

    エクセルマクロでファイルを開いて保存したいです。 エクセルファイルでファイル名「編集」という物を開きます。 このSheet1には中央にコマンドボタンが作成して有ります。 このボタンをクリックして以下の作業をマクロで行いたいです。 1.エクセル標準の「ファイルを開く」のメッセージボックスが開く 2.ここは使用者が作業をしてもらう   マイドキュメントだったり、マイネットワークだったり、   (ファイルの種類はCSVにする)   処理をしたいCSVファイルを探してもらい選択後、開くをクリック   例えば20100922.CSVを選択し開くをクリック 3.クリックと同時にそのファイルが展開されて、「編集」のエクセルファイルの   Sheetにシート名「集計」が作成されそのシートにCSVファイルの全内容がセルA1から貼り付く。   さらに登録してあるマクロモジュールで編集処理がされ   マクロを引き継がず、シート「集計」だけを   ファイル名は固定でそのファイル名の後ろに作成日(システム日付)を入れて   参照したCSVファイルの保管場所に保存する。   ファイル名例:売上20100923.xls(売上は固定) 4.エクセル「編集」のファイルからシート「集計」を削除する。 5.メッセージBOXで「編集終了」と表示 次回エクセルファイル「編集」を開くと、コマンドボタンだけである。 また作成された「売上20100923」はマクロがないから開くときに マクロのメッセージは出ない。というようにしたいです。 NO.2のファイルを選択する作業は作業者にしてもらいますが シート1のコマンドボタン1回を押すだけでNO.1~NO.5まで完結させたいです。  NO.3のマクロ処理はマクロの記録でモジュールができています。 このマクロの作成方法と、そのマクロが出来たら その文のどこに作成済みの処理文を入れればいいのかわかりません。 よろしくお願いします。 ここでつまづいています。この後この選択したファイルの全内容が シートの集計に展開されません。 Private Sub CommandButton1_Click() Call 集計 End Sub Sub 集計() FullPath = Application.GetOpenFilename("CSV,*.CSV") If FullPath <> "False" Then Sheets("Sheet1").Select Sheets.Add ActiveSheet.Name = "集計" With ActiveSheet.QueryTables.Add(Connection:="CSV;" & FullPath, Destination:=Range("A1"))   マクロの記録で作成したマクロ   シート"集計"をマクロを引きつかずファイル名売上&システム日付で保存   シート"集計"を削除する

  • ExcelVBAでモジュールを送る

    ちょっとわかりにくいかもしれませんが、モジュールのコピーをマクロでできないものでしょうか? ExcelVBAで二つのファイルを使っています。Aという何のデータも入っていないファイルなのですが、実はそれにモジュールが書いてあり、それ専用に使っています。 CSVデータを変換したり、図形を描いたり、グラフを作るプログラムが書いてあります。 そのAファイルを使ってCSVデータ「Bファイル」を起動します。BファイルはダウンロードしてきたCSVファイルです。 Aファイルは常に個人個人がもっているのですが、CSVはネット上からダウンロードしています。 当然Aファイルが常に起動していないと、Bファイルだけでは「CSV変換」や「図形描写」ができないのわけです。「CSV変換」は最初の1回で終わる話ですが、「図形描写」「グラフ作成」はその後何度もすることがあります。 単にBファイルからマクロのインポートなどをすれば済むのかもしれませんが、数多くの使用者の中には「マクロのイン・エクスポートができない」とか「めんどくさい」という方がいます。外部にデータを引き渡す際に、AとBの両方送らねばならなくなってしまいます。 で・・・お伺いしたいのはマクロで「Aファイルのモジュール」を「Bファイルの中にコピー」できないか?ということなんです。 Aファイルでボタン一つを押せば、すべて整う環境にしたいのです。 逆に「AファイルにBのCSVデータをコピーして、そこで使うようにすれば?」と聞いたのですけど、それはどうしても出来なかったときの最低ラインとし、出来れば「Aのモジュール→BのCSV」に行きたいのだそうです。 マクロでモジュールのコピーというのは・・・出来るものなのでしょうか?よろしければ教えてください。

  • マクロ 上位モジュールの作成

    4つのマクロ(basファイル)A,B,C,Dがあります。 これらを下位モジュールとする、上位モジュールをつくり 条件に応じてマクロを実行させたいと思っています。 どのようにマクロになりますでしょうか? 条件はファイル名に32~38の数字が含まれていて 32~35まではAの処理、 36はBの処理、37はCの処理、38はDの処理をしたいと考えています。 イメージとしては IF ファイル名=*32.csv or *33.csv or *34.csv or *35.csv Then A.bas elseif ファイル名=*36.csv Then B.bas elseif ファイル名=*37.csv Then C.bas elseif ファイル名=*38.csv Then D.bas end if 上記のような感じでIF文を全てのファイルを処理するまでループさせたいのですが、どなたかお教えいただけないでしょうか?

  • エクセル/マクロ エラー処理がうまくいきません

    エクセルマクロの質問です。エクセルのヴァージョンは2000です。 シートをコピーして新シートに任意の名前を付けるマクロを作っています。 ユーザーフォームの中に一つのテキストボックス(新シートの名前入力用)と 二つのコマンドボタンを設置し一つは実行ボタン、もう一つはキャンセルボタンとしました。 テキストボックスに不正な名前(空白、記号、すでに存在するシート名)が入力された状態で 実行ボタンを押すと新シートは作成されず、メッセージボックスで実行できない旨が表示され、 入力フォームに戻るという感じにしようと思っています。 エラー処理には下記の通りOn Errorステートメントを試してみました。が、どうもうまくいきません。 エラーが出ても新しいシートが作成されてしまい、その後にメッセージボックスが出てしまいます。 正しいエラー処理の仕方をご教示頂けると幸いです。どうぞよろしくお願いします。 Private Sub CommandButton1_Click() Dim NewSheetName As String NewSheetName = TextBox1.Value On Error GoTo Err1 Sheets("Summary").Select Sheets("Summary").Copy After:=Sheets("Summary") ActiveSheet.Name = NewSheetName Exit Sub Err1: MsgBox "Invalid name"    Exit Sub End Sub

  • マクロ初心者です。よろしくお願いします。

    マクロ初心者です。よろしくお願いします。 エクセルのシート上には3つの同様な書式があり、No.1~No.3まで入力ができる。 No.1~No.3の各書式欄外に入力ボタン1~3が配置されている。入力ボタン1を選択すると ユーザーフォーム1が表示される。ここまではできたのですが… (1)ユーザーフォーム上に作成したオプションボタンで「男」と「女」を選択 (2)同フォーム上で作成したコマンドボタン1~8でそれぞれの該当する項目1つを選択 (3)(2)の項目に該当がない場合はコマンドボタン9「該当なし」かコマンドボタン10「「入力不要」   のどちらかを選択 (4)「Ok」ボタンを選択するとすでに作成済みの標準モジュール男女別・各項目別1~8・該当なし・  入力不要の作成済みのマクロを呼び出し実行させる。  なお、(1)のデフォルトは「男」になっており、ユーザーフォーム上(2)か(3)のどれか1つを選択し  なければMsgboxで"エラーメッセージを表示" (5)コマンドボタン11「キャンセル」を選択すると(2)~(4)の入力内容が無効になる。 このようなマクロを作成したいのですが、色々なサイトやマニュアル本を見ても、うまく作動しません。 ご教示のほどお願い致します。

  • EXCELマクロでのThisisWorkbookの削除をしたいです。

    EXCELマクロでのThisisWorkbookの削除をしたいです。 いつもとても助けられています。 今回もいろいろと他の質問内容等を参考にしていますが、 解決出来ません。 お力を貸して下さい。 やりっていることは、毎回CSVファイルを自動で読み込みして、 ワークシート上の各種設定をしてから公開用のEXCELファイルとして、 別のファイルに保管しています。 そして、その公開用ファイルにては複数のメンバーにて、 付いているマクロ(標準モジュール)を使って処理をします。 このために、EXCELのThisisWorkbookにて ファイルを読み込み時の複数のマクロの処理を書いていて、 他に標準モジュールで複数のマクロの処理を書いています。 そして、マクロでさらにやりたいことは、 現在は、そのThisisWorkbookにて最後に処理したシートの内容を 別名にて保存してから、保存したファイルを一度開いて、 ThisisWorkbookのマクロを削除 (メンバーが使う時は最初の読み込み時の処理は不要でエラーとなる) する必要がありますが、 この操作を無くして、自動化することです。 ThisisWorkbookをマクロで削除する例や シートのみコピーをコピーしたあとに 標準モジュールをエクスポート・インポートすればいい?? とか見つけたのですが、 ウィルス対策ソフトでウィルス判定されてしまう等、 うまく行きません。 なんとか他のやり方なので、やる方法はないでしょうか。 現在のEXCELは2000ですが、 以降の上位バージョンでも出来ることが望ましいです。 よろしくお願い致します。 尚、他のやり方としては、 今の1つのファイルでのやり方を、 ThisisWorkbookでの内容のファイルと、 公開用のファイルを最初から用意しておいて、 2つのファイルで処理することも考えましたが、 出来れば2つのファイルの運用になるのでやりたくないのです。 以下は自分がネットで調べた情報です。 http://officetanaka.net/excel/vba/vbe/07.htm#sample01 http://www.seiji-tsubosaki.net/ExcelTech/ExcelProfessionalEngineerTechnic/Contents_08.htm

  • マクロ作成後、エラー70が出て動作しません。

    ■EXCEL2010のマクロについて■ マクロ作成後、下記のエラーが出てしまいます。 実行時エラー 70 書込みできません。 ↓デバックを見ると、この箇所に黄色いマークがつきます。 Set out = fs.CreateTextFile(fpath & "\sitelist.csv", True) 色々と確認して見ましたが、よくわかりません。 ★原因と思われるのが マクロ-シート(マクロ管理シート)を作成後、 そのファイルを開くと(マクロ管理シート1)で表示されてしまい、 エラー 1004が出ます。 ただし、ドロップ&ドラッグすれば、(マクロ管理シート)が表示され、 マクロが問題なく動作します。 どうすればよいのでしょうか? 知り合いにもらったマクロを元にいじっていますので、 よくわからない部分もありますが、よろしくお願いいたします。 --------------------------------------- 以下、マクロです。 Sub 作成_Click() Dim fpath As String Dim fs As Object Dim out As Object Dim i As Long Dim myArray() As String Dim title As String fpath = ActiveWorkbook.Path Set fs = CreateObject("Scripting.FileSystemObject") Set out = fs.CreateTextFile(fpath & "\sitelist.csv", True) For i = 5 To 105 title = Cells(i, 1) Mar = Cells(i, 2) Email = Cells(i, 3) URL = Cells(i, 4) msg = Cells(i, 5) category_miumiulink = Cells(i, 6) category_inavi = Cells(i, 7) other_link = Cells(i, 8) passwd = Cells(i, 9) keyword = Cells(i, 10) ame = Cells(i, 11) temprate = Cells(i, 12) jyanru = Cells(i, 13) If title = "" Then Exit For End If csv = "" csv = csv & Chr(34) & title & Chr(34) & "," csv = csv & Chr(34) & Mar & Chr(34) & "," csv = csv & Chr(34) & Email & Chr(34) & "," csv = csv & Chr(34) & URL & Chr(34) & "," csv = csv & Chr(34) & msg & Chr(34) & "," csv = csv & Chr(34) & category_miumiulink & Chr(34) & "," csv = csv & Chr(34) & category_inavi & Chr(34) & "," csv = csv & Chr(34) & other_link & Chr(34) & "," csv = csv & Chr(34) & passwd & Chr(34) & "," csv = csv & Chr(34) & keyword & Chr(34) & "," csv = csv & Chr(34) & ame & Chr(34) & "," csv = csv & Chr(34) & temprate & Chr(34) & "," csv = csv & Chr(34) & jyanru & Chr(34) Call out.writeline(csv) Next i MsgBox "作成お疲れ様でした♪" End Sub ---------------------------------------

  • エクセル マクロ一覧

    開いているブックにあるマクロの一覧を作れないものでしょうか? モジュール、シート、ユーザーフォーム内にあるマクロすべてです。 VBAのチェックシートとして使いたいのですが エクセルバージョンは2003です

  • 【ExcelVBA】マクロボタンについて

    こんにちは。 Excel2003で作成したマクロ1をマクロボタン1に登録してシート上に配置しています。 これをExcel2013で開いて(互換モード)マクロボタン1をクリックしてマクロ1を実行すると、エラーは出ませんが、正しい結果が得られません。 マクロボタンからではなく、Alt+F8キーで表示されるマクロ一覧からマクロ1を選択して実行すると、正しい結果が得られますので、コードの記述には問題なさそうです。 上記のマクロとは別のマクロ2をマクロボタン2に登録して、マクロボタン1と同じシート上に配置していますが、こちらはボタンからの実行でも正しい結果が得られます。 試しに、フォームコントロールから新たにボタンを挿入し、マクロ1を登録して実行してみましたが、結果は同じでした。 また、互換モードではなくExcel2013で保存し直して(.xlsm)上記と同じことをしてみましたが、これも結果は同じでした。 何が原因として考えられるでしょうか? マクロをボタンに登録しないと絶対に困るというわけではないのですが、ボタンからの実行では正しい結果が得られないのが不思議です。 よろしくお願いします。

  • ACCESS:97→2002のモジュールの変換エラーについて

    ACCESS97で作成したファイルをACCESS2002に変換したいのですが、 変換中にコンパイルエラー発生しましたとメッセージが表示されてしまいました。 ファイル自体は変換できておりエラーテーブルを見るとモジュールが変換エラーを起こしていました。そのモジュールを実行させるとやはりエラーが出て止まってしまいます。 ~モジュールの内容は~ テーブルを削除するために削除クエリーの実行(これはうまく動いてます。) フォームに入力されたパスのCSVファイルをインポートする。定義名:CSVインポート定義"インポート先:"CSVテーブル" (これがうまく動かないようです。実行させると「このファイルをインポートできません」とメッセージがでます。) 以下のものになります。 Option Compare Database Option Explicit '------------------------------------------------------------ ' CSVインポート ' '------------------------------------------------------------ Function CSVインポート() On Error GoTo CSVインポート_Err Dim parm1 As String parm1 = Forms!報告書作成!インポートパス & " " ' 入力データ削除query DoCmd.OpenQuery "全て削除クエリー", acNormal, acEdit ' インポート実施 DoCmd.TransferText acImportDelim, "CSVインポート定義", "CSVテーブル", parm1, False, "" CSVインポート_Exit: Exit Function CSVインポート_Err: MsgBox Error$ Resume CSVインポート_Exit End Function もし不足な点がありましたら補足させていただきます。 よろしくお願いします。

専門家に質問してみよう