[[20210718075611]] 『Excel VBA Subに対するエラー「定数式が必要です=x(のしこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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 >


突っ込みどころが多すぎて、なんて聞き返したらいいのか解らない。
(表現の自由) 2021/07/18(日) 08:45

とりあえずこれ。

 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


Mac で Windows API 使えるんでしょうか?
仮想環境なのかな?
(とおりすがり) 2021/07/18(日) 10:01

突っ込みどころが多くて申し訳ありません。
皆さんのお力添えで無事解決することができました。
ご返信ありがとうございました。

このコンパイルエラーは皆さんのおっしゃる通り、
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.