[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Excel VBA Subに対するエラー「定数式が必要です」』(のしこ)
Mac版ExcelVBAでアニメーションを制作しようとしたところ、
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 400
End If
End Sub
< 使用 Excel:Office365、使用 OS:MacOSX >
Dim Pattern(i) As Range
(あ) 2021/07/18(日) 09:14
(あ)さんのおっしゃる順番で Dim Pattern(i) As Range
とりあえずこれ。から順番に'▼のポイントを変更すると
他のエラー原因も解消されるかもです。
Option Explicit '実行速度を遅める 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 Dim Pattern(1 To 7) As Range '▼コンパイルエラー:定数式を解消
For i = 1 To 7 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 '▼コンパイルエラー:変数が定義されていません。を解消 '▼Destination =sh2.Cells(1, 1) を Destination:= へ 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 Next '▼コンパイルエラー:Loopに対応するDoがありません。を解消 Loop End If '▼コンパイルエラー:IFブロックに対応するEnd Ifがありません。を解消
If k = 7 Then Pattern(k).Copy Destination:=sh2.Cells(1, 1) Else Area.Clear Sleep 400 End If End Sub
'▼実行時エラー '9': インデックスが有効範囲にありません。を解消 'Elseの後にある意味が解からないので削除...Pattern(k).copy Destination = sh2.Cells(1, 1)
※エラーだけの解消を目標としたので、参照範囲や、動作はよく見てません。 ※私くし(あみな)では、力不足なので、上級者の方が閲覧されるまでの通過点にしてください。
(あみな) 2021/07/18(日) 09:45
このコンパイルエラーは皆さんのおっしゃる通り、
Dim Pattern(i) の部分でした。
また, Ifに関してはelse if をきちんと理解していなかったことが原因でした。
私にとって複雑だったので、ここについてはもう少し簡潔に書き直しました。
さらに、Mac環境でsleep関数が使えないことを存じ上げなかったので、
代替となる関数 Application.Wait (Now() + TimeValue("0:00:01"))
を見つけて事なきを得ました。
私の不勉強で初歩的な質問で皆さんの手を煩わせてしまい、申し訳ありません。
ご返答くださった方々は本当にありがとうございました。
(のしこ) 2021/07/18(日) 19:35
Sub animation_for_mac()
'Sheet1を定義
Dim sh1 As Worksheet
Set sh1 = Sheet1
'Sheet1の7パターンのセル画(横17×縦12)を定義
Dim i As Integer
Dim Pattern(1 To 8) As Range
For i = 1 To 8
Set Pattern(i) = sh1.Range(sh1.Cells(1 + 12 * (i - 1), 1), sh1.Cells(12 * i, 17)) 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(12, 17))
Area.Clear
'1,2,3,4,5,6,7,8
For i = 1 To 8
If i < 8 Then Pattern(i).copy Destination:=Area Application.Wait (Now() + TimeValue("0:00:01")) '実行速度を遅める Area.Clear
Else Pattern(i).copy Destination:=Area
End If
Next
End Sub
Cells関数も満足に使えていなかったようで、お恥ずかしい限りです。
ありがとうございました。
(のしこ) 2021/07/18(日) 19:44
Sub 別案() Dim i As Long
For i = 0 To 7 Sheet1.Range("A1:Q12").Offset(i * 12).Copy Sheet2.Range("A1") Application.Wait (Now() + TimeValue("0:00:01")) Next i End Sub
「Clear」も、すぐに次の描写(コピペ)するならいらないのではないかと・・・
(もこな2 ) 2021/07/18(日) 21:00
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.