Dim i As Long Dim k As Long k = 9 For i = 4 To 13 If Worksheets("元データ").Cells(i, 9) > 100 Then Worksheets("要注意リスト").Cells(k, 3) = Worksheets("元データ").Cells(i, 1) 'ID Worksheets("要注意リスト").Cells(k, 4) = Worksheets("元データ").Cells(i, 2) '名前 Worksheets("要注意リスト").Cells(k, 5) = Worksheets("元データ").Cells(i, 9) '合計 k = k + 1 End If Next
End Sub このような状態です。 解けてはいますし、回答を見ても正しいようなのですが、 k = k + 1の位置にいつも戸惑ってしまうのです。
Dim i As Long Dim k As Long k = 9 For i = 4 To 13 If Worksheets("元データ").Cells(i, 9) > 100 Then Worksheets("要注意リスト").Cells(k, 3) = Worksheets("元データ").Cells(i, 1) 'ID Worksheets("要注意リスト").Cells(k, 4) = Worksheets("元データ").Cells(i, 2) '名前 Worksheets("要注意リスト").Cells(k, 5) = Worksheets("元データ").Cells(i, 9) '合計 ①k = k + 1 End If ②k = k + 1 Next
Dim i As Long 'iを宣言します Dim k As Long 'kを宣言します k = 9 'kは9です。 For i = 4 To 13 'iは4です(1周目時点) If Worksheets("元データ").Cells(i, 9) > 100 Then 'もしも元データのi4(1周目時点)が100を超えていたら Worksheets("要注意リスト").Cells(k, 3) = Worksheets("元データ").Cells(i, 1) 'IDをコピー Worksheets("要注意リスト").Cells(k, 4) = Worksheets("元データ").Cells(i, 2) '名前コピー Worksheets("要注意リスト").Cells(k, 5) = Worksheets("元データ").Cells(i, 9) '合計コピー End If 'K9の値に入れるi4が調べ終わりました ②k = k + 1 'では次(i=5)に進む前にコピー先のセルも動かします Next '(i=5)に進みます(forに戻ります)
たとえば、 k = 5 のとき、 Cells(k, 3) は、左上から数えて、「5行目かつ3列目」のセルを指します。
Sub sample1()
Dim k
k = 5
Cells(k, 3).Value = 1 'セルC5に1と入力されます
End Sub
また、変数の値は、何度でも上書きできます。
以下では、[2], [3], [4] で、それぞれ、変数kに値を入れ直しています。
Sub sample2()
Dim k
k = 5 '[1]
Cells(k, 3).Value = 1
k = 7 '[2]
Cells(k, 3).Value = 2
k = 10 '[3]
Cells(k, 3).Value = 3
k = 11 '[4]
Cells(k, 3).Value = 4
End Sub
Sub sample3()
Dim k
k = 5 '[1]
Cells(k, 3).Value = 1
k = k + 2 '[2]
Cells(k, 3).Value = 2
k = k + 3 '[3]
Cells(k, 3).Value = 3
k = k + 1 '[4]
Cells(k, 3).Value = 4
End Sub
受講生さんの投稿
(投稿ID: 5117)
この度はご返信ありがとうございます。
早速ですが、エクセルマクロ・VBA基礎編フォローアップ ベーシックの問題に取り掛かりました。
しかし、何度解いてもよくわからない点があります。
★【動画6】 条件に一致するデータを別シートに転記する で例えますと、
Sub ichi()
Dim i As Long
Dim k As Long
k = 9
For i = 4 To 13
If Worksheets("元データ").Cells(i, 9) > 100 Then
Worksheets("要注意リスト").Cells(k, 3) = Worksheets("元データ").Cells(i, 1) 'ID
Worksheets("要注意リスト").Cells(k, 4) = Worksheets("元データ").Cells(i, 2) '名前
Worksheets("要注意リスト").Cells(k, 5) = Worksheets("元データ").Cells(i, 9) '合計
k = k + 1
End If
Next
End Sub
このような状態です。
解けてはいますし、回答を見ても正しいようなのですが、
k = k + 1の位置にいつも戸惑ってしまうのです。
Dim i As Long
Dim k As Long
k = 9
For i = 4 To 13
If Worksheets("元データ").Cells(i, 9) > 100 Then
Worksheets("要注意リスト").Cells(k, 3) = Worksheets("元データ").Cells(i, 1) 'ID
Worksheets("要注意リスト").Cells(k, 4) = Worksheets("元データ").Cells(i, 2) '名前
Worksheets("要注意リスト").Cells(k, 5) = Worksheets("元データ").Cells(i, 9) '合計
①k = k + 1
End If
②k = k + 1
Next
End Sub
①の状態が正しいというのはif endの中に入れておくというルールのような形で覚えてしまっている状態です。
最初に書いた時点では②の位置に書いてしまうのです。
そしてエラーが出て①の位置に戻しています。
ハナコステップで書いているのですが…何度書いても分かりません。
原因と致しましては、以下のように考えているからだと思うのですが、
そもそも文の読み方が正しくないのでしょうか…
ご教示頂けますと幸いです。
Dim i As Long 'iを宣言します
Dim k As Long 'kを宣言します
k = 9 'kは9です。
For i = 4 To 13 'iは4です(1周目時点)
If Worksheets("元データ").Cells(i, 9) > 100 Then 'もしも元データのi4(1周目時点)が100を超えていたら
Worksheets("要注意リスト").Cells(k, 3) = Worksheets("元データ").Cells(i, 1) 'IDをコピー
Worksheets("要注意リスト").Cells(k, 4) = Worksheets("元データ").Cells(i, 2) '名前コピー
Worksheets("要注意リスト").Cells(k, 5) = Worksheets("元データ").Cells(i, 9) '合計コピー
End If 'K9の値に入れるi4が調べ終わりました
②k = k + 1 'では次(i=5)に進む前にコピー先のセルも動かします
Next '(i=5)に進みます(forに戻ります)
End Sub
小川 慶一さんのコメント
(コメントID: 7236)
こんにちは。
> そもそも文の読み方が正しくないのでしょうか…
結論から述べると、文の読み方が正しくないです。
エクセルVBAでのセルの指定方法として、RangeのほかにCellsもありますね。
Cells(row, column) の構文で、上からrow行目、左からcolumn列目のセルを指定できます。
row, columnの指定には、数値を使います。(他の方法もありますがオフトピなのでその他の方法についてはここでは紹介しません)
また、変数を使ってrow, columnを指定することもできます。
たとえば、 k = 5 のとき、 Cells(k, 3) は、左上から数えて、「5行目かつ3列目」のセルを指します。
また、変数の値は、何度でも上書きできます。
以下では、[2], [3], [4] で、それぞれ、変数kに値を入れ直しています。
sample2のプログラムは、[2], [3], [4] のそれぞれを実行する直前に変数kに入っている値を利用して、以下のように書くこともできます。
ここまで理解に不足はないでしょうか。
理解に不足がないという前提で述べると、以下はあきらかにおかしいですね。
k = k + 1 'では次(i=5)に進む前にコピー先のセルも動かします
基礎編講座本編のどこでも、「コピー先のセルを動かす」という機能を持つコードを紹介したことはありません。
> 解けてはいますし、回答を見ても正しいようなのですが、
> k = k + 1の位置にいつも戸惑ってしまうのです。
めちゃくちゃシンプルに言うと、 k= k + 1 の位置があるべきなのは、それがあるべき場所です。
逆に言うとあるべき場所にない場合は、期待(演習の意図)とは異なる結果になります。
理解が不足していると感じられるようでしたら、演習より簡単なコードを書いて実際に動作確認をされることをおすすめします。
(ステップイン実行、[F8]にて、一行一行、動作を確かめつつ)
その際には、あえておかしな位置に置き換えて動作させ、どんな結果になるか観察してみてください。
理系科目の学習でいちばん良いのは、自分で実験を設計して、自分で実験して、結果を検証することです。
あとは、より簡単な課題を解いてみること。
たとえば以下です。
○本課題の前段階。同一シート内の別表に転記する
https://forum.pc5bai.com/lesson/page/144
○さらに前段階。出現回数を数える。(直前に変数に入っていた値を使ってその変数に入る値を決める部分は同一。かつ、出力先の指定がないだけ本課題より容易です)
https://forum.pc5bai.com/lesson/page/150
これらの課題を、各行のコードが指すものを正確に説明しつつステップイン実行([F8])できるか?
あえて間違ったコードを書いて実行し、期待通りの間違った結果を得られるか?その間違いの理由を、講座で学習した言葉を使ってしっかりと説明できるか?試してみてください。
これらができるようになれば、自ずと、今回の理解不足だった点についても理解できるでしょう。
完成形のコードの構造が理解できない、コード内の特定の行の機能が理解できないという場合は、それ以前(たいてい、1段階前ではなく、2段階、3段階以上前)に学んだはずの何かが抜け落ちている場合が多いです。
(一般論を容易に言えるものではありませんが、対面講座も含めて多くの受講生の方をサポートしていての所見です)
講座で配布したマインドマップも全体を見直し、抜け落ちている点がないか点検してみてください。
kotimerさんのコメント
(コメントID: 7237)
アドバイスありがとうございました。
教えて頂いた問題は何度も解いていましたが、
もはやそういう順序で書いていくと頭に入ってしまっていたので、直接コードをただ書いて学習するのではなく、どういう手順で動かしたいか紙に書き出してみました。
実行もF8で少しずつ見返しては紙との差を確認したところ、動画5で気づきました。
if文でture時でのみ実行されるためにはEndifの前にk=k+1を入れないといけないと。
動画4でも同様にcntの値(集計値を入れる)はif文の処理が終わった後にしないと余計な処理が増えるなど分かりました。曖昧な手順のように覚えていてもいずれ応用問題で全く分からなくなりそうなので、時間をかけてしっかり理解できるよう頑張ります。
ひとまず先日質問させていただいた問題に再トライします!
小川 慶一さんのコメント
(コメントID: 7239)
こんにちは。
詳しい報告、ありがとうございます。
どんな感じで復習されたのか、よく理解できました。
文面から、よいご経験をされたのではないかと感じています。
また行き詰まりそうになったらご質問/ご相談ください。
> もはやそういう順序で書いていくと頭に入ってしまっていたので
広い意味では、最終的にはそんな状態になります。
たとえば、僕でしたら、基礎編ベーシックの問題であれば、見た瞬間に頭の中で手順が再現されて、あとは手が淡々と追いついていくだけです。
ただ、「もはやそういう順序で書いていくと頭に入ってしまって」はいるのですが、まだ慣れていない方と大きく異るのは、個別の作業に対する理解度です。
ここは、実装を何度も体験しつつ、理論を何度も復習しつつ、としてはじめて身につくところです。
このプロセスを経て、「そういう順序で書いていく」ことがなぜベストなのかということが、思考レベルでというより、身体レベルでしっくり納得できる領域に到達します。
遠回りなようでも、復習をくり返すことが、上達の近道です。
サラサラ解けた問題でも、2周目になると、また違って感じられるものです。
この感覚は、個々のキーワードや、文、操作のそれぞれについて、「しみじみと深く納得する」とでも言うか、そんな感じのものです。解説についても、聞き落としていたもの、読み飛ばしていたものに気づきます。
騙されたと思って、基礎編ベーシックについても、ひととおり終わったタイミングで、もう一度トライしてみてください。
ひきつづき、よい学びを☆