ExcelVBAでデータ抽出を行う際に発生する「定数式が必要です」エラーについて

このQ&Aのポイント
  • ExcelVBAで作成したマクロでデータ抽出を行なっていたところ、「定数式が必要です」というエラーが発生しました。
  • 以前は正常に動作していたマクロが突然エラーとなったため、VBAの仕様の変更が原因ではないかと疑っています。
  • エラーが発生した箇所は、CCのメールアドレスを取得するための定数式の代入行です。
回答を見る
  • ベストアンサー

「定数式が必要です。」って何のこと?

ExcelVBAで作成したマクロでデータ抽出を行なっていたのですが、 数日前に動作していたマクロが、突然に、 「定数式が必要です」というエラーが出てきて動かなくなりました。 VBAの仕様が変わったのでしょうか? ★エラーの発生したモジュール Option Explicit Dim MailCc As String Sub Mailer() (中略) MailTo = Cells(RW_TO, 2).Text ' 宛先 → MailCc = Cells(RW_CC, 2).Text ' CC (以下略) ★同一プロジェクトの別モジュール Global Const RW_CC = 18

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

  • ベストアンサー
回答No.5

NO.2です 先程ので解決と思ったのですが・・ 以前、原因不明でマクロが動かなくなったとき以下の方法で 直ったことがあります。 試してみてください。 新規ワークブックを作成 ワークシートを全選択します(行と列の間の四角いところをクリック) ワークシートを新規ワークブックに丸ごとコピーする。 ワークシートが複数ある時は繰り返し モジュール等を全て新ワークブックへコピー プロジェクトエクスプローラーでドラッグでも可(たぶん) 参照設定をあわせる ' Microsoft CDO for Windows 2000 Library ' Microsoft ActiveX Data Objects 2.7 Library ' Microsoft Scripting Runtime でどうでしょうか。 以前私は直ったことがあります。 ところで、 ' Microsoft ActiveX Data Objects 2.7 Library は ' Microsoft ActiveX Data Objects 2.8 Library が最新のようですね。 こちらに変えたらいきなり直ったりして? 関係ないと思いますが

hatsuzo
質問者

お礼

どうもアドバイス有難うございました。 ' Microsoft ActiveX Data Objects 2.7 Library を ' Microsoft ActiveX Data Objects 2.8 Library に変えたら直りました。 WindowsUpdateの影響かもしれないですね。 このようなことがあるかと思うと、正直、VBAを定型業務に使ってよいものか迷ってしまいます。 助かりました。感謝いたします。

その他の回答 (4)

回答No.4

NO2です。 では、参照設定で不足しているものはないですか。 例えば、アドインとか 最近システム変更して、DLLが変わった、削除したとか

hatsuzo
質問者

お礼

有難うございます。 参照設定したDLLは一応コメントに記録してあるのですが、 特に外れているわけではないです。 ' Microsoft CDO for Windows 2000 Library ' Microsoft ActiveX Data Objects 2.7 Library ' Microsoft Scripting Runtime WindowsUPDATEはしていますが、勝手にDLLまで置き換えられることもあるのでしょうか?

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.3

こんにちは、#1です。  エラーの発生した行をコメントにして、#2さんの言われた方法を実行するとどうなりますか。 では。

hatsuzo
質問者

お礼

お返事有難うございます。 ウォッチ式にRW_CCという定数を追加して、 そのステップで止めてみましたが、 「ウォッチ式が不正です」ということで見ることもできません。

回答No.2

→ MailCc = Cells(RW_CC, 2).Text ' CC ここでエラーと言う事でしょうか。 だとすれば、 MailCc = Cells(RW_CC, 2).Text の1つ上に Debug.print RW_CC として イミディエトウインドウには 何が出力されますか。 18のはずですが違う数字例えば0など・・

hatsuzo
質問者

お礼

有難うございます。 コンパイルエラーなので、 実行できないため、イミディエトウインドウの操作はできません。

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.1

こんにちは。  >→ MailCc = Cells(RW_CC, 2).Text ' CC   ↑ここにある矢印はどういう意味ですか? では。

hatsuzo
質問者

お礼

失礼しました。 ここでエラー発生という意味です。

関連するQ&A

  • 定数の宣言ってdimは使えないのですか?

    VBAです。 標準モジュールに Option Explicit Public Const フォルダ名 As String = "新しいフォルダー" Sub aaaa() End Sub はできるのですが、 Option Explicit dim Const フォルダ名 As String = "新しいフォルダー" Sub aaaa() End Sub は、エラーになってしまいます。 Option Explicit Sub aaaa() dim Const フォルダ名 As String = "新しいフォルダー" End Sub もダメみたいです。 定数を使うときは、必ずPublicで宣言しなけらばいけないのでしょうか?

  • VBAの定数の使い方で、計算値を定数に入れることは可能ですか。

    VBAの定数の使い方で、計算値を定数に入れることは可能ですか。 例えば、モジュール先頭に、 Option Explicit Const TEISU_COUNT As Integer = Application.WorksheetFunction.CountA(Range("A1:IV1")) と書き、その下に、 Sub TestTeisu()   MsgBox TEISU_COUNT   '↑定数式が必要です、のようなエラーが出ます。なぜでしょう?   'エラー時、「.CountA」にスポットがあたります。   'つまり、ここがダメということでしょうか?やはり、この点が動的だからでしょうか? End Sub と書いて、実行。 結果は、上述の通り、エラーとなります。 やはり、定数値には、固定的な数値(上記例では、Integer)や文字列を入れるべきなのでしょうか。 定数に入れることのできる値の注意事項について、 どなたかアドバイスして頂けますでしょうか。 宜しくお願い致します。

  • Mailtoファイルの作り方

    OSXに標準についているメーラーで宛先に入力したアドレスをデスクトップに出すとMailtoファイルができそれをクリックするとそのアドレスが入った新規メッセージが作成されますが、宛先に2件以上はいっている場合にも同じことがしたいのにテキストクリッピングになります。Mailtoを作る方法を教えてください。

    • ベストアンサー
    • Mac
  • エクセルマクロ メール作成

    お世話になります。 メールの定期配信業務があり、簡略化のためマクロ作成しております。 WSHを使った構文を見つけましたので、以下のような構文を作りました。 <エクセルシート> 横に【宛先1(to)】【宛先2(cc)】【件名】【本文】【添付ファイルパス】 の順に並んでおり、列方向にはリストとなっています。 <Module> Sub メール書き込み() Dim 宛先1 As String Dim 件名 As String Dim 本文 As String Dim 添付 As String Dim 宛先2 As String Dim 行 As Long, 行下端 As Long Dim sComd As String 行下端 = Range("B65536").End(xlUp).Row 行 = 2 Do While 行 <= 行下端 宛先1 = Cells(行, 1).Text 宛先2 = Cells(行, 2).Text 件名 = Cells(行, 3).Text 本文 = Cells(行, 4).Value 添付 = Cells(行, 5).Text sComd = "Mailto:" & 宛先1 & "?Subject=" & 件名 & "&body=" & 本文 Debug.Print sComd CreateObject("WScript.Shell").Run sComd 行 = 行 + 1 Loop End Sub この状態で、複数メールを作成することはできましたが、不満点があり、御教示願いたく考えております。 mailto 以下の書き方が分からず困っているのが以下の点です。 1、CC(宛先2)を追加したい。 2、添付を追加したい。 また、本文の改行も反映できるようにしたいのですが、これは可能でしょうか? 複数件質問になってしまい恐縮ですが、よろしくお願い致します。

  • 数が多い定数をスマートに処理するには?お知恵をお貸しください。

    Visual Basic(VB)6.0 です。フォームのTextなど各種入力の状態をチェックして、 不正なら該当する(ユーザ向けの)エラーメッセージを フォームのLabelに表示する処理を書いています。 エラーメッセージは20~30程度になり、全て定数Const文で持たせました。 随時発生する入力チェックの処理の度に、エラーならLabelのCaptionの表示を 変える処理を書くのはスマートではないと思ったので、 Label表示変更専用のモジュールを作ろうと考えました。 引数に(ユーザ定義の)コードを渡して、対応する定数のエラーメッセージを 判定・表示させる処理を書こうと思ったのですが、ここでうまくいきません。 以下、簡単なコードです。 ------------------------------------------------------ '* 定数です * Public Const ERR1 = "エラー1です" Public Const ERR2 = "エラー2です" Public Const ERR1 = "エラー3です" Public Const ERR2 = "エラー4です" '-----中略----- Public Const ERR50 = "エラー30です" ------------------------------------------------------- '** メイン処理です。** Sub main() Dim i As Integer 'フォームの入力をチェックします i = Chk_Value(dummy) If i > 0 Then '0より大きかったらエラーコードとして引数を渡します Call Disp_Msg(i) Exit Sub End If End Sub ------------------------------------------------------- '入力チェック処理です Private Function Chk_Value(ByVal dummy As Integer) As Integer '空白だったらエラーなので1を返します If Text1.Text = "" Then Chk_Value = 1 End If End Function ------------------------------------------------------- 'メッセージ表示処理です Private Sub Disp_Msg(ByVal ecd As Integer) '分からない! '引数で1を受け取り、定数のERR1を表示したい '引数で2を受け取ったら、定数のERR2を表示したい End Sub ------------------------------------------------------- 列挙型やType型変数もよい使い方が思いつかず、 ループで回して配列に格納しようにも、変数と変数を組み合わせて 変数を作る(wErr = "ERR" & i と書いても定数ERR1を表せない) のも無理なようだし、ほとほと困り果てています。 拙い説明で恐縮ですが、私の考えを実装することは可能でしょうか。 または別の方法はあるでしょうか。 よろしくお願いします。

  • eamaxでの一括宛先入力に関して

    最近メーラーをEDMAXに代えました。マクロ機能があるようですが、どのように便利なのかがまだ良く解っておりません。マクロで可能かどうか解りませんが、仕事のメールである特定の添付ファイルを宛先に5人、CCで8人程度に対して一度に送信する機会が一日に何度かあります。 今はその5人と8人を二つのグループに分けてアドレス帳に登録しておき、それぞれで全選択をして宛先とCCに入力しております。これをもっと簡略化する事は出来ないでしょうか?マクロで登録してボタン一つで宛先入力が完了する等の方法をご存知の方がいれば教えて下さい。

  • 同じマクロ名でも、違うモジュールならエラーにならな

    同じマクロ名でも、違うモジュールならエラーにならない? エクセルVBAについてご教授ください。 標準モジュールに ――――――――― Option Explicit Sub CommandButton1_Click() MsgBox "" End Sub Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― と同じマクロ名を2つ作ったら、コンパイルエラーになりますが、 上記のコードは一度消して、フォームモジュールに ――――――――― Private Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作り、 標準モジュールに ――――――――― Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作った場合は、エラーにならずにマクロを実行できました。 これは、フォームモジュールがPrivate Subだからでしょうか? フォームモジュールに1つ、 標準モジュールに1つ なら同じマクロ名を使っても、エラーにならないという事でしょうか? よろしくお願いします。

  • mailto:の本文に文字数制限はありますか?

    こんにちは mailto: で、宛先、件名、本文を指定したメールを 起動しようとしていますが、 ?body="" 内に記載する文字が一定数を超えると、 メーラーを起動できなくなります。 body に記載できる文字数に制限はありますでしょうか。 また、これを回避する方法はありますでしょうか。 ご存知の方がいらっしゃいましたら、 よろしくご教示ください。 該当箇所は、以下のように記述しています。 <li>○○の場合は<a href="mailto:xxxxx@xx.xx.jp?subject=[xxxxx] xxx&cc=xxx@xx.xx.jp&body= ○○ご担当者さま%0d%0a .....<中略> ">こちら>></a></li> 文字数は、ざっと1200ワードです。 よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • Excel VBAでの定数宣言について

    初心者が書籍とにらめっこしながらマクロを書いています。 お助けください。 複数あるラジオボタンをクリックしたら、そのラジオボタンの種類に応じて、特定の行を表示したり、非表示にしたりしたいと考えています。行の追加や削除で行番号が変わってしまった場合に備えて、この行番号を定数として宣言したいと思ったのですが、うまくいきません。 シートモジュールには、以下のように記述しています。 ============================================================== Private Sub OptionButton1_Click() 'ラジオボタン1を選択 Rows(scope1).EntireRow.Hidden = False 'scope範囲行を表示 Rows(scope2).EntireRow.Hidden = True 'scope範囲行を非表示 End Sub Private Sub OptionButton2_Click() 'ラジオボタン1を選択 Rows(scope1).EntireRow.Hidden = True 'scope範囲行を非表示 Rows(scope2).EntireRow.Hidden = False  'scope範囲行を表示 End Sub ============================================================== 以下の記述で定数を宣言したいのですが、 public const scope1 = "38:48" '38行目~48行目 public const scope2 = "49:52" '49行目~52行目 シートモジュールの最初に書くと、 「コンパイルエラー  定数、固定長文字列、配列、ユーザー定義型およびDeclareステートメントは、オブジェクトモジュールのパブリックメンバとしては使用できません」 とエラーメッセージが表示されてしまいます。 エラーの意味がよく分からないのですが、定数宣言は、どこに記述すればよいのでしょうか? お教えください。よろしくお願いします。

  • Excel VBA Interior.Color

    困っています。よろしくお願いします。 以下のマクロで、 値として「薄緑」(13172680)を入力したのに、その値が勝手に変わってしまいます。 13434828になってってしまいます。そのため、「色消し」が働きません。 また、colorとして「白」(16777215)を設定した場合と、colorindexとしてxlnoneを入力した場合、excelの表上での見た目が違います。なぜでしょうか。また、colorに何を入力するとcolorindexにxlnoneを入力したのと同じになるのでしょうか。 Option Explicit Public Const 薄緑 As Long = 13172680 '200,255,200 Public Const 白 As Long = 16777215 'rgb(255,255,255) Sub 色付け()  Cells(1, 1).Interior.Color = 薄緑 End Sub Sub 色消し()    If Cells(1, 1).Interior.Color = 薄緑 Then    Cells(1, 1).Interior.Color = 白    End If End Sub Sub test()    Cells(1, 1).Interior.ColorIndex = xlNone End Sub Sub test1()    Cells(1, 1).Interior.Color = 白 End Sub Sub test2()    MsgBox Cells(1, 1).Interior.Color End Sub

専門家に質問してみよう