1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[VBA For Loop] Increment++ Decrement+-の代わりはStepです

Posted at

【VBA】インクリメントやデクリメントは使える?代替案は?
関数を作るという解決方法が提示されている。

しかし、For Nextに限れば、この場合Stepを使います。
まず++1のように1づつ増加する場合はなにもいりません。

Dim i As Long
For i = 1 to 10
Debug.Print i
Next i

++2のような場合

Dim i As Long
For i = 1 to 9 Step 2&
Debug.Print i
Next i

とStepを使います。アンドはLongのリテラルです。なくてもいいのですが、これを入れるとこのプロシージャでは計算はIntejerからLongに拡張されます。

次に減少する場合は

Dim i As Long
For i = 10 to 1 Step -1&
Debug.Print i
Next i

とこのようにします。
確かに++--+1などはありませんが。
なお、微小Step 微小インクリメントはリテラルで単精度浮動小数点型を使い、演算誤差を発生させないというのはオリジナル技かな。

Dim i As Long
For i = 1 to 2 Step 0.1!
Debug.Print i
Next i

インクリメントやデクリメントはありませんが、こんな感じでしょうか。
もっともこの微小ステップは最初に紹介した記事のような書き方を応用して、

Dim i As Long
Dim s1 As Single
S1 = 1
For i = 1 to 10
S1 = S1 + CSng(i/10)
Debug.Print S1
Next i

という書き方のために使えるので、この方法も覚えておいた方がいいです。
これはi自体は1づつ増加するけど、このiの値自体が必要な変数と、それとは別に遅れて増加する場合などはこれを使います。
たとえば、エクセルにアクセスのテーブルをインポートするとき、アクセスの列は0番から255番ですが、Excelは1番から256番です。
こんなときに1ずらす、という場合にはこの方法が活躍します。
しかしFor Loop以外で任意に加算代入演算子(Increment)、減算代入演算子(Decrement)を使うことは、VBAでデクリメント演算子は?にもあるとおり、元から存在しないのでできません
For~Nextループを逆順に後ろから前に回すでもあるようにStepは基本技です。ただし For i = a to bは昇順はa<b降順(逆順)はb>aの関係になっていないとエラーになります。
For Loop絡みではfor(var i=5; i>0; i--){ }で出てくるような、i=1i>0と書く表現も存在しません。JavaScriptではi>0の部分はendvalueとよばれ、値と条件式が許容されています。VBAの場合は条件式は入りません。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?