[[20200603235028]] 『Next forを使って複数の定数を順に処理していく方』(Pchan) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Next forを使って複数の定数を順に処理していく方法』(Pchan)

VBAで初めに定数を複数宣言しておいて、Next forを使って宣言した複数の定数を順に処理していく、というコードを作りたいと思っています。
マクロを実行したときに、まずメッセージボックス「C:\Users\user\Downloads\a\」、次にメッセージボックス「C:\Users\user\Downloads\b\」と出すイメージです。
以下のコードではうまくいかないのですが、どのような方法がある教えていただけないでしょうか。

Const path1 = "C:\Users\user\Downloads\a\"
Const path2 = "C:\Users\user\Downloads\b\"

Sub a()

 For i = 1 To 2
  MsgBox (path & i)
 Next i
End Sub

< 使用 Excel:Excel2019、使用 OS:Windows10 >


定数ではなく変数を使います。
今回は配列変数てす。

http://officetanaka.net/excel/vba/variable/07.htm
(OK) 2020/06/04(木) 00:09


 >VBAで初めに定数を複数宣言しておいて、Next forを使って宣言した複数の定数を順に処理していく、というコードを作 >りたいと思っています。 

 よく見てませんでした。

 参考まで。

https://www.moug.net/tech/exvba/0150119.html
(OK) 2020/06/04(木) 07:28


 私は配列の利用でよいと思いました。

 Option Explicit
 Sub test()
     Dim path(1 To 2) As String
     Dim i As Long

     path(1) = "C:\Users\user\Downloads\a\"
     path(2) = "C:\Users\user\Downloads\b\"

     For i = 1 To 2
         MsgBox path(i)
     Next i
 End Sub
 # なお、"C:\Users\user\Downloads\" までは共通なので外に出すとかは別の話
 # という整理です。
(γ) 2020/06/04(木) 07:43

みなさん、ありがとうございます。

path1、path2はプロシージャを超えて参照するので、dimをpublicとして宣言場所をプロシージャの前にしたのですが(A)、「コンパイルエラー プロシージャの外では無効です」とエラーが出ます。

A
−−−−−−−−−
Public path(1 To 2)
path(1) = "C:\Users\user\Downloads\a\"
path(2) = "C:\Users\user\Downloads\b\"

Sub test()

For i = 1 To 2

 MsgBox path(i)
Next i

End Sub
−−−−−−−−−

publicではなくdimにしてプロシージャ内で宣言すると(B)、エラーが出ずに意図した通りに動きますので、そこが原因だというところまではわかるのですが、何が問題なのでしょうか。

B
−−−−−−−−−
Sub test()

Dim path(1 To 2)
path(1) = "C:\Users\user\Downloads\a\"
path(2) = "C:\Users\user\Downloads\b\"

For i = 1 To 2

 MsgBox path(i)
Next i

End Sub
−−−−−−−−−
(Pchan) 2020/06/04(木) 20:43


モジュールを超えない限り、Public変数でなくてもいけます。

Dim path(1 To 2) As String

Sub test1()

 path(1) = "C:\Users\user\Downloads\a\"
 path(2) = "C:\Users\user\Downloads\b\"
End Sub

Sub test2()

 Dim i As Integer
  For i = 1 To 2
   MsgBox path(i)
  Next i
End Sub
(OK) 2020/06/04(木) 20:58

 最近?ミスリードが多いのと(前からかぁ(^^;)回りくどい気もしますが、、
最初のコード最大限尊重すると。。こんな感じでしょうか????

 Option Explicit
Const path1 = "C:\Users\user\Downloads\a\"
Const path2 = "C:\Users\user\Downloads\b\"
Sub a()
Dim i
Dim x
x = Array(path1, path2)
For i = LBound(x) To UBound(x)
    MsgBox x(i)
Next i
End Sub
(SoulMan) 2020/06/04(木) 21:17

 >Public path(1 To 2) 
 こちらは、変数宣言

 >path(1) = "C:\Users\user\Downloads\a\" 
 >path(2) = "C:\Users\user\Downloads\b\"
 こちらは、命令文(プログラムの中枢部分)
(BJ) 2020/06/04(木) 21:27

 定数と変数の違い、それと、宣言文と実行文の違い、を知らなくてはいけません

 変数は、プロシジャ中で代入することができて、その値は可変です。
 定数は、代入することは出来ず、値は不変です。その値は宣言文で定義されます。

 さて、VBAでは、添え字付きの変数を配列変数と呼びます。
 VBAでは、配列変数は使えますが、配列定数は使えません。
 配列定数を使える言語(処理系)もありますが、VBAでは使えません。

 話が変わって、
 宣言文は、変数や定数の定義部なので、プロシジャの外にあってもいいです。
 宣言文の位置はその変数や定数のスコープ(影響範囲というか使える範囲)に影響を与えますが、ちょっとおいときます。

 定数は宣言文で、同時にその値を定義することが出来ます。
 変数は宣言文では、値を決めることが出来ず(型によって初期値は決まってますが)、
 変数にどっかで値を代入しないといけないです。
 ただし、代入文は実行文なので、プロシジャの中にないといけません。

 まとめると、
 ・添え字をつけない定数は、プロシジャの外で宣言できて、値も同時に決められる
 ・VBAでは、添え字をつけたら必ず配列変数(添え字付きの定数は使えない)であり、
  配列変数へ値を代入するのは実行文なので、プロシジャの中にないといけない

 おしまい

 書いてみたけどわかりづらですね。
 どこかにわかりやすい解説がありそうなものだけど 
(´・ω・`) 2020/06/04(木) 21:59

みなさま、ありがとうございます。

エラーの原因は以下の通り理解しました。
・定数は宣言も代入もプロシージャ外で可能、変数は宣言はプロシージャ外で可能だが、代入はプロシージャ内でのみ可能
・今回は代入する値を変える必要があるので、定数は使えず配列変数が使えそう

そして解決策はみなさんがいくつか出していただいているので、それらを見ながら考えてみます。
(Pchan) 2020/06/04(木) 22:12


みなさん、ありがとうございました。
無事意図した動きをするマクロを作れました。
(Pchan) 2020/06/05(金) 18:41

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.