• ベストアンサー

【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 結果は同じですが、中身が違います。 今後コードを作っていく上で どちらの方式の方が良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんにちは。 今後、どちらで作るというよりも、【1】と【2】は、目的によって違います。 ただ、圧倒的に、【1】の方が多いのは事実です。いわゆるサブルーチン化といいます。 【2】と比較すると、変数が壊れにくいので、安心して使えます。 【2】は、質問のコードの範囲内では、グローバル変数と呼べるかは別として、モジュール・レベルの変数としても、一度設定したら、その値を一定期間使い続けるようにして用います。 例えば、【2】は、URLコードを取得して、その後、そのURLを使いまわしするような場合に用います。しかしながら、Sub プロシージャ内で、エラーが発生しますと、せっかく、取得した変数の値も壊れてしまいますので、意外に、使い方には慎重を期することがあります。

AXWNPWQTPCI
質問者

お礼

どうもありがとうございました。

その他の回答 (2)

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.2

【1】は、MyStrが使えるのはtest2の中だけ。 【2】だと、どの関数からでもMyStrが使える。Book閉じるまで値を保持。 使用範囲・期間は限定できるよう、値の受け渡しは原則【1】で。 【2】のグローバル変数は、連続しない処理・・・ボタン押下1回目、2回目 とかで値を引き継ぐことも可能だけど、 そーいう理由がない限り、ゴミが残るし、可読性も下がる。 VBAはOption Explicit無しの人も多いから、グローバル変数は罠ダヨ。

AXWNPWQTPCI
質問者

お礼

変数の使える範囲や値を保持するかどうかが、変わってくるのですか。 このような情報が欲しかったです。 できるだけ【1】を使うようにします。ありがとうございました。

回答No.1

タイプも減ることだし、引数渡しでなくともイイのでは?

AXWNPWQTPCI
質問者

お礼

引数渡しとは、【1】の事でしょうか?

関連するQ&A

  • 参照渡しをする時は、渡される側は違う変数を使う?

    参照渡しをする時は、渡される側は違う変数を使うべきなのでしょうか? VBAのお勉強をしているのですが Sub test1() Dim mystr As String mystr = "a" Call test2(mystr) Call test3(mystr) End Sub Sub test2(ByRef mystr As String) MsgBox mystr End Sub Sub test3(ByRef mystr2 As String) MsgBox mystr2 End Sub この場合、test2とtest3ではどちらを使ったほうがいいのでしょうか? test3は、mystr2 というmystrとは違う変数を使っていますが、 test2は、test1のmystrと同じ変数を使っています。 test1と同じ変数を使おうが違う変数を使おうが どちらにしろ (ByRef 変数名 As String) で宣言するから、変わらないのでしょうか?

  • 変数の宣言(s As String)で良い理由

    vbaについてしつもんです。 標準モジュールで Option Explicit Dim s As String Sub test1() Call test2("qqq") End Sub Sub test2(s As String) MsgBox s End Sub としたのですが、もしかしてDim s As Stringって必要ないのでしょうか? あってもなくても動きます。 (s As String)があるからDim s As Stringは不要なのですか? だとしたら、(s As String)に dim や publicをつけなくて良い理由を教えてください。

  • 配列 変数の宣言 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の最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。

  • VBA 複数の文字のコードを一気に返すには

    Sub test1() Dim myStr As String myStr = "abc" Debug.Print Asc("a") Debug.Print Asc(myStr) End Sub このコードは、どちらも97が返るのですが、 myStrは3文字です。 3文字全ての文字コードを返すには、 Sub test2() Dim myStr As String myStr = "abc" Debug.Print Asc(Mid(myStr, 1, 1)) & Asc(Mid(myStr, 2, 1)) & Asc(Mid(myStr, 3, 1)) End Sub のようにするしかないのでしょうか?

  • 参照渡し(ByRef)

    参照渡しについてわからないのですが Option Explicit Dim buf As String Sub Sample1() buf = "aaa" Call Sample2("bbb") MsgBox buf End Sub Sub Sample2(ByRef a As String) a = "ccc" End Sub を実行すると、msgboxには、aaaが表示されますが、 途中のbbb,cccはどんな意味があるのでしょうか? また、 Sub Sample2(ByRef a As String) を Sub Sample2(a As String) にしてもコードは問題なく動きますが、 ByRefは役に立ってるのですか?

  • vbaでCountIf関数を使いたい(エクセル)

    A1セルにa-a-aがはいっています。 この場合aは3つですよね。 これをvbaで取得するコードを作っているのですがうまくできません。 Sub test() Dim myStr As String myStr = "a" MsgBox WorksheetFunction.CountIf(Cells(1, 1), "*" & myStr & "*") End Sub これをすると、なぜか1が返ってきます。 Aは3つあるのになぜ1が返るのでしょうか? A1にaaaaaを入れて実行しても1が返ります。

  • 「Xor」と「Or」の違い(vba)

    こんばんは。 よくわからないので教えてください。 Option Explicit Sub Xorのtest() Dim フルーツ As String フルーツ = "りんご" If フルーツ = "りんご" Xor フルーツ = "イチゴ" Then MsgBox フルーツ End If End Sub '**************************************** Sub Orのtest() Dim フルーツ As String フルーツ = "りんご" If フルーツ = "りんご" Or フルーツ = "イチゴ" Then MsgBox フルーツ End If End Sub 上記のコードなのですが どちらも結果は同じです。 「Xor」と「Or」の違いがよくわからないのですが 何が違うのでしょうか? 調べてみると「Xor」は「排他的理論和」だそうです。 よろしくお願いします。

  • 二つの違い・どちらを使った方がいいでしょうか?

    Sub test1() Dim a As String a = MsgBox("aaa") End Sub Sub test2() MsgBox "aaa" End Sub どちらもメッセージを表示させられるのですが コードを書く際はどちらを使った方がいいのでしょうか? 独学のためよくわかりません。 宜しくお願いいたします。

  • VBA 変数にアスタリスクが含んでるかどうか

    変数にアスタリスクが含んでるかどうかをIFステートメントで取得するには? Sub test() Dim mystr As String mystr = "*/" If mystr Like "*" Then MsgBox "mystrはアスタリスクを含んでます。" End If End Sub このようなことをしたい場合、 mystr = "*/" でも mystr = "/" でも、結局は*が、どの文字でも含まれると認識してしまいます。 変数にアスタリスクが含まれてるかどうかを判定する方法を教えてください。

  • VBA 100億になると#が自動で付く

    下記のコードを見てください。 Option Explicit Sub test1() Dim i As Long i = 1000000000 End Sub Sub test2() Dim i As Long i = 10000000000# End Sub test2の#は私が付けたものではありません。 test1より一つ多く0を付けたら勝手に付きました。 どうしてなのでしょう? 不思議です。

専門家に質問してみよう