質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

1回答

8420閲覧

ExcelVBA Subに対して「定数式が必要です」というエラーが発生しました。

退会済みユーザー

退会済みユーザー

総合スコア0

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2021/07/17 22:35

編集2021/07/18 06:05

前提・実現したいこと

全くの初心者です。
Mac版のExcalVBAでアニメーションを制作しようとしたところ、
Subに「定数式が必要です」というコンパイルエラーが発生しました。
拙いコードですが、見ていただければ幸いです。

発生している問題・エラーメッセージ

subはマクロの名称と認識していたため、この場合の定数式とは何のことか、具体的に何をすれば良いのか、見当もつきません。

該当のソースコード

'実行速度を遅める Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) **Sub anime4()****問題のエラーが発生したところです。** 'Sheet1を定義 Dim sh1 As Worksheet Set sh1 = Sheet1 'Sheet1の7パターンのセル画(横17×縦12)を定義 Dim i As Integer For i = 1 To 7 Dim Pattern(i) As Range Set Pattern(i) = Range(sh1.Cells(1, 1 + 12 * (i - 1)), sh1.Cells(17, 12 * i)) Next 'Sheet2を定義 Dim sh2 As Worksheet Set sh2 = Sheet2 'Sheet2のA1からQ12の領域を定義、その領域をクリアにする Dim Area As Range Set Area = Range(sh2.Cells(1, 1), sh2.Cells(17, 12)) Area.Clear 'パターン2と3は貼って消してを3回繰り返す 'パターン7は貼ったまま残す 'それ以外は貼って消す '1→2→3→2→3→2→3→4→5→6→7 Dim j, k As Integer j = 1 If k = 2 Then Do Until j = 3 For k = 2 To 3 Pattern(k).copy Destination = sh2.Cells(1, 1) Area.Clear j = j + 1 Loop If k = 7 Then Pattern(k).copy Destination = sh2.Cells(1, 1) Else Pattern(k).copy Destination = sh2.Cells(1, 1) Area.Clear Sleep 200 End If End Sub

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

Mac版だからなのか、これまでにもExcelVBAが作動しないことが多々ありました。それらのマクロはWindowsでは正常に作動しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問の内容について

まず、このエラーについてはMicrosoft Documentにもある通りです。
質問者様はSubの宣言の方法のエラーかと推測されたようですが、
問題は、上記リンクの2番目で、

プロシージャ内で動的な配列を宣言するには、ReDim を使用して配列を宣言し、変数を使用して要素の数を指定します。

の場所です。

ここで言う「定数式が必要」とは、嚙み砕いていうと、
「配列を定義する際の要素数は変数ではなく、定数である必要がある」という意味になります。

よって、問題個所は質問者様のコードの下記の部分です。

VBA

1'Sheet1の7パターンのセル画(横17×縦12)を定義 2Dim i As Integer 3For i = 1 To 7 4 Dim Pattern(i) As Range 5 Set Pattern(i) = Range(sh1.Cells(1, 1 + 12 * (i - 1)), sh1.Cells(17, 12 * i)) 6Next

このうち Dim Pattern(i) で配列の要素数に変数を指定しているため、
エラーとなっているわけです。

デバッグモードでステップ実行すればこの場所でエラーとなるでしょう。

動的配列を宣言するには、例えば

VBA

1'動的配列宣言の例 2Dim arr() as Range 3Dim i as Integer 4 5i = Int(100 * Rnd) 6Redim arr(i)

と、Redimにより要素数を指定する必要があります。
ですが、そもそもこのコードでは動的配列を使う理由もないので、
(配列要素は常に一定のため)

VBA

1'Sheet1の7パターンのセル画(横17×縦12)を定義 2Dim i As Integer 3Dim Pattern(1 To 7) As Range 4For i = 1 To 7 5 Set Pattern(i) = sh1.Range(sh1.Cells(1, 1 + 12 * (i - 1)), sh1.Cells(17, 12 * i)) 6Next

とすればよいかと思います。

ここでの問題は2つあって、1つは、先述の通り動的配列の宣言の仕方が間違っていること、
もう一つは、同じ名前の配列が何度も宣言されること、です。

現状1つ目の配列を宣言する段階でエラーとなっているので、
後者の問題は表面化していませんが、存在しています。
そのため、上で修正したコードではDim Patternの位置をForループの外に出しています。

質問箇所とは関係ないこととして...

このコードがWindowsでは動いたということですから、
以降は見当違いな指摘かもしれません。

私の環境では、2番目、3番目はそもそもエラーを吐きます。
このコードが動くこと自体私の知識から外れているので、
あまりあてにしないでください...

1. 変数型指定の方法

VBA

1'jはVariant、kがInteger 2Dim j, k As Integer 3 4'jもkもInteger 5Dim j as Integer, k as Integer

2. おそらく、ここでもエラーになる

kに値が指定されるまえに参照されるため、エラーになるはずです。
そうでなくてもk=0で初期化した方がいいでしょう。

VBA

1Dim j, k As Integer 2j = 1 3 4If k = 2 Then

3. IfとEnd If、ForとNextの数が合わない

VBA

1If k = 2 Then 2...

以降のIfとEnd Ifの数が合わないので確認してください。
また、

VBA

1For k = 2 To 3

のNextがないので確認してください。
ForとNextはセットです。

4. k=7になることがない

何か別のループを入れないと、
1つ目のIf k = 2 Thenを処理して、そのままEnd Ifに行って終了します。

投稿2021/07/18 02:01

Mikyrri

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/18 05:48

誤解を招くような補足をしてしまい、申し訳ありません。他のマクロはMacだと動かないのにWindowsだと動くことがあると言うことをお伝えしたかったのです…。このマクロがWindowsで動くかどうかはまだ確認しておりません。 ご丁寧に説明して頂きありがとうございます。不勉強でお恥ずかしいです。 回答者様のご指摘頂いた点を中心にマクロを見直してみます。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問