こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBAのループ処理について

お世話になっております。
VBAのループについて教えていただきたいです。
更新ボタンを押した際に自動で計算されるプログラムを組んでおります。
計算のモジュールは「Module_g.InputCalc」で引数は(ActiveCell.Row, "支出"または"粗利益")で呼ぶことができます。
現在のコードだと粗利益の部分も支出の計算で入ってしまうため、粗利益に入ったら粗利益の計算がされるようにしたいです。
その時の判定の取り方を教えていただきたいです。
また、支出・粗利益の中の項目は追加していくことがあります。

コード
Sub DateUpdate()

With Sheets("HOME")

Dim i As Integer

For i = 7 To .Cells(Rows.Count, 1).End(xlUp).Row
Call Module_g.InputCalc(i, "支出")
Next
End With

End Sub

大変申し訳ございませんが、この投稿に添付された画像や動画などは、「BIGLOBEなんでも相談室」ではご覧いただくことができません。 OKWAVEよりご覧ください。

マルチメディア機能とは?

投稿日時 - 2020-07-08 17:43:32

QNo.9770102

すぐに回答ほしいです

質問者が選んだベストアンサー

単純に考えると

Dim i As Integer
mStr = "支出"
For i = 7 To .Cells(Rows.Count, 1).End(xlUp).Row
If .Cells(i, 1).Value = "粗利益" Then
mStr = "粗利益"
End If
Call Module_g.InputCalc(i, mStr)
Next
End With

投稿日時 - 2020-07-08 18:13:40

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

VBAというより最も単純なひとつの手法は、
関数の中から参照できる条件分岐用のグローバル変数(バイナリフラグ)を用意しておくようにします。
計算処理を速くしたければ、コードは冗長になりますが似たようなループを2つ作りループの前で分岐させます。
コードの見通しをよくしたければ、ループ内に分岐を入れて計算させます。

再利用性(編集性)がいいのは後者ですが、トータルパフォーマンスがいいのは、前者のループをそれぞれ単純関数化してサブルーチンで呼び出す感じがメインソースが見やすくなると思います。

投稿日時 - 2020-07-08 23:59:27

ANo.2

そういうことになるのは何の不思議もない。当然。
しかし画像だけでは、データの状況・内容がわからない。
特に説明が必要なのは、A列の支出行などは、セル結合がされているのか。
それなら、それを頼りにする方法もあるが。
上の行から順次処理すべきなのかどうかもよくわからない。
要するに質問の説明が不十分なんだ。
それに初心者は見てくれがよいので、よくやるが、VBAなど使うときは、セル結合をしていると、処理が面倒だということが身に染みる。
ーーーー
下記を参考にして、考えてコードを組んだら。
例データA2:B10
行が第2-5行、6-7行、8-10行が結合されているとする。
項目1が「支出」、aが「〷費」に当たる。下記の a-iはB列データです。
項目1a
  b
   c
  d
項2  e
  f
項目3 g
  h
  i
ーーー
標準モジュール
Sub test01()
Lr = Range("A1000").End(xlUp).Row
i = 2
p1:
If i > Lr Then Exit Sub
If ActiveSheet.Cells(i, 1).MergeCells = True Then
m = ActiveSheet.Cells(i, 1).MergeArea.Rows.Count
MsgBox Cells(i, "A")
MsgBox m
’---費目の把握
For j = i To i + m - 1
MsgBox Cells(j, "B")
Next j
End If
i = i + m
GoTo p1
End Sub

投稿日時 - 2020-07-08 20:01:38

あなたにオススメの質問