
No.3ベストアンサー
- 回答日時:
Public 変数側の回答をしてこちら側にも、少し触れておきます。
たぶん、Static 変数と、Public 変数と同じことです。
具体例のない質問なので、お互いがお互いのイメージの中で語られることになって、実体のない応答になるのは仕方がないのですが、まず、スタイルにこだわる前に、エラーのないコードを作ることが第一番ですね。エラーの可能性がみえているのに、それを無視したコードは、いくら格好をつけても、ダメだということです。
>例えばほんの3つとか5つだけ……共通のデータがあった場合、その間で限定的に使える変数などの定義方法があったら便利……。
その共有データの内容にもよりますね。以前も、Function使用する共有変数という質問をみましたが、正直なところ、その回答群は、どれも満足したものがありません。せっかくだから、私は、滅多に使いませんが、三種類用意しておきますが、どれも中級以上のテクニックです。Classも構造体も、エラーが発生すると、変数は飛んでしまいます。実務では、CustomDocumentPropertyのみです。
'CustomDocumentProperty を利用する方法
'標準モジュール
Sub Auto_Open()
'起動時に設定
Dim ret As Variant
Dim dum As Variant
On Error GoTo ErrHandler
With ActiveWorkbook
ret = Application.InputBox("数値を入れてください。", "Input", Type:=1)
dum = .CustomDocumentProperties("MyData")
If VarType(ret) = vbBoolean Then Exit Sub
.CustomDocumentProperties("MyData").Value = ret
End With
Exit Sub
ErrHandler:
With ActiveWorkbook.CustomDocumentProperties
.Add Name:="MyData", _
LinkToContent:=False, _
Type:=msoPropertyTypeNumber, _
Value:=0 '数値型
End With
Resume Next
End Sub
Sub Test1()
MsgBox TestFunc(5)
End Sub
Function TestFunc(arg As Variant)
Dim var1 As Variant
var1 = ActiveWorkbook.CustomDocumentProperties("MyData")
If arg <> "" Then
TestFunc = var1 + arg
End If
End Function
'******
'Class のプロパティを使う方法
'*****
'標準モジュール
Public myClass As New Class1 '(実務では、プロシージャ内でオブジェクトを生成してください)
Sub Auto_Open()
myClass.myVal = 12
End Sub
Sub Test2()
MsgBox myClass.myVal
End Sub
'----
'Class1
Private propertyVal As Variant
Public Property Get myVal() As Variant
myVal = propertyVal
End Property
Public Property Let myVal(ByVal NewValue As Variant)
propertyVal = NewValue
End Property
'******
'構造体を使う方法
'******
Type strctPerson
Name As String
Family As String
AGE As Integer
Birth As Date
End Type
Dim psn As strctPerson
Sub TestStructure()
psn.AGE = 31
psn.Birth = #2/18/1980#
psn.Family = "Helten"
psn.Name = "London"
End Sub
Sub Test3()
MsgBox psn.Family & " " & psn.Name & " 年齢:" & psn.AGE
End Sub
ありがとうございます。とっても参考になりました。
>Classも構造体も、エラーが発生すると、変数は飛んでしまいます。実務では、CustomDocumentPropertyのみです。
何よりもこれが参考になりました。実務では、classも構造体も私の意図するような点では使わないということが分かりました。しかし、うまく使うと、これらには便利な点も多いですよね。使い分けが大切なんですね。ありがとうございました。これからも勉強したいと思います。
No.2
- 回答日時:
残念ながら私は、Excel VBAでpublicな変数(別プロシジャーからアクセスできる)を定義する方法を知りません。
あきらめて、非表示シートを作成してセル渡しにすることにしました。
引数渡しが素直な解だと思いますが往々にして渡す情報が増えてしまうので(まじめに設計していないのが悪いのですが)、共有メモリのようなイメージでセルを使うようにしました。
セルは確実な方法だと思います。
この回答への補足
ありがとうございます。
私もシートを非表示にしてセルに値を入れてマクロを組みました。ただ、どうも、これが悔しいんですよね。エレガントではなく。そう思って質問しました。でも、できないのは私の力不足でなく、そういうものだと分かっただけでも納得できます。ありがとうございます。
No.1
- 回答日時:
>その定義したsubやfunctionで有効です。
これが回答のすべてです。
フォームを呼び出しているということは、AAAというプロシージャを超えています。
もし、BBBでaという変数を使いたい場合は、パラメータとして渡すしかありません。
または、Staticではなく、Private変数またはPublic変数として使うかですね。
ちなみにパラメータで渡せば、質問されている内容はクリアできますよ。
この回答への補足
ありがとうございます。確かに、定義した範囲内がスコープですよね。
パラメータとして渡す場合、それが少数なら苦ではないのですが、たくさんあると、めんどくさくなってしまいます。そこで、例えばほんの3つとか5つだけのsubとかfunctionだけに使う共通のデータがあった場合、その間で限定的に使える変数などの定義方法があったら便利だなあ、と思って質問しました。やっぱりないんですよね。パラメーターで渡します。ユーザー定義の型を使うと渡すのもかなり楽になりますよね。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【HTML、VBScript】HTAアプリケ...
-
【VB6.0】 あるフォームから他...
-
パーソナルXLSBのfuctionを呼び...
-
VB6のFriendについて
-
【VB.NET】テキストボックスに...
-
エクセルVBAでテキストボッ...
-
VBA public変数はどのようなこ...
-
subsequentとnextの違いってな...
-
C#で複数のTextboxから検索して...
-
[Excel2000]auto_closeを止めさ...
-
チェックボックスを操作できな...
-
コンボボックスからテキストボ...
-
テキストボックスかラベル上の...
-
アクセスできない保護レベルエ...
-
C#のループでtextboxに値を入れ...
-
C言語のサフィックスについて
-
複数条件のオートフィルタ(VBA)
-
FlexGridで文字色を変更。
-
2次元配列のデータをファイルへ...
-
RichTextBoxで指定行の色を自動...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VB6.0】 あるフォームから他...
-
パーソナルXLSBのfuctionを呼び...
-
【HTML、VBScript】HTAアプリケ...
-
定数を構造体で・・・
-
プロシージャまたは関数の引数...
-
VB6の変数宣言について
-
VB6のFriendについて
-
引き渡したループ処理で変数がn...
-
Callで呼び出したプロシージャ...
-
excellvbaで
-
PL/SQLのプロシージャ間でカー...
-
ArrayListに格納したクラス内の...
-
文字列をINTEGER型に変換
-
変数の宣言はすべきでしょうか...
-
VBA subで戻り値指定するか宣言...
-
整数を二つ読み込み、それらの...
-
VB2010からPROCEDUREを実行でエ...
-
【VBScript】変数のスコープ
-
VB初心者の私に教えてください!
-
エクセルVBAでテキストボッ...
おすすめ情報