VBAの動的な変数(定数)の指定
- VBAでの動的な変数(定数)の指定方法について教えてください。
- 実際のコードでは複数の定数があり、それぞれの定数に対して処理を行いたいです。
- Dictionaryオブジェクトを使う必要はありますか?適切なコードを教えてください。
- ベストアンサー
【VBA】 動的な変数(定数)の指定
こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windowsXP SP3 Office=Excel2003(11.8347.8403) SP3 タイトルが正確にやりたいことを表現できているのかいささか疑問なので補足します。 Sub test1() Dim oDict As Object Dim i As String Const Dest01 As String = "C:\aaa\" i = "01" Set oDict = CreateObject("Scripting.Dictionary") oDict(i) = "Dest" & i MsgBox oDict(i) Set oDict = Nothing End Sub 上記のようなコードで、msgboxで ”C:\aaa\”という文字列を返してほしいのですが、"Dest01"の文字列が返ってきます。 上記ではDest01しか指定していませんが、実際のコードではDest80ぐらいまで定数があり、いずれの定数のフォルダも共通性がない状態になっています。 これをFor next文でiをまわして、Dest01から順番に保存していきたい。というのがやりたいことです。 上記のような場合、どのようなコードが適していますでしょうか。 Dictionaryオブジェクトについては、必ず使いたいわけではありません。 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。
- rihitomo
- お礼率69% (144/206)
- Excel(エクセル)
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
質問の意味が読めないですが、どうやら定数を呼び出したいということらしいのですが、「定数」の使い方を勘違いされているようです。 そのようなループとかのコードを書き、"Scripting.Dictionary"のそのオブジェクトを使って、格納させようとしながら、初歩的な文法を間違えてしまっているのは、どうしたものでしょう。 それから、"Scripting.Dictionary"を使うのが好きな人はいますが、適材適所というものがありますから、今回のような場合は、VBAでは、配列に格納して十分だと思います。 今回のように、格納するデータ数が多くなると、管理しにくいので、Excelでは、ワークシートを利用するということになります。 参考例: シートには、 A1~A10に、 C:\aaa\ C:\bbb\ などと入れます。データの秘匿性が高い時は、隠しシート(プロパティのVisibleでVeryHiddenを手動で設定してください。) '// Sub Test2() Dim myRng As Range Dim i As Long Dim aDest As Variant '配列 Set myRng = Range("A1:A10") '予めシートのA列に、定数を入れておく ReDim aDest(myRng.Rows.Count - 1) For i = 0 To UBound(aDest) If myRng(i + 1) <> "" Then aDest(i) = myRng(i + 1).Value End If Next i MsgBox aDest(0) End Sub '// なお、質問の意図を間違えていましたら、どうぞ無視して構いません。
その他の回答 (1)
- masatsan
- ベストアンサー率15% (179/1159)
動的にという意味はわからないではないが、本当にやりたいことは Dest01, Dest02.......Dest80 に定数(例: ”c:\aaa”)が入っていてそれを。。。ですよね。 もともとDest01.......にどのように定数を入れるつもりなんでしょうか? for文で回さずに直に配列にいれればよいのでは?
関連するQ&A
- 定数と変数、どちらを使った方がいいか?
vbaの勉強中なので教えてください。 Sub 定数を使った場合() Const moji = "あああ" MsgBox moji End Sub Sub 変数を使った場合() Dim moji As String moji = "あああ" MsgBox moji End Sub 二つのサンプルは答えは一緒なのですが プログラムを作るにおいてどちらを使った方が良いのでしょうか? このサンプルならどっちでもいいのでしょうか?
- ベストアンサー
- オフィス系ソフト
- VBAでの変数や定数の使い方について
いつもお世話になっております。 VBAを学習中の初心者ですが。 私の使っている参考書では作成したコードについて、後からのコードの修正時を考えて (1)数値や文字列などを直接記述している箇所を定数に置き換える。 (2)セルのアドレスを直接記述している箇所を基点セルを基準に指定するように変更する。 と記載されております。 (例) Const BASE_ADRS As String="A1" ・ Dim baseCell As Range ・ Set baseCell=Range(BASE_ADES) このような感じでコードを記載しています。 (1)(2)の方法だと、後から見返した時に、確認する場所が飛ぶため、今の私にとっては可読性が良いとは言えません。 後々の事を考えると、いまからこの方法に慣れておくべきでしょうか?
- ベストアンサー
- Excel(エクセル)
- 【1】と【2】のvbaは同じ意味ですか?
【1】 Option Explicit Sub test1() Call test2("aaa") End Sub Sub test2(MyStr As String) MsgBox MyStr End Sub 【2】 Option Explicit Dim MyStr As String Sub test1() MyStr = "aaa" Call test2 End Sub Sub test2() MsgBox MyStr End Sub 結果は同じですが、中身が違います。 今後コードを作っていく上で どちらの方式の方が良いのでしょうか?
- ベストアンサー
- オフィス系ソフト
- LookAt の定数を変数で指定するには?
エクセルvbaです。 Sub test() Dim strLookAt As String strLookAt = "xlPart" Cells.Replace What:="aaa", Replacement:="iii", LookAt:=strLookAt End Sub このようなことはできないのでしょうか? LookAtの部分のxlWhole または xlPart かをシートから読み取って変数に格納し、 Replace メソッドで置換したいのですが、 このコードを実行すると「型が一致しません」になります。 多分、LookAt:=strLookAtでエラーになってるのだと思います。 String型だからいけないのでしょうか? 回避方法を教えてください。よろしくお願いします。
- ベストアンサー
- その他MS Office製品
- VBAでワイルドカードを使った文字列検索
初めて投稿いたします。 環境は、WinXP Access2000 下記のVBAモジュールで、文字列検索がヒットしません。 数字の比較でヒットするのはナゼでしょうか? ちなみに、変数に導入したのは、全角半角どちらも入れてみました。 この疑問・・・どなたか解決お願いします。 Sub TEST() Dim AAA As String Dim BBB As String Dim YYY As String AAA = "0" BBB = "2" YYY = AAA & BBB Select Case YYY Case "0*" MsgBox "ココを通り過ぎないで!" Case "15" MsgBox "やったね" Case Is > 0 MsgBox "なぜかココでヒットします??" End Select End Sub
- 締切済み
- その他MS Office製品
- VBAについて質問させて下さい。
VBAについて質問させて下さい。 Sub Exsample() Dim a As String a = "aaa" MsgBox Ketugou(a) End Sub Function Ketugou(x As String) Ketugou = x End Function このサンプルコードについて質問が2つあります。 【質問1】 なぜ x=a、 と言う式はないのに xにが代入されるのでしょうか? 【質問2】 なぜ MsgBox Ketugou(a) では aaa(aaa) とならないのでしょうか? a = "aaa" Ketugou= "aaa" になってるはずですが。 よろしくお願い致します。
- ベストアンサー
- Visual Basic
- 配列 変数の宣言 VBA
こんばんは。 Sub test() Dim myStr(200) As String For 行 = 0 To Cells(Rows.Count, 1).End(xlUp).Row myStr(行) = Cells(行 + 1, 1) Next MsgBox Join(myStr, "_") End Sub のようなコート゛を作成し、 アクティブシートのA列の最終行までを取得し、一つにまとめたいのですが 「Dim myStr(200) As String」の部分で 最終行を取得することは不可能でしょうか? 今回は200行なので大丈夫なのですが 場合によっては1行~65536行までさまざまです。 なので Dim myStr(Cells(Rows.Count, 1).End(xlUp).Row) As String としたらエラーになりました。 最初から Dim myStr(65536) As String とするべきでしょうか? しかしそうすると myStrの最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- 最終列の列番号を列文字に変換することはできますか?
例えばaaaがある列を探し、その列番号は4で列文字がDですが、 列番号から列文字をvbaで取得する方法はありますか? Sub Sample() Dim i As Long Dim Colmoji As String i = Rows(1).Find(What:="aaa", LookAt:=xlWhole).Column Colmoji = i 'ここで列文字に変換したい MsgBox i & "の列文字は" & Colmoji & "です" End Sub このようなコードを作ってみたのですが列文字に変換する方法がわかりません。
- ベストアンサー
- オフィス系ソフト
- 二つの違い・どちらを使った方がいいでしょうか?
Sub test1() Dim a As String a = MsgBox("aaa") End Sub Sub test2() MsgBox "aaa" End Sub どちらもメッセージを表示させられるのですが コードを書く際はどちらを使った方がいいのでしょうか? 独学のためよくわかりません。 宜しくお願いいたします。
- ベストアンサー
- Visual Basic
お礼
ご回答ありがとうございます。 仰る通りよくよく考えればconstで定数を宣言するのであれば、配列で宣言してしまえば済む話でした。 ありがとうございました。