Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7930 / 76734 ←次へ | 前へ→

【74385】Re:月ごとの転記
発言  UO3  - 13/5/28(火) 15:13 -

引用なし
パスワード
   ▼愛子 さん:

こんにちは

理解が正しかったようでほっとしています。
以下、質問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 を格納すると、配列の中の値でデータ領域が上書きされます。

1 hits

【74361】月ごとの転記 愛子 13/5/26(日) 21:06 質問
【74362】Re:月ごとの転記 愛子 13/5/26(日) 21:47 発言
【74363】Re:月ごとの転記 感想 13/5/26(日) 22:41 発言
【74364】Re:月ごとの転記 愛子 13/5/26(日) 23:42 発言
【74365】Re:月ごとの転記 感想 13/5/27(月) 7:29 発言
【74366】Re:月ごとの転記 愛子 13/5/27(月) 9:18 発言
【74367】Re:月ごとの転記 UO3 13/5/27(月) 10:44 発言
【74368】Re:月ごとの転記 愛子 13/5/27(月) 12:26 発言
【74369】Re:月ごとの転記 愛子 13/5/27(月) 13:02 発言
【74373】Re:月ごとの転記 感想 13/5/27(月) 20:00 発言
【74377】Re:月ごとの転記 愛子 13/5/27(月) 20:59 発言
【74378】Re:月ごとの転記 感想 13/5/27(月) 21:12 発言
【74379】Re:月ごとの転記 愛子 13/5/27(月) 22:18 発言
【74380】Re:月ごとの転記 13/5/28(火) 6:50 発言
【74381】Re:月ごとの転記 愛子 13/5/28(火) 9:18 発言
【74383】Re:月ごとの転記 UO3 13/5/28(火) 12:35 発言
【74384】Re:月ごとの転記 愛子 13/5/28(火) 14:36 質問
【74385】Re:月ごとの転記 UO3 13/5/28(火) 15:13 発言
【74389】Re:月ごとの転記 愛子 13/5/28(火) 23:33 発言
【74391】Re:月ごとの転記 13/5/29(水) 6:59 発言
【74412】Re:月ごとの転記 愛子 13/5/30(木) 20:10 お礼
【74386】Re:月ごとの転記 愛子 13/5/28(火) 15:34 発言
【74388】Re:月ごとの転記 UO3 13/5/28(火) 19:48 発言
【74390】Re:月ごとの転記 愛子 13/5/28(火) 23:37 発言
【74392】Re:月ごとの転記 13/5/29(水) 7:35 回答
【74400】Re:月ごとの転記 愛子 13/5/29(水) 15:44 お礼
【74396】Re:月ごとの転記 UO3 13/5/29(水) 15:02 発言
【74401】Re:月ごとの転記 愛子 13/5/29(水) 16:37 発言
【74402】Re:月ごとの転記 UO3 13/5/29(水) 17:39 発言
【74403】Re:月ごとの転記 愛子 13/5/29(水) 20:40 質問
【74408】Re:月ごとの転記 UO3 13/5/30(木) 9:29 発言
【74409】Re:月ごとの転記 愛子 13/5/30(木) 10:55 発言
【74410】Re:月ごとの転記 愛子 13/5/30(木) 14:12 発言
【74411】Re:月ごとの転記 愛子 13/5/30(木) 18:55 お礼
【74404】Re:月ごとの転記 感想 13/5/29(水) 21:20 発言
【74407】Re:月ごとの転記 愛子 13/5/30(木) 0:33 発言

7930 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free