ボロボロ皇帝のボロ切れと塊

ボロボロ皇帝が悪態、嫌み、好み、何でも己の視点だけで自由に吐く「偏」な場所。たまにExcel、家電、音楽等についても好きに吐いてる。

ボロボロ皇帝が悪態、嫌み、好み、何でも己の視点だけで自由に吐く「偏」な場所。
Excel、家電、音楽、ゲームイラスト小説映画、性癖について等、何でも好きに吐いてる。

どうでも良いかもしれんが背景色変わっていくの見てくれ。
更にどうでも良いかもしれんがアイコンが息してるの見てくれ。


我輩は何にも制約されない身、
「耐えぬ」事を恐れないと決めたのだ!
我輩は好きなときに悪態をつく!
妬み僻み嫉みを背負い、
マイナーだろうが邪道だろうが
我輩は我輩の道を行く!
好きなものは懸命で不器用な諸君,
嫌いなものは器用で完璧を気取った奴らだ。
         

【VBA】マクロでループ処理:DoWhile~Loopで簡潔に美しく(バカ構文修正)&DoWhileって何やねん【解説】

 

以前、クソめんどくさい集計を楽にする為任意座標クリック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)値のみ