プロが教えるわが家の防犯対策術!

モリチャンです。

昨日も質問しましたが、VBAで50位ある電気試験項目のデータ(エクセル)の内から15位選んで
条件規格を取り出し別シートに貼り付けるマクロ考えています。以下のマクロですが、
TESTNo項目は、080924161801の文字形式でテキストボックスで入力し、
D = Val(Mid(TESTNO, [k - 1] * 2 + 1, 2))の式で2桁のtest番号を取り出し、1項目ずつ
コピーして貼り付けます。
実行すると、コンパイルエラ:Nextで指定された変数の参照が不正ですと表示します。
1)どうしたらコンパイルエラが治せるでしょうか
2)コードで目的と違うものがあったら指摘助言ください。
kは抽出する試験項目数、iは試験の規格/条件項目セル数です。
For i = 1 To 7

For k = 1 To 14
Workbooks.Open Filename:=dfilename
Data = ActiveWorkbook.Name
Windows(sinn).Activate
Range("E10").Select
ActiveCell.Offset(k - 1, i - 1).Select
Windows(Data).Activate
D = Val(Mid(TESTNO, [k - 1] * 2 + 1, 2))
Range(Cells(D, 1), Cells(D, 6)).Copy
Windows(sinn).Activate
Selection.PasteSpecial Paste:=xlFormula
If k = 14 Then Exit For

Next i

Windows(Data).Activate
ActiveWindow.Close
If m = 7 Then Exit For
Application.ScreenUpdating = True
MsgBox ("終了します")

A 回答 (4件)

> 動かすとコンパイルエラ:Nextで指定された変数の参照が不正ですと表示します。


> そして、Next iのiの部分が強調されますので、変数i関係が違うと思います

No.1の最初にかいたとおりです。
For k = 1 To 14 に対するNextがありません。


指摘したにも関わらず修正できないというのは、本当にVBAのことを理解されていないのですね。

今後も「マクロの記録」ではないVBAのプログラムをご自身で作成していくのであれば、
VBAの基礎を「体系的に」学ばれることを「強く」お勧めします。
書籍を購入するのが一番だと思いますが、ネットの入門サイトで学ぶのも良いかもしれません。
少々時間がかかるかもしれませんが、最終的には質問者様の為になる一番の近道です。
    • good
    • 1

> すみません。

質問が正確に書いて無くて、mは無くて、i です。
> ご指摘を全て入れましたが、next iのiのところが強調されて、
> また指摘された変数の参照が不正ですと指摘されます。

その「ご指摘を全て入れ」たプログラムを「正確に」かつ「全て」書いていただかないと
誰も回答できないと思いますよ?
今までの状況から鑑みて、修正のやり方が間違っていると思います。


> 動きはKのループが終わってK⁼14になってから、iが始まって外側に行くと思っているのですが?

仰っていることが良くわかりませんが、
For文のループは、Forの行とNextの行の間をループします。
Exit Forは、そのループを途中で脱出する(Next行の次へ移動する)ために書くものです。
なのでループの外側に、Exit Forを書いても意味を成さないということです。

> 正確に書いてありませんでした。mでは無くて、iです。修正します。

上に書いた様にNext i 行よりも後に書いても意味を成しません。



あと質問するカテゴリは、ちゃんと選択してくださいね。
    • good
    • 1
この回答へのお礼

ご指摘ありがとうございます。以下が、指摘を全部入れたマクロ部分のプログラムです。他にフォーム部分があります。動かすとコンパイルエラ:Nextで指定された変数の参照が不正ですと表示します。そして、Next iのiの部分が強調されますので、変数i関係が違うと思います
Sub main()
Application.ScreenUpdating = False
Workbooks.Open Filename:=gfilename
sinn = ActiveWorkbook.Name
Sheets("規格値").Select
Range("E10").Select
ActiveCell.Offset(0, 0).Range(Cells(2, 1), Cells(15, 7)).Select
Selection.ClearContents
Workbooks.Open Filename:=dfilename
For i = 1 To 7
For k = 1 To 14
Data = ActiveWorkbook.Name
Windows(sinn).Activate
Range("E10").Select
ActiveCell.Offset(k - 1, i - 1).Select
Windows(Data).Activate
D = Val(Mid(TESTNO, (k - 1) * 2 + 1, 2))
Range(Cells(D, 1), Cells(D, 6)).Copy
Windows(sinn).Activate
Selection.PasteSpecial Paste:=xlFormula
Next i
Windows(Data).Activate
ActiveWindow.Close
If i = 7 Then Exit For
Application.ScreenUpdating = True
MsgBox ("終了しました")
End Sub

お礼日時:2019/03/13 10:49

追加



> If m = 7 Then Exit For

変数mはどこで代入されているのでしょうか?
Forループの外なのに、Exit Forは意味不明です。
    • good
    • 0
この回答へのお礼

すみません。正確に書いてありませんでした。mでは無くて、iです。修正します。Next iのところに 色がついていますので ここが問題だと思います。初心者の質問ですが、動きはKのループが終わってK⁼14になってから、iが始まって外側に行くと思っているのですが?正しいですか

お礼日時:2019/03/12 20:06

> コンパイルエラ:Nextで指定された変数の参照が不正ですと表示します。



 For k = 1 To 14 に対するNextがありません。

> D = Val(Mid(TESTNO, [k - 1] * 2 + 1, 2))

 [k - 1]  → (k -1)


> If k = 14 Then Exit For

 For k = 1 To 14 なのでk=14になればループは終了します。
 よって、この行は不要では?

> Workbooks.Open Filename:=dfilename

二つのForループの中にあるので、ループする度に実行されます。
 ループの外に置くべき


あと
Windows(sinn).Activate  (sinnって何?)
Windows(Data).Activate
とかWindow( )を使用していますが、Workbook型変数を使用した方が良いと思います。
    • good
    • 0
この回答へのお礼

すみません。質問が正確に書いて無くて、mは無くて、i です。ご指摘を全て入れましたが、next iのiのところが強調されて、また指摘された変数の参照が不正ですと指摘されます。Dataは、規格や条件が入ったデータ、Sinnが、規格条件を貼り付けるグラフのシートです。

お礼日時:2019/03/12 20:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!