
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- Visual Basic(VBA) VBA。複数のChangeイベントをまとめる方法 2 2022/03/31 12:03
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数の宣言はすべきでしょうか...
-
PL/SQLのプロシージャ間でカー...
-
定数を構造体で・・・
-
プロシージャまたは関数の引数...
-
他のフォームから別のフォーム...
-
【VB.NET】テキストボックスに...
-
アクセスできない保護レベルエ...
-
VBA public変数はどのようなこ...
-
VBAでcallで呼び出したsubを終...
-
エクセルVBAでテキストボッ...
-
ピッ、ってアルファベットでど...
-
チェックボックスを操作できな...
-
C言語のサフィックスについて
-
VC++ (byte)(col & 0xFF) の意味
-
Googleシート「A1」でなくて「A...
-
GetNextWindowがDLLファイルUse...
-
レコードセットにnullの場合
-
VBAで入力数値について
-
テキストボックスかラベル上の...
-
xmlの値を配列に格納したいんで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLのプロシージャ間でカー...
-
パーソナルXLSBのfuctionを呼び...
-
【VB6.0】 あるフォームから他...
-
【HTML、VBScript】HTAアプリケ...
-
プロシージャまたは関数の引数...
-
定数を構造体で・・・
-
HTML + VBScript で Sleep でき...
-
変数の宣言はすべきでしょうか...
-
分割コンパイルの方法がわかり...
-
【VBScript】変数のスコープ
-
ExcelのVBA。Staticな変数について
-
整数を二つ読み込み、それらの...
-
関数の引数
-
変数を複数のモジュール間で共...
-
access2007 copyfile困っています
-
VB6のFriendについて
-
VB.NETのグラフィック描画で困...
-
引数
-
VB初心者の私に教えてください!
-
プロシージャを呼び出したプロ...
おすすめ情報