人生最悪の忘れ物

以下の2行の コードが分かりません
特にNが、特に定義されていないので、突然でてきた感じで
分かりません。iは1から2までと定義しています

本コードは、Sheet2で実行すると、下記の表の2行目の
A~d列までコピーされ、Sheet2のA1セルに貼付されます

答えは良いのですが、なぜ、そのような結果になるのかが分かりません
ご存じの方、教えて下さい

【分からないコード】
N = N + 1
.Range(.Cells(i, 1), .Cells(i, 4)).Copy Cells(N, 1)


【表】Sheet1
   A       B  C  D     
1行 佐藤 一郎  1 1 1
2行 エクセル太郎 101 1 1
3行 鈴木 次郎    1 1 1


【コード】動きます
Sub Sample()

Dim i As Long
Dim N As Long

With Sheets("Sheet1")
For i = 1 To 3

If .Cells(i, 2) > 100 Then

N = N + 1
.Range(.Cells(i, 1), .Cells(i, 4)).Copy Cells(N, 1)

End If
Next i
End With

End Sub

A 回答 (2件)

こんにちは



>N = N + 1
ループ部分を単純化して
 N = 0 ' ←1行追加
 For i = 1 To 3
  ・・・
  N = N + 1
  ・・・
 Next i
のようになっていれば、理解できますよね?

VBAの場合、
 Dim N As Long
を宣言した時点で、N = 0 として初期値が設定される仕様になっています。
ですので、上記の
>N = 0 ' ←1行追加
を省略しても、同じ意味になります。


>.Range(.Cells(i, 1), .Cells(i, 4)).Copy Cells(N, 1)
With 構文内の記述なので、オブジェクトが省略されている場合は、指定されたオブジェクトとして解釈されます。
ご質問のセンテンスであれば、

Sheets("Sheet1").Range(Sheets("Sheet1").Cells(i, 1), Sheets("Sheet1").Cells(i, 4)).Copy Cells(N, 1)

と同じ意味になります。
いちいち記述すると長くなるので、Withで短縮表記できるようにしているものと思います。
    • good
    • 0
この回答へのお礼

以下、勉強になりました。分かりやすい解説、いつも
ありがとうございます

VBAの場合、
 Dim N As Long
を宣言した時点で、N = 0 として初期値が設定される仕様になっています。

お礼日時:2024/08/04 15:19

Nはいきなり現れた時点で 0 です。



Ifを通過して来た時に
N=N+1 → =0+1 → =1
で、N に 1 が格納されます。
Nはコピペ先の行数ですね。
コピペ開始位置を2行目にしたいのであれば、
DIMの宣言の次の行あたりにでも N=1 を書き入れておけば良いです。


For の1巡目で i=1
Sheets("Sheet1").Cells(1, 2) = 1
で >100 を満たさないのでIfを抜ける。

For の2巡目で i=2
Sheets("Sheet1").Cells(2, 2) = 101
で >100 を満たさすので、If Then の処理に入る。
冒頭に書いた通り、Nの初期値は 0 なので、
N = N + 1 → N=1
コピペ作業が実行される
Sheets("Sheet1").Range(.Cells(2, 1), .Cells(2, 4)) をコピーし
Cells(1, 1)へ貼り付け。

For の3巡目で i=3
Sheets("Sheet1").Cells(3, 2) = 1
で >100 を満たさないのでIfを抜ける。
    • good
    • 0
この回答へのお礼

以下、分かりました。
分かりやすい解説、ありがとうございます。

Nはいきなり現れた時点で 0 です。

お礼日時:2024/08/04 15:20

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A