Excelマクロ 実行エラー | 大学生の質問

このQ&Aのポイント
  • Excelマクロ初心者(ほぼ初めて)の大学生が、データ整理とパラメータ算出のためにマクロを使用する際に実行エラーが発生しています。具体的には、「SubまたはFunctionが定義されていません」というエラーメッセージが表示されます。
  • プログラム文の内容は、画像解析結果からDf算出に必要なパラメータを算出するExcelマクロです。ただし、まだ改良の余地があります。エラーの原因やバグの対処方法についてアドバイスを求めています。
  • Excelマクロの実行エラーやバグの対処方法についてアドバイスを求める大学生です。マクロを使用してデータ整理とパラメータ算出の作業効率を上げたいと考えています。
回答を見る
  • ベストアンサー

Excel マクロ 実行エラー

Excelマクロ初心者(ほぼ初めて)の大学生です。 研究室でのデータ整理&パラメータ算出で頻繁にExcelを使用します。 かなり面倒で、他の学生に頼むにも整理&算出方法を一から説明しなければならないので、マクロを使って作業効率を上げられる&人にも頼めるという話を聞きチャレンジしました。 とりあえずVBE(?)で作ってみましたが実行するとエラーが発生してしまいます。 「SubまたはFunctionが定義されていません」というメッセージが表示されます。 プログラム文は以下の通りです。 Sub Df算出() ' ' ' '2009/11/2 **研 **** 作成 ' ' ' 'Visual BASICによるプログラミング '****による画像解析結果から、Df算出に必要な種々のパラメータを算出するExcelマクロである '算出される値→dp、Ap、n、ln(Rg/dp)、ln(n) ' '解析結果から基本的なパラメータを求めるだけであり、まだまだ改良の余地があるマクロである '誤りが発覚した時、解析内容が変わった時、処理内容を追加したい時など 'ぜひこのマクロを参考にして、改良して活用して頂けると幸いである ' ' '解析結果、計測回数、粒径の入力が済んでいる事を確認する ' If vbNo = MsgBox("解析結果のペースト、列K、Мへの入力は済んでいますか?", vbYesNo) Then Exit Sub ' ' '変数の型/宣言 'X=ラベル数 ' Dim X As Integer ' Name = "ラベル数入力ボックス" X = InputBox("解析画像のラベル数を入力して下さい", Title = Name) ' ' '全てのラベルについて繰り返し処理 ' '変数の型/宣言 'i=カウンタ変数 ' ' Dim i As Integer ' ' For i = 3 To X + 2 ' ' Cells(i, 12) = Cells(i, 11) - Cells(i - 1, 11) 'ラベルiにおける計測回数を列Lに出力 ' '稀に生じるバグ(?)データは処理せず弾く ' If Cells(i, 12) = 0 Then GoTo Label ' Else ' 'ラベルiにおけるdpを列Nに出力 ' Cells(i, 14) = (Cells(i, 13) * Cells(i, 11) - Cells(i - 1, 13) * Cells(i - 1, 11)) / Cells(i, 12) ' 'ラベルiにおけるApを列Оに出力 ' Cells(i, 15) = (Pi() * Cells(i, 14) ^ 2) / 4 'Ap=πdp^2/4 ' 'ラベルiにおけるDf算出用のnを列Pに出力 ' Cells(i, 16) = (Cells(i, 9) / Cells(i, 15)) ^ 1.09 'n=(A/Ap)^1.09 ' 'ラベルiにおけるDfグラフの横軸を算出 ' Cells(i, 17) = Ln(Cells(i, 8) / Cells(i, 14)) 'ln(Rg/dp) ' 'ラベルiにおけるDfグラフの縦軸を算出 ' Cells(i, 18) = Ln(Cells(i, 16)) 'ln(n) ' End If ' Label 'バグデータを弾いた際に用いるラベル Next i ' ' ' 'これで、1枚の画像解析結果からDfを算出するのに最低限必要な計算は完了しました ' 'マクロを改良して、より解析作業効率を向上させ、研究に励んで下さい 'この後に、dp分布、n分布を作成させる '新しく、解析に有効なパラメーターを加える 'なども、とても有効かも知れません End Sub ここまでがプログラム文です。 コメント文中の名前、パラメータ名などは伏せました。 1年次からプログラムに関する授業だけはどうしても苦手で、PCに関する基本用語もあまり分かりません。 なら、なぜマクロ挑戦したんだ?という感じですが、苦手意識を克服したかったんです。 マクロ使い慣れている方、簡単な言葉でアドバイスを頂けると嬉しいです。 長くなりましたが、よろしくお願いします。

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Subject: 計算式に円周率をいれるには?? http://www.keep-on.com/excelyou/2000lng4/200006/00060058.txt Pi()やLn(・・)等のワークシート関数(ワークシートの数式で使用する関数)は そのままの形でマクロで使用する事は出来ません。 上記を参考にしてみて下さい。

goo-pie
質問者

お礼

勉強不足でした。 ワークシート関数はそのまま使えないんですね。 他にもアルゴリズムで少し問題を発見しましたが(研究室内の事情) n-junさんの優しいアドバイスのおかげで完成しました。 質問してから、ほんの数時間で解決&完成出来て嬉しいです。 他にも複数のマクロを作成中なのですが上手くいきそうです!! 本当にありがとうございました!!!!

関連するQ&A

  • EXCEl マクロ「実行時エラー1004」について教えてください。

    EXCEl マクロ「実行時エラー1004」について教えてください。 他の方の質問も見てみましたが、それぞれの事情で違うようで分かりません。 どなたか教えていただけないでしょうか。 1.EXCELに「住所録データ」「検索結果」「ラベル」の3種シートがあります。 2.「住所録データ」から必要なものを選び、「検索結果」に表示させると、「ラベル」に結果が反映され、プリントアウトされます。 3.「検索結果」までは表示されますが、そこで下記の表示がでます。 「実行時エラー1004アプリケーション定義またはオブジェクト定義のエラーです。」 4.『デバック』を見ると下記のマクロが表示されます。  ' '一覧表のデータをレイアウトにあわせて転送 Sub ラベルへ転記(番号, 印刷位置, 複数段) Dim 用紙 As Object Sheets("検索結果").Select Set 用紙 = Sheets("ラベル") 用紙.Range("ラベル氏名") = Cells(番号 + データ開始, 氏名位置).Value + " 様" 用紙.Range("ラベル住所") = Cells(番号 + データ開始, 住所1位置).Value + " " + Cells(番号 + データ開始, 住所2位置).Value 用紙.Range("ラベル所属") = Cells(番号 + データ開始, 所属1位置).Value + " " + Cells(番号 + データ開始, 所属2位置).Value 用紙.Range("ラベル番号") = Cells(番号 + データ開始, 郵便位置).Value 用紙.Select Range("ラベル").Select Selection.Copy Cells(ラベル開始行 + (印刷位置 - 1) * ラベル行数, _ ラベル開始桁 + ラベル桁数 * (複数段 - 1)).Select ActiveSheet.Paste End Sub 5.上記「 用紙.Range("ラベル住所") = Cells(番号 + データ開始, 住所1位置).Value + " " + Cells(番号 + データ開始, 住所2位置).Value」の部分が黄色の→とラインでチェックされています。 前回このマクロを使用したあと、プリントアウトの位置を調整するため、「ラベル」のシートで、セルの高さや幅を変更したり一部削除したりしました。これが原因かもしれません。もしそうだとしたら今後このマクロは回復しないでしょうか。マクロの知識がなく質問も適切ではないかもしれませんが、どなたかお知恵を貸していただけないでしょうか。

  • マクロ実行で実行時エラー13発生

    office2016 AK24列から9行毎に元のセル値に+10するマクロでエラーになります。 実行時エラー13 型が一致しません AK列は見た目上は全てのセルが空欄で書式は標準となっています。 AK2626セルまで値を設定する行は存在しています。 G2632セルまで、空欄セル無くコメントが入っているのでG列をループさせる条件にしています。 動作させているマクロは次の通り Sub Macro4() ' Dim i As Long Sheets("計画").Select ' i = 0 Do Until Cells(i + 24, 7).Value = 0 Cells(24 + i, 37).Value = Cells(24 + i, 37).Value + 10 i = i + 9 Loop End Sub マクロ動作させると、AK294セルまで値は入るが、AK303セル以降の値が入りません。 デバッグモードで動作させて同じ結果(AK303セル以降値が入らない)になりますが、何故実行時エラー13になるかが分かりません。 計画シートのAK列を削除してマクロ動作させるとエラー発生しません。 何が原因でマクロが停止しているのか、原因を把握する手段を教えていただきたく。

  • Excelマクロのことで教えて下さい

    初歩的なことですみません。 E列の値をF列に値を入れるために下記のマクロを組みました。 Sub test() Worksheets("Sheet1").Select Dim i As Long For i = 2 To Cells(Rows.Count, 4).End(xlUp).Row Range("F2").Value = "=E2/1024/1024" Cells(i, 6).FillDown Range(Cells(2, 6), Cells(i, 6)).Copy Range("F2").PasteSpecial Paste:=xlValues Next i End Sub ところがF列に「値のみを貼り付け」をした時に、途中から同じ値のみがコピーされてしまい困っています。 (画像参照) うまく貼り付けることができるマクロをお教え下さい。 よろしくお願いいたします。

  • エクセルVBAで複数シートにマクロ実行

    エクセル2000です。 Sub 行列非表示() For i = 2 To 120 If Cells(i, "A").Interior.ColorIndex = 3 Then Cells(i, "A").EntireRow.Hidden = True End If Next i For n = 1 To 50 If Cells(1, n).Interior.ColorIndex = 3 Then Cells(1, n).EntireColumn.Hidden = True End If Next n End Sub 上記マクロを、シートAAAとCCCとEEEに実行する場合、 Sub test() Sheets("AAA").Activate Call 行列非表示 Sheets("CCC").Activate Call 行列非表示 Sheets("EEE").Activate Call 行列非表示 End Sub と書くよりももっとすっきり実行する方法は無いでしょうか? 各シートの非表示対象の行や列はそれぞれことなります。 また Sub 行列非表示 自体も、もっと効率的にやる方法はないでしょうか?

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

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • excelのマクロで2007だとエラーが。

    excel2003では動いていたマクロが2007では、エラーになってしまいます。 中断→デバッグ→再開→中断→デバッグ→再開、、、、 と中断しながらも10~20行ずつ進みます。 解決法がありましたら教えてください。 ※デバッグで確認すると「end if」で中断します。 Sub 仕分() Dim n As Long Dim nRow As Long Worksheets("シート名").Activate nRow = Range("A1").End(xlDown).Row For n = 2 To nRow If Cells(n, 6) = "条件1" Then Cells(n, 22) = "仕分け" ElseIf Cells(n, 6) = "条件2" Then Cells(n, 22) = "仕分けしない" ElseIf Cells(n, 6) = "条件1" And Cells(n, 7) = "条件2" Then Cells(n, 22) = "仕分け2" Else Cells(n, 22) = "OK" End If Next n End Sub

  • Excel マクロ 重複チェックについて

    Excel マクロ 重複チェックについて Sheet3のA列とB列に製品番号が入っています。 A列とB列を比較して、A列と同じ番号がB列に2個以上ある場合のみ C列にフラグ「1]を入れたいです。 Sub RetsuCheck() Dim i As Long Dim ws1 As Worksheet Set ws1 = Worksheets("Sheet3") '「Sheet3」シートでA列とB列の重複をチェック。 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row If ws1.Cells(i, "A") = ws1.Cells(i, "B") Then ws1.Cells(i, "C") = 1 End If Next i End Sub 1個の場合には上記マクロで解決するのですが、 2個以上の場合にどうようなマクロを記載すればよいのか アドバイスを頂けませんでしょうか。 よろしくお願いいたします。

  • 繰り返しマクロについて

    先日、マクロについて質問をさせていただきました。 常に右側の列と左側の列のデータを比較して、右側の列のデータが多ければ「↑」マークを、同じなら「―」マークを、少なければ「↓」マークを表示させたいのです。 最初にデータを入れる列はD列7行目から30行目まで。次はE列に同じようににデータ入力した後ににマクロを実行します。これをM列7行目から30行目まで、列に新しいデータを入れるたびに毎回繰り返したいのです。 矢印マークは 常にN列に表示。  で、以下のようなマクロを教えていただきましたが、このマクロだと 比較がされる列が、絶えずD列と、新しく入力した列になってしまいます。 先ほども書きましたが、比較する列は、D列とE列 それが終わったらE列とF列 次はF列とG列 というように常に右側とその直ぐ左側の列の比較をしたいのです。 もう一度 お教えいただきたいのですが、よろしくお願いいたします。 回答いただいたマクロを下に入れておきます。 Sub test() Dim i, j, k As Long Dim vl1, vl2 As Variant For i = 4 To 30 If WorksheetFunction.Count(Range(Cells(i, 4), Cells(i, 13))) > 1 Then j = 4 Do Until Cells(i, j) <> "" j = j + 1 Loop vl1 = Cells(i, j) For k = 4 To 13 If Cells(i, k) <> "" Then vl2 = Cells(i, k) End If Next k If vl1 > vl2 Then Cells(i, 14) = "↓" ElseIf vl1 = vl2 Then Cells(i, 14) = "→" Else Cells(i, 14) = "↑" End If Else Cells(i, 14) = "" End If Next i End Sub

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 13).Value = Cells(ii, 13).Value Then Delete Shift:=xlUp End If Next ii Next i End Sub マクロに関しては、素人でございます。 こちらのマクロを作ってみたのですがうまくいきません。 4列目と13列目の列が重複したときのみ重複した行をすべて削除させたいと思っております。どうぞお教えください。

  • Excelマクロ

    お世話になります。 Excelのマクロに関する質問です。 目的としては、D列に様々な文言が入っており、 D列に記入されている各文言の数をカウントしたいと思っています。 ただし、D列の各文言が複数あった場合でも、 A列が同じ値の場合は数に含めない、という条件があります。 ex)D列に「りんご」という文言が10個あります。   D列に「りんご」と記入されている行のA列は、 「赤」「青」の2パターンしかありません。 ⇒この場合、「2」とカウントしたいです。 現在、以下のマクロを考えています。 =========================================================== sub test() Dim i As Long, x As Long, cnt As Long, buf As Object '「i」「x」「cnt」を数値として定義。「buf」にD列の値を格納します。 x = 4 '4行目以降を対象としています。 Do While Cells(x, 1).Value <> "" 'A列が空白でない場合のみを対象とします。 cnt = 0 '各行のD列に入っている値の数を数えるため、まずはカウントを0にします。 i = 4 '4行目以降を対象としています。 Set buf = Cells(x, 4) ' D列の値を変数「buf」に格納します。 Do While Cells(i, 1).Value <> "" 'A列が空白でない場合のみを対象とします。 If Cells(i, 4).Value = buf And Cells(i, 1).Value <> Cells(x, 1).Value Then  ' D列の値が「buf」に格納した値と同じ、かつ、       ' A列の値が、bufに値を格納した時と異なる場合のみ対象 cnt = cnt + 1 '数を数える対象であれば、+1します。 End If i = i + 1 '次の行に移るために+1します。 Loop Cells(x, 5).Value = cnt ' E列にcntに格納された値を入力 x = x + 1 '次の行に移るために+1します。 Loop end sub ===================================================== 上記のマクロでは、E列にカウント後の数らしいものが入力されるのですが、 値が正しくないようです。 お力添えをいただけますでしょうか。 よろしくお願いいたします。

専門家に質問してみよう