エクセルVBAで実行時エラー1004を修正したい

このQ&Aのポイント
  • エクセルの関数でエラー値を非表示にする方法を教えてください。VBAで同様の処理を行おうとするとエラーが発生してしまいます。
  • 実験データが記録されたエクセルファイルを開いて、日付とデータを条件にしてデータを取得し、別のシートに表示するマクロを作成しています。しかし、マクロを実行すると実行時エラー1004が発生してしまいます。
  • マクロのコードを確認しましたが、特に問題は見つかりませんでした。マクロを実行するために必要な設定や修正があれば教えてください。
回答を見る
  • ベストアンサー

『続き』 質問番号:701776EXCEL_VBA

■質問番号701776の続きです。よろしくお願いいたします。 http://okwave.jp/qa/q7017764.html ■依頼内容 下記コードで アプリケーション定義またはオブジェクト定義のエラー(実行時エラー1004)を修正したい。 エクセルの関数で =IF(ISERROR(A1/B1),"",A1/B1) といった関数を作成すると、エラー値は非表示で、エラーでない場合のみ、計算しますが、 VBAで同様の式を利用しようとすると、エラーとなって実行できません。ご教授お願いいたします。 Sub macro1() Dim w As Workbook Dim mydate As Date, mydays As Long Set w = Workbooks.Open(Filename:=ThisWorkbook.Path & "\実験データ.xls") mydate = ThisWorkbook.Worksheets(1).Range("E1") mydate = mydate - Day(mydate) + 1 '念のため。 mydays = Day(DateAdd("M", 1, mydate) - 1) ThisWorkbook.Worksheets(1).Range("C5:I35").ClearContents With ThisWorkbook.Worksheets(1).Range("C5").Resize(mydays, 7) .Formula = "=IF(ISERROR(VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data!$B:$K,MATCH(C$4,[実験データ.xls]data!$B$1:$K$1,0))),"",VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data!$B:$K,MATCH(C$4,[実験データ.xls]data!$B$1:$K$1,0)))" .Value = .Value End With w.Close savechanges:=False End Sub

  • puyopa
  • お礼率87% (459/525)

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

>エクセルの関数で =IF(ISERROR(A1/B1),"",A1/B1) といった関数を作成すると、 >エラー値は非表示で、エラーでない場合のみ、計算します =A1/B1という数式がエラーになるのは, 1)エラーの具体的な内容が#DIV/0だった場合:  それはB1がゼロであるのがエラーの直接の原因なので,数式は  =IF(B1=0,"",A1/B1) とすれば良いことが判ります。 2)エラーの具体的な内容が#VALUE!だった場合:  それはA1かB1に「文字列」が記入されているのがエラーの直接の原因なので,数式は  =IF(COUNT(A1:B1)=2,A1/B1,"") などのようにすればよいことが判ります。 3)エラーの具体的な原因を追及するのがメンドクサイ場合:  その場合は,まぁどんなエラーでも対応できる  =IF(ISERROR(A1/B1),"",A1/B1) としても勿論構いません。 でも数式がシンプルにA1/B1程度ならまだしも,もっともっと長くなってきた場合でも,「長い(重い)数式」をイチイチ計算してエラーにならないかまず確認してから,改めて本番の計算を同じだけやり直すのを「不細工だ」と思わなければ,です。 >VBAで同様の式を利用しようとすると、エラーとなって実行できません。 新しいマクロの記録を開始します 所定のセルに =IF(B1=0,"",A1/B1) と数式を記入しEnterして実際に一度式を記入させてみます マクロの記録を終了し,採取できたマクロを参考にして,「この式を記入させる」には一体どんなマクロにすれば良かったのか確認します。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2011/9/20 ユーザー名 : keithin ' '  ActiveCell.FormulaR1C1 = "=IF(RC[-1]=0,"""",RC[-2]/RC[-1])"  Range("C2").Select End Sub むむー。。R1C1形式のマクロが録れてしまいましたが,まぁ肝心の「""」の部分が「""""」と書けばよい事が判ったことで良しとしましょう。 実際のC5セルに(若しくはC5:I35セルに) =IF(ISERROR(VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data!$B:$K,MATCH(C$4,[実験データ.xls]data!$B$1:$K$1,0))),"",VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data!$B:$K,MATCH(C$4,[実験データ.xls]data!$B$1:$K$1,0))) あるいは =IF(MEDIAN(MIN([実験データ.xls]data!$B:$B),$E$1,MAX([実験データ.xls]data!$B:$B))=$E$1,"",VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data!$B:$K,MATCH(C$4,[実験データ.xls]data!$B$1:$K$1,0))) といった数式を記入する操作を新しいマクロの記録でマクロに録って,どんなマクロの書きぶりをしたら正しく動作するのか,確認しながら作成してみてください。

puyopa
質問者

お礼

回答ありがとうございます。お礼が遅くなってすみません。 回答までの導き方まで、ご丁寧に教えていただきありがとうございました。 マクロを使うといった発想が全くなかったので、考え方の幅が広がりました。 keithin様のレベルには程遠いですが、少しでも精進させていただきます。 ありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

Sub test01() Range("C1").Formula = "=IF(iserror(A1/B1),"""",A1/B1)" End Sub を実行してみて。エクセル関数の埋め込みという点では、まく行くのでは。 VBAでエクセルの式の埋め込みはやらないほうが良いと思うが個人的な趣味だが。 ””のVBAにおける表現の経験が質問者には無かったからだけのような感じがする。 ーー また 依頼内容の上記の実例と、コードを貼り付けている実例(VLOOKUP等)と、違うじゃない。こういう質問の仕方はやると読者が迷惑する。 コード実例の Formula = "=IF(ISERROR(VLOOKUP($E$1-DAY($E$1)+$B5,[実験データ.xls]data・・が疑問点ならそれに絞ること。 ーー それまでのコード(日付をいじくっている部分?)も論点がぼやけるので、省いたほうが良いと思う。 読者・回答者が速く判りやすい質問の仕方を考えてください。それが質問者の思考の訓練に役立つ。

puyopa
質問者

お礼

全体のコードが見えたほうが良いと思って、そのまま全て載せてしまいました。 VBAの理解力をあげて、適切な質問ができるように精進いたします。ありがとうございました。

関連するQ&A

  • Excel2007 VBA 転記について

    ご指導のほどお願いします。 見積書からボタン300をクリックするとFAX送付状(テンプレート).xlsに下記内容が転記するように書いたのですが、質問させてください。 ("見積書").Range("c6")→("Sheet1").Range("e14")に貼り付けはうまく行きますが 本当は("見積書").Range("c6")&("見積書").Range("c8")=&"の件"を("Sheet1").Range("e14")に貼り付けしたいのです。 C6セル「○○○工場」 C8セル「○○○作業」 の件 ↑をE14セルに「○○○工場 ○○○作業の件」 として貼り付けたいです。 Sub ボタン300_Click() Workbooks.Open "\FAX送付状\FAX送付状(テンプレート).xls" ThisWorkbook.Worksheets("見積書").Range("a4").Copy Workbooks("FAX送付状(テンプレート).xls").Worksheets("Sheet1").Range("f6").PasteSpecial Paste:=xlPasteValues ThisWorkbook.Worksheets("見積書").Range("i8").Copy Workbooks("FAX送付状(テンプレート).xls").Worksheets("Sheet1").Range("AD9").PasteSpecial Paste:=xlPasteValues ThisWorkbook.Worksheets("見積書").Range("c6").Copy Workbooks("FAX送付状(テンプレート).xls").Worksheets("Sheet1").Range("e14").PasteSpecial Paste:=xlPasteValues  ActiveSheet.Range("F9").Value = Date End Sub ご指導のほどお願いします。

  • EXCEL2000とEXCEL2003のVBAについて

    現在、EXCEL2000で下記のコードを実行しています。 が、EXCEL2003で実行すると、 .UsedRange.Copy myb のコードが実行されているのにコピー出来ていません。 ファイルは開いていて、エラーは出ていないのです。 問題点わかる方教えていただけますか? Sub 日別データ読込() Dim rngsaki As Range Dim pathmacrobook As String Dim namebook As String Dim motobook As Workbook Dim myb As Variant Set rngsaki = Workbooks("残高集計用.xls").Worksheets(3).Range("a2") pathmacrobook = ThisWorkbook.Path & "\CSV読込データ12\" namebook = Dir(pathmacrobook & "*.xls") Do While Not namebook = "" Set motobook = Workbooks.Open(pathmacrobook & namebook) Set myb = Workbooks("残高集計用.xls").Worksheets(3).Range("A65536").End(xlUp) With motobook.Worksheets("Sheet1") .UsedRange.Copy myb End With motobook.Close False namebook = Dir() Loop MsgBox "完了しました" End Sub

  • VBAのエラーについて

    いつも識者の皆様にはお世話になっております。 Excel VBAのことで質問させてください。 Range("i23").Value = Application.VLookup(ThisWorkbook.Worksheets("aaa").Range("b5"), ThisWorkbook.Worksheets("data").Range("a2:b7"), 2, 0) というコードは通るのですが、 Range("i23").Value = Application.Left(VLookup(ThisWorkbook.Worksheets("aaa").Range("b5"), ThisWorkbook.Worksheets("data").Range("a2:b7"), 2, 0), 2) というleft関数を追加したコードだと「sub または function が定義されていません」というエラーになってしまいます。 VBAを始めたばかりなのですが、何か根本的な勘違いをしていますでしょうか? ちなみに Range("i23").Value = Application.Left(Application.VLookup(ThisWorkbook.Worksheets("aaa").Range("b5"), ThisWorkbook.Worksheets("data").Range("a2:b7"), 2, 0), 2) というコードも通りませんでした。 ご回答よろしくお願いいたします。

  • Excel2007VBA 日付の加算について

    ●質問の主旨 コピー元のシートの特定セル(A3セル)に入力されている日付に対して 加算を行い、その加算した日付をシート名とコピー先の シートの特定セルに入力するためにはどうすればよいでしょうか? 具体的には下記のコードをどのように書き換えればよいでしょうか? 「Worksheets(i + 1).Name = mydate」のところでエラーが出てしまいます。 ご存知の方、ご教示願います。 ●コード Sub 一週更新() Application.ScreenUpdating = False Dim i As Integer Dim mydate As Date '既存のシート数を取得 i = ThisWorkbook.Worksheets.Count '最終シートをコピーして後ろに挿入 Worksheets(i).Copy after:=Worksheets(i) 'mydateは最終シートのA3セルに入力されている日付の1週間後の日付とする mydate = DateAdd("ww", 1, Worksheets(i).Range("A3")) '追加したシートのシート名はmydate2の日付とする Worksheets(i + 1).Name = mydate '新しく作成したワークシートについて以下の処理を行う With ActiveSheet Range("A3") = mydate Range("A12").ClearContents Range("A19").ClearContents Range("A26").ClearContents Range("A32").ClearContents End With Application.ScreenUpdating = True End Sub ●補足 上記コードは週単位の報告書を作成するためのコードです。 コピー元のA3セルは表示上は9/16となっており、 「セルの書式設定上」は「日付」→「3/14」, ロケールは日本語です。 私はVBA初心者です。

  • Setステートメントをまとめて記述する方法 (エクセル2000VBA)

    お世話になります。 Setステートメントで以下のように書いて、シート名を省略して使っています。  Set a = ThisWorkbook.Worksheets("い")  Set b = ThisWorkbook.Worksheets("ろ")  Set c = ThisWorkbook.Worksheets("は") これをプロシージャ毎に書くとコードが長くなるので、先頭かどこかに1回書くだけで、全てのプロシージャで使えるようにしたいのですがどうしたら良いでしょうか? このようなプロシージャを実行したいのですが、 Private Sub CommandButton1_Click()  a.Range("A2").Value = "データ1"  b.Range("B4").Value = "データ2"  c.Range("C9").Value = "データ3" End Sub (他にもコマンドボタンやチェックボックス用のプロシージャがあります) Setステートメントだけを先頭に書くと、 「プロシージャの外では無効です」というエラーが出ましたので、 Public Sub hensuu()  Set a = ThisWorkbook.Worksheets("い")  Set b = ThisWorkbook.Worksheets("ろ")  Set c = ThisWorkbook.Worksheets("は") End Sub のようにしたら、「実行時エラー"424":オブジェクトが必要です」というエラーが出てしまいました。 どのようにしたらエラーが出ず正しく動くようになりますでしょうか?よろしくお願いします。

  • 【excel vba】 時刻データのチェック

    dim myDate as Variant myDate = activesheet("xxx.xls").range("A1") if <<<myDateが、"hh:mm::ss"形式のデータかどうか? >>> then 処理1 end if と、したいのですが、 <<<・・・・・>>> の記述内容がわかりません。 ご教授お願い致します。

  • VBAで B.xlsの番号と同じ番号がD.xlsにあればくっつけたい

    VBAで B.xlsの番号と同じ番号がD.xlsにあればくっつけたい  エクセル関数でいうとVlookUPをしたいのですが、1004エラーがかかってしまいます。 必要なところだけを抜き取っているので、分かりにくいかと思いますが、   Dim a, b, c, d, y, x, z, i, j, k, m, n, o, r As Long a = 2 '2 なのは、A2から数えるため。 b = 0 'BookBのレコードの数を数えるための変数。 Do While Workbooks("B.xls").Worksheets("Sheet1").Cells(a, 1) <> "" a = a + 1 b = b + 1 Loop Workbooks("B.xls").Activate For k = 2 To b For m = 2 To 300000 エラー⇒ If Workbooks("B.xls").Worksheets("Sheet1").Cells(k, 1) = Workbooks("D.xls").Worksheets("Sheet1").Cells(m, 1) Then Workbooks("B.xls").Worksheets("Sheet1").Cells(k, 12) = Workbooks("D.xls").Worksheets("Sheet1").Cells(m, 2) Workbooks("B.xls").Worksheets("Sheet1").Cells(k, 13) = Workbooks("D.xls").Worksheets("Sheet1").Cells(m, 3) End If Next m Next k   ・   ・   ・ の部分でつまっています><; 説明が不十分でしたら追加いたしますので、初心者の簡単なエラーだとは思うのですが、教えてください<(__)>

  • エクセルVBAでの質問です。

    まとめ.xlsに、「まとめ」「グラフ」「A」「B」「C」「D」「E」というシートがあって、それと一緒に、A.xls、B.xls、C.xls、D.xls、E.xlsというファイルを開いた際に、A.xlsの、G2:I54をまとめ.xlsのAのシートのA1に、B.xlsの、G2:I54をまとめ.xlsのBのシートのA1に・・・といった感じでコピーを行いたいと思い、以下のようにマクロを組みました。 Dim I(4) As String I(0) = "A" I(1) = "B" I(2) = "C" I(3) = "D" I(4) = "E" Sheets("まとめ").Select For J = 0 To 4 Step 1 Sheets("" + I(J) + "").Select Windows("" + I(J) + ".xls").Activate Range("G2:I54").Select Selection.Copy ThisWorkbook.Activate Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False Workbooks("" + I(J) + ".xls").Close SaveChanges:=False Next J ThisWorkbook.Activate Sheets("まとめ").Select Range("A1").Select この状態では、必ずA~Eのシートと、A~E.xlsが存在しないと処理できないのですが、情報量が変わった場合でも同じような処理を行いたいのです。 たとえば、A~CのシートとA~C.xlsしかない場合、 アルファベットではなく、1~3といった場合、 5枚だけではなく、10枚など増えた場合。 まとめ.xlsの「まとめ」と、「グラフ」のシートには、それぞれA~Eに貼られたデータから引用したり、グラフ化したりしているため、シートの入れ替えは行うことができず、純粋に、「値のコピー」としてもってきたいと思っています。 原則として、A~Eのシートに貼り付けるA~E.xlsに存在するシート名は、A.xlsはA、B.xlsはB・・・といった感じになっています。 それが数字になっても、文字になってもその規則に変更はありません。 分かりにくい説明ですみません。 分かる方、よろしくお願いします。

  • 番号を振るvbaで悩んでいます。

    本を読みながら作ったのですが、全然動いてくれません。 Sheet1に A           B 1 2開始日      2月12日 3開始時間     8:30 4終了時間     12:00 5間隔/ 分      5 6人数/コマ      8 という情報が入っています。 Sheet2には A2から番号が振ってあります。2000件くらいあります。 それに次の条件で番号を振りたいのです。 8時30分から12時までの間で8人毎に5分間下記の時間を振り分けたいのです。 12時を過ぎると翌日の8時半からまた同じことを繰り返します。 Sheet1の情報は毎回変更しますので、変数を使いたいと思っています。      A     B     C 1 2    1001  2/12   8:30 3    1002  2/12   8:30 :      :    :      : :     1008  2/12   8:30 :     1009  2/12   8:35 :     1010  2/13   8:35 :      :    :      : :      :    :      : :     1336  2/13   8:30 :      :    :      :     Sub test() Dim strdate As Date, strtime As TimeValue, endtime As TimeValue Dim i As Long, c As Long, j As Long strdate = Worksheets(2).Range("b2").Value strtime = Worksheets(2).Range("b3").Value = TimeValue("8:30") endtime = Worksheets(2).Range("b4").Value = TimeValue("12:00") Range("b:b").NumberFormatLocal = "h:mm" i = Worksheets(2).Range("b5").Value c = Worksheets(2).Range("b6").Value If strtime < endtime Then Do While strtime < endtime For j = 1 To c Worksheets(1).Cells(j, 0) = strdate Worksheets(1).Cells(j, 1) = strtime Next j strtime = DateAdd("m", 5, strtime) Loop Else strtime = Worksheets(2).Range("b3").Value Do Until strtime = endtime For j = 1 To c Worksheets(1).Cells(j, 0) = strdate + 1 Worksheets(1).Cells(j, 1) = strtime Next j strtime = strtime + 5 Loop End If End Sub これでは全く動きませんでした。 また、strtimeをtimevalueで宣言するとオブジェクトを要求され、結果変数ではなく 直接データを入れることになってしまい、目的を果たせません。 初心者がやることではないなと思いましたが、これが出来ると、私たちの仕事が 画期的に向上するので、是非今回は苦労しても作り上げたいと思いました。 プロの方々はこういう場合、私はIf ⇒Do Loop⇒For Nextをネストしましたが、 どういう風に考えられるのでしょうか?それも興味があります。 よろしくアドバイスお願いします。<m(_ _)m>  

  • VBAの年月を取得したいのですが

    以下のように作成したのですが、 年:XXXX 4桁 できました。 月:XX 2桁ができません、1桁になります。   5月なら05として取得したいのですが、修正方法がわかりません A1には、2009/5/1と入力しています。 VBAに詳しい方で簡単に、どうぞお願いします。 Sub sample() Dim myDate As Date myDate = Range("A1").Value Range("B7").Value = Year(myDate) Range("C7").Value = Month(myDate) Range("D7").Value = Day(myDate) End Sub

専門家に質問してみよう