excelを使用したVBAの問題に関する質問です。 下記のサイトの問題19の解答の中で、 http://excel-ubara.com/excel-answer/EXCELVBA619A …



'縦合計の客単価
If i = 4 Then
Cells(20, j) = Cells(18, j) / Cells(19, j)
End If



なぜ、週を表している「i」が「4」(if=だったら)なのでしょうか?
「4」だった場合、「合計」欄ではなく、
「第4週目」欄を表すのではないでしょうか?


実は以前にもこの問題19の回答について質問させて頂いております。
しかし、未熟ゆえ、未だに全体的にこの問題の回答が理解できません。

もしよろしければ、
回答全体をひとつずつ「なにがしたいのか」、「どうしてこんなことをしているのか」、について
丁寧にお教え頂けますと、とても助かります。


VBAを始めたばかりの初心者でいて、
理解力が乏しいため

お詳しい方がいらっしゃいましたら、是非、お教え下さい。

よろしくお願い致します。

A 回答 (4件)

こんにちは。



単刀直入。
If i = 4 Then
これは何を意味するか、客単価を4回計算したら、合計欄に計算を出すというものです。第5週目を加えてみれば一目瞭然です。

5週目を加えるには、
If i =5 にしなければなりません。

このコードが奇妙なのは、縦に集計をしているということです。

「未熟ゆえ、未だに全体的にこの問題の回答が理解できません。」
私が愚かなのかもしれませんが、そのサイトのコードはわかりにくいです。
故意ではないとは思いたいのですが、非常にマレな書き方です。

VBAの学習の進め方は、構文(ループの使い方の違い)や関数を一通り終えて、高級文法に入り、エラー処理を覚え、私の場合は、次に、UserForm やワークシートのイベントを覚えていくというのが、良いと思っています。技術評論社から出ているテキストは、UserForm (コントロール)を入門編の後につけるようです。

せっかくで水を差すようで大変に心苦しいのですが、特に、変数の付け方、プロパティの使い方が標準的ではない人はない人の場合は、わかりにくいのです。
昔は、Microsoft が出していた、『Office VBA プログラマーズガイダンス』という本があったし、細かい部分は、VB6側の『プログラマーズガイダンス』のほうで確認していましたが、今は、たぶん、痕跡ぐらいしか残っていません。

>回答全体をひとつずつ「なにがしたいのか」、「どうしてこんなことをしているのか」、について
>丁寧にお教え頂けますと、とても助かります。

私自身(分身?以前、自分が書いたような書き方の人がいました)が書いたのなら、ある程度はお教えできますが、それでも、半年経てば他人の方ものと同然で、分からないのです。そのマクロは、手法が違うので、その解説するというのは、苦痛というしかありません。

VBAの練習は、英会話と同じで、短文の例文を数多く集め、覚えるように心がけるようにしたほうがよいです。

この問題は、応用問題で、やり方はいろいろありますし、自分なりの答えを出すまでは、もう少し先でもよいのではないでしょうか。

その代わり、私の解答を出しておきます。

'//
Sub Question19()
 Dim lstCol As Long, lstRw As Long
 Dim i As Long
 Dim LastCell As Range
 Dim Rng As Range
 Dim flg As Boolean
 lstCol = Cells(1, Columns.Count).End(xlToLeft).Column
 lstRw = Cells(Rows.Count, 2).End(xlUp).Row
 Set Rng = Range("A1", Cells(lstRw, lstCol))
 
 Rng.Font.ColorIndex = xlColorIndexAutomatic
 With Rng
  For i = 2 To lstRw

   If .Cells(i, 2).Value = "客単価" Then
    .Cells(i, 3).Resize(, lstCol - 2).Formula = "=R[-2]C/R[-1]C"
    .Cells(i, 3).Resize(, lstCol - 2).NumberFormat = "#,##0.0"
    DeficitRed .Cells(i, 3).Resize(, lstCol - 1), .Cells(i, lstCol).Value
   End If
   If .Cells(i, 1).Value Like "合計*" Then flg = True 'ネットからなので、ゴミが入っていました。それで、Like演算子にしました。

   If flg = True Then
    If .Cells(i, 2).Value = "売上" Then
     .Cells(i, 3).Resize(1, lstCol - 2).Formula = _
     "=SUMIF(R2C2:R" & i - 1 & "C2,R" & i & "C2,R2C:R[-1]C)"
    ElseIf .Cells(i, 2).Value = "客数" Then
     .Cells(i, 3).Resize(1, lstCol - 2).Formula = _
     "=SUMIF(R2C2:R" & i - 1 & "C2,R" & i & "C2,R2C:R[-1]C)"
    End If
   End If

   If .Cells(i, 2).Value = "売上" Or _
     .Cells(i, 2).Value = "客数" Then
    .Cells(i, lstCol).FormulaLocal = "=SUM(RC3:RC[-1])"
   End If
  Next i
 End With
End Sub
    • good
    • 1

VBAが提示されていて、何が起きるのかを確認するには[ F8 ]キー


などでのステップインを活用するのが理解を深める一歩目です。

そうすれば、
 '縦合計の客単価
 If i = 4 Then
 Cells(20, j) = Cells(18, j) / Cells(19, j)
 End If
が実行されるタイミングを理解できます。
Excelでの表範囲とVBEを並べて、ステップインをしてみてね。

主な手順
「――」部分が疑問の部分(※があるところで実行)

4週として指定。
 合計と客単価などをクリア
 第1週から開始、1週間なので7列で
 第1週の1日目(月曜日)を取得
   売上を取得
   客数を取得
   第1週の月曜日の売り上げと客数から客単価を計算(縦合計)
   ここまでの売り上げと客数を合計(第1週の1日単位の合計値)
――(第4週ではないので20行の客単価は計算しない)――
   次の日に移動し繰り返し(取得した値を合計として計算)
   7列で客単価が記載されたら、第1週の客単価の総合計を計算
   週単位での客単価総合計と各日に客単価を比べ、低い場合に赤

 第2週に移動し繰り返し
 (縦の総合計には加算)
――(第4週ではないので20行の客単価は計算しない)――

 第3週に移動し繰り返し
 (縦の総合計には加算)
――(第4週ではないので20行の客単価は計算しない)――

 第4週に移動し繰り返し
 (縦の総合計には加算)
※――(第4週なので20行の客単価を18行と19行の列で計算)――
  18行と19行の値から総合計(横計算)を計算
「excelを使用したVBAの問題に関する」の回答画像3
    • good
    • 1

こんにちは!



サイトのコードを拝見すると、
>If i = 4 Then
「4」は第4週ではなく、「客単価」の行に当たると思います。

>For i = 1 To 4

「日付」 → 「売上」 → 「客数」 → 「客単価」の行を順にループさせています。

第○週の行の取得は
>ix = (i - 1) * 4 + 2 '日付の行位置
の行になりますね。

※ 練習問題では4週の表にしてありますが、
実際は5週目がある月がありますので、実用的にするには
もう1周分の表があれば良いような気がします。m(_ _)m
    • good
    • 1

「'縦合計の客単価」の部分は、


for i=1 to 4

next
で第1週から第4週まで、各週の客単価の計算をした最終の4週めということで
If i = 4 Then ~
ここで、表の下の部分の合計欄を指定しているのだろうと思います。
十分にコードを見て精査したのではないので、間違っていたらごめんなさい。
    • good
    • 1

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

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


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

人気Q&Aランキング

おすすめ情報