
Photo by
mericanadesico
マクロVBA練習問題04
問題
エクセルの神髄さんの練習問題04(Ifの練習)を解いた。
https://excel-ubara.com/excelvba9/EXCELVBA604.html
解答(シンプル版)
Sub 練習問題04_1()
With Sheet4
'設定
Dim StartRow As Long: StartRow = 2
Dim EndRow As Long: EndRow = .Cells(Rows.Count, "A").End(xlUp).Row
'処理
Dim R As Long
For R = StartRow To EndRow
.Cells(R, "D").Value = .Cells(R, "B").Value \ .Cells(R, "C").Value '箱数 = 納品数 \ 入数
.Cells(R, "E").Value = .Cells(R, "B").Value Mod .Cells(R, "C").Value 'バラ数 = 納品数 Mod 入数
If .Cells(R, "D").Value = 0 Then
.Cells(R, "D").Value = "×" '箱数が0の場合、×を入力
End If
Next R
End With
End Sub
上記コードで事足りるけれど、箱数が0の場合に×を再度入力するというところが二度手間になっていると感じた。
やっぱり計算式で入力された方が、後から見た人のことを考えると親切?
ということで、コードを書き直した。
解答(改良版)
Sub 練習問題04_2()
With Sheet4
'設定
Dim StartRow As Long: StartRow = 2
Dim EndRow As Long: EndRow = .Cells(Rows.Count, "A").End(xlUp).Row
'処理
Dim R As Long, 納品数 As String, 入数 As String
For R = StartRow To EndRow
納品数 = .Cells(R, "B").Address(0, 1) '納品数のセル番地
入数 = .Cells(R, "C").Address(0, 1) '入数のセル番地
'箱数が0の場合、×を入力
If .Cells(R, "B").Value \ .Cells(R, "C").Value = 0 Then
.Cells(R, "D").Value = "×"
Else
.Cells(R, "D").Formula = "=INT(" & 納品数 & "/" & 入数 & ")" '箱数の計算式
End If
.Cells(R, "E").Formula = "=MOD(" & 納品数 & "," & 入数 & ")" 'バラ数の計算式
Next R
End With
End Sub
コードの量は多くなってしまったが、こちらの方が後から見たときに何をしているかが、自分なりにはわかりやすい気がする。
雑感
関数を使ったコードを書くなら、別にVBA使わなくてもいいんじゃない?と思ってしまった。
予め関数を入れておいたテンプレートを作っておいて、それをコピペするコードだけ書けばよいのでは?
結局のところバラバラに散らばった複数ファイルからデータをコピペして整形することが面倒なわけなので。
コードを書く手間を含めて総合的に考えてないと、自己満足で終わりそうな気がしてしまうなぁと。