|
▼愛子 さん:
こんにちは
理解が正しかったようでほっとしています。
以下、質問1.質問2. へのコメントです。
わかりにくかったら遠慮せずに聞いてくださいね。
質問1.
c.EntireRow.Range("L1").Value
ここは "L1" 、いつも 1 にしてください。
この部分は E2 から下に、E列のセルをピックアップしています。
E2,E3,E4,・・・・・ と参照していきますね。
たとえば、 c が E10 だったとします。このとき参照すべき L列は、当然ながら L10 ですね。
この L10 を参照する方法はいろいろあります。
よく使われるのが、 c.Offset(,7).Value
これは c(E10) からみて、同じ行で、列が右に 7 つ移動したところという記述です。
これでもいいのですが、いくつ離れているかということを【指を折って】数えなきゃいけませんね。
数え間違いをするかもしれません。また、将来、仕様(レイアウト)変更で、E列ではなく、F列を抽出するようになった場合
忘れずに、c.Offset(,6).Value に変更する必要があります。で、うっかり変更を忘れがちです。
で、c.EntireRow.Range("L1").Value
たとえば、A1 というと、我々は、エクセルシートの一番左上隅のセルをイメージしますね。
間違いじゃないんですが、正確に言いますと、【シートのすべてのセル領域の中の A1】ということで
【シートのすべてのセルの中の】が省略されているんです。
ほんとは A というのは、指定セル領域の一番最初の列 という意味です。
1 は、指定セル領域の一番最初の列ということです。
c.EntireRow というのは c (E10 とか E20 とか)が属している行全体というセル領域です。
で、その領域に対して、L1 ということは、1行目 という意味(実際にはシート上の10行目とか20行目とか)
また、 L は 12列目 ということになります。
ややこしいのですが、コードとしては、 L列の、その行の値なんだと、まぁ、c.Offset(,7).Value よりは
見た目、わかりやすいかな ということで、私は、この記述方法が好きです。
質問2.:
まず、 With 〇〇〇 とくくりますと、以降、End With まで、この 〇〇〇 に属するオブジェクトを参照するときに
ほんらいは 〇〇〇.なんとか と指定すべきところ、.なんとか と、頭に .(ピリオド)をつけるだけで OKになります。
記述がスッキリするのみならず、効率面でも若干よろしいようです。
With Sheets("一致")
これで、以降の .なんとか は Sheets("一致").なんとか ということになります。
With .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
上で、With Sheets("一致") でくくっていますので、このコードは
With Sheets("一致").Range("A2", Sheets("一致").Range("A" & Sheets("一致").Rows.Count).End(xlUp))
と同じということになります。で、今度は、このA2〜A列データ最終行 までの領域が With でくくられますので
以降の .なんとか は A2〜A列データ最終行までの領域のなんとか ということになります。
nameV = .Value
.Value は、 A2〜A列データ最終行までの領域の値ということになります。
Variant型変数に、複数セル領域.Value をいれますと、その領域と同じ形の2次元配列になります。
mmV = .Offset(, mm - 2).Value
おなじことなんですが、セル領域がすこし難しいかもしれませんね。
.Offset(, mm - 2) これは、この A2〜A列データ最終行までの領域 を、左側に mm - 2 列だけ移動した領域です。
mm は月です。 5月なら mm - 2 は 3 ですね。5月の列は 3 ですので、このような計算をしています。
結果的に、mmVというVariant型変数が、 5 月の列の値を持つ配列になります。
ここまでで、名前が入った配列(nameV) と 当該月の値が入った配列(mmV) ができあがります。
For i = 1 To UBound(nameV, 1)
配列の 1 行目(シート上のデータでいえば 2行目)から 配列の最後の行 UBound(配列,1) までループさせます。
If dic.exists(nameV(i, 1)) Then mmV(i, 1) = dic(nameV(i, 1))
もし、nameVの要素(A2から始まる名前)が辞書に登録されていれば、その辞書に登録されたデータ(金額合計)を
mmV という当該月用配列の該当の場所にセットします。
.Offset(, mm - 2).Value = mmV
.Offset(, mm - 2) は、上で説明しましたね。該当月のデータ領域です。
そこに、同じ大きさを持った配列 mmV を格納すると、配列の中の値でデータ領域が上書きされます。
|
|