
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を始めたばかりの初心者でいて、
理解力が乏しいため
お詳しい方がいらっしゃいましたら、是非、お教え下さい。
よろしくお願い致します。
No.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
No.3
- 回答日時:
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行の値から総合計(横計算)を計算

No.2
- 回答日時:
こんにちは!
サイトのコードを拝見すると、
>If i = 4 Then
「4」は第4週ではなく、「客単価」の行に当たると思います。
>For i = 1 To 4
は
「日付」 → 「売上」 → 「客数」 → 「客単価」の行を順にループさせています。
第○週の行の取得は
>ix = (i - 1) * 4 + 2 '日付の行位置
の行になりますね。
※ 練習問題では4週の表にしてありますが、
実際は5週目がある月がありますので、実用的にするには
もう1周分の表があれば良いような気がします。m(_ _)m
No.1
- 回答日時:
「'縦合計の客単価」の部分は、
for i=1 to 4
~
next
で第1週から第4週まで、各週の客単価の計算をした最終の4週めということで
If i = 4 Then ~
ここで、表の下の部分の合計欄を指定しているのだろうと思います。
十分にコードを見て精査したのではないので、間違っていたらごめんなさい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) 指定列最終行までのスペースを改行するVBAについて 2 2022/06/01 19:50
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) i=cells(Rows.Count, 1)とi=cells(Rows.Count, 2)の違い 2 2022/04/06 10:04
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
製造業に勤めています。 外注さ...
-
はじめまして。私、配管業を個...
-
外構見積もりましたが、どうで...
-
天井開口費の見積について
-
一式という言葉の使い方
-
仕入単価
-
投信の「数量」がよく分からない
-
事務所ビルの電気料金について...
-
CIF単価→FOB単価の算出の仕方を...
-
卸単価の95掛けってどうゆう意...
-
食材の単価と価格の違いを教え...
-
ACCESSのレコード順番の入れ替え
-
ACCESSでクエリの式の内...
-
Access columnプロパティについて
-
積算 高所作業車 建築
-
公共建築工事(設備)の積算に...
-
IFERROR、SMALL関数について
-
リストボックスの項目に、他の...
-
使い捨ての歯ブラシについて
-
表示方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
はじめまして。私、配管業を個...
-
外構見積もりましたが、どうで...
-
製造業に勤めています。 外注さ...
-
天井開口費の見積について
-
仕入単価
-
一式という言葉の使い方
-
表示方法
-
事務所ビルの電気料金について...
-
積算 高所作業車 建築
-
CIF単価→FOB単価の算出の仕方を...
-
公共建築工事(設備)の積算に...
-
卸単価の95掛けってどうゆう意...
-
1工数1人工
-
食材の単価と価格の違いを教え...
-
売上、客数、単価から買い上げ...
-
ACCESSのレコード順番の入れ替え
-
リストボックスの項目に、他の...
-
2024年 職人不足で単価が上がる...
-
退去費用内訳の妥当性 3年半住...
-
SE単価交渉用文書
おすすめ情報