以前、クソめんどくさい集計を楽にする為の任意座標クリックVBAコードについて説明したが(これ↓)、
正直座標クリック以外の部分は、非常に雑なつくりというか馬鹿丸出しであった。
それには理由がある。
どうせ一時的なものだしと考えていたのだ。
つまり、きっともう二度とないだろう、そう思っていた。
のだが。
先日(っつっても夏の話だがまとめるのが遅くなった)、あのクソめんどくさい作業と、願わぬ再会を果たしてしまったのである。
二度あることは三度ある、ということわざがあるように、恐らくこれが最後とはならないだろう。
ならば美しくせねば。
見やすくやりやすく美しくビューティフォーにせねば…!!
それに、そのときちょうどDoWhileを完璧に理解したばかりだった(というか前も一回理解したのだが、使ってなかったら忘れてしまってた)。
この習得した技を使いたい。覚えたての言葉使いたいとか、覚えたての呪文唱えたい、みたいなもんである。
というわけで前置きが長くなったが、さっそくDoWhileについてだ。
一応目次を置いておく。
まずは、
Do Whileってどういう意味やねん
ってな話である。
まあ言ってしまえば、DoWhileはIF文のLoop処理Ver.みたいなもんである。
ちなみに個人的な意見として、VBAコードは、英単語の意味が分かるか分からないか次第で理解度が変わるもんだと思う。結局英文だしなこれ。
意味さえ理解すれば結構身につくというか、組み立てやすくなるのだ。あと応用しやすい。
なのでまずは説明させてくれ(要らんかったら目次で我輩の屍を越えていけ)。
例えば、
I can dancing while you're with me.
これの訳文は、
「君が共にいる間は踊っていられる」
である。Oh…シャチョさんロマンチスト!Hot! Very Hotネ!というカタコトボイスが聞こえてくるようだ※英文がなんかおかしくても無視するように。これはVBAの説明である。
つまり、While=間(あいだ)だ。
では、
Do While Range("A" & 1 + i) <> ""
これはどういう意味か。
まず、
Range("A" & 1 + i) <> ""
はそのまま、Range("A" & 1 + i) <>(じゃない) ""(空白)
すなわち、
A1 + iは空白じゃない
という意味である。
では頭にDo Whileがつくとどうなるか。
Doってのはするとかやるとかいう意味になる。
そしてWhileが先述の通りに、間だ。
もうお分かりであろう。
Do While Range("A" & 1 + i) <> ""
とは、
(A1 + iが空白でない間する)
なのである!
さて何をするのか。
Loopだ!!
というわけで、あとはもう簡単だ。
以下VBA例文↓
Sub rakusitai()
Do While Range("F" & 5 + i) <> ""
If Range("X" & 5 + i) = "" Then
Range("F" & 5 + i).Copy
AppActivate "伝票照会"
SendKeys "^v"
Application.Wait [now()+"00:00:0.5"]
SendKeys "~"
Application.Wait [now()+"00:00:3.0"]
SendKeys "{TAB 2}"
Application.Wait [now()+"00:00:0.5"]
SendKeys "^c"
SendKeys "{F2}"
Application.Wait [now()+"00:00:0.5"]
Range("X" & 5 + i).PasteSpecial (xlPasteAll)
CutCopyMode = False
End If
i = 1 + i
Loop
End Sub
※間の処理は要らなかろうなので文字サイズを小さめにしている。
以上。
これで、("F" & 5 + i)、すなわちloopするごとにiに1ずつプラスされ、F5、F6、F7…とそれが空白セルではない間処理は続くのだ。
しゅてき!!
というわけで、諸君もさっそくDoWhile~LoopもしくはDoUntil~Loopを使ってみてくれ(Untilも捉え方が逆なだけで同じようなもんだが、今回はもう長いので、今度別のコード載せるときに併せて説明する)。
以下、すぐ忘れる己のためのミニ備忘録。
Range("X1").PasteSpecial (xlPasteAll)はすべて貼り付け
Range("X1").PasteSpecial (xlPasteValues)は値のみ