Propertyプロシージャの使い道

このQ&Aのポイント
  • Propertyプロシージャは設定値の保存だけではなく、プロパティの設定時にコードを実行させることが可能です。
  • 設定値の保存だけでよければ、Private変数を用意して設定値を保存するPublic関数を使用することもできます。
  • Propertyプロシージャを使う理由の一つは、読み取り専用のプロパティを作成できることです。
回答を見る
  • ベストアンサー

Propertyプロシージャの使い道

Excel VBAのPropertyプロシージャについてご質問します。 Propertyプロシージャはどういったときに使うものなのでしょうか? 解説本には設定値の保存だけではなく、プロパティの設定時にコードを実行させることが可能、とあります。 ですが、設定値の保存だけでよければ(コードは実行しない)、設定値を保存するPrivate変数を用意して、そこに設定するPublic関数を用意すれば事が足りる気がします。 また、いろんなサイトを見て回ると「読み取り専用のプロパティにもできる」とありますが、それだとどんな使い道があるのかというのがピンときません。 どのようなときにPropertyプロシージャを使うべきで、そうしたほうがいい理由を教えてください。 よろしくお願いします。

noname#224929
noname#224929

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

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.1

例えば、Seirekiプロパティに "20070312" をセットすると 西暦・和暦変換処理のコードを実行して Warekiプロパティに "平成19年 3月12日"をセットするといった使い方をします。 この時、Warekiプロパティを読取り専用のプロパティと にできます。 変数の受渡しに直接Public変数でなくプロパティを介する事で 実際に使用している変数名とは異なった解かり易いプロパティ 名を使える様になります。 また、無秩序に変数を追加・修正・削除できると、モジュール内 で使用している変数名等全てを把握していないとプログラムが 作れないといった事や、修正等で他のモジュールとの互換性を 保つのが難しくなります。

noname#224929
質問者

お礼

ご回答ありがとうございました。 No.2のお礼では失礼いたしました。 ご回答を拝見して、 Public関数もしくは変数では、どのモジュールで使用するものかわかりにくい(命名に気を使わねばならない)。 プロパティにすることで、どのモジュールのものかが明確になる。 という風に理解したのですが、よろしいでしょうか? もし違いましたら、ぜひご指摘をお願いいたします。 ありがとうございました。

その他の回答 (1)

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

直接変数に入力せずプロパティを介する事で、入力 チェックを行って、エラー値を排除できます。

noname#224929
質問者

お礼

ご回答ありがとうございます。 コードを実行できることから、確かにそういう利点がありそうですね。 ただ、それなら関数を介して変数を入力しても同じことができそうですし、 あえてPropertyプロシージャをつかう利点はなにでしょうか。 もしよろしければ補足いただけると幸いです。

noname#224929
質問者

補足

質問者です。 大変申し訳ありません。 No.2のご回答を先に読んでお礼を書いてしまったため、 重複した補足をお願いしてしまいました。 申し訳ございませんでした。

関連するQ&A

  • Excel97のVBAで、出てくるPublic(プロージャ)とPrivate(プロシージャ)の違い

    最近、ExcelのVBAを勉強してるのですが、そこで書籍の中に、 >《挿入》→《プロシージャ》を実行すると、 >作成するプロシージャがPublicかPrivateかを選択します。 >Privateにすると、そのプロシージャは >そのモジュール内でしか実行できません。 とあるのですが、「そのモジュール内でしか実行できません」っていうのがよくわからないのですけど、具体的にはどういった使い分けが出来るのでしょうか?

  • プロパティープロシージャーについて

    簡単な年齢計算プログラムです。 書籍のサンプルなのでうまく動いています。 クラスの変数がPrivate strnameだったりするので そこへアクセスするためにプロパティプロシージャーを使っているというところまでは 判ったような気がしますが、 getとsetの関係がわかりません。 まず、 1.何をGetしているのか 2.なぜGetが先に来るのか、 3.Setの前にGetのReturnで返してますが実態は何を返しているのでしょうか?普通に考えると逆のような気がします。 根本がわかっていないのだと思いますが、どなたかお教え願います。 呼ぶ方 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim person As New Class1() person.Name = TextBox1.Text person.Birthday = DateTimePicker1.Value.Date MessageBox.Show(person.Name & "さんの年齢は" & person.GetAge()) End Sub クラスの方。 Public Class Class1 Private strname As String Private datBirthday As Date Public Property Name() As String Get Return strname End Get Set(ByVal pro_name As String) strname = pro_name End Set End Property Public Property Birthday() As Date Get Return datBirthday End Get Set(ByVal pro_birthday As Date) datBirthday = pro_birthday End Set End Property Public Function GetAge() As Integer Return Int(DateTime.Today.Subtract(Birthday).Days / 365.25) End Function End Class

  • access VBA のprocedureについて

    access 2003 で作ったprocedure を2007で実行させるとうまく作動しない時があります。 フォームのデザイン画面上でプロパティからコードを表示させようとすると、新たなコードを作成することになり、まったく同じ名前のpurocedureが二つできてしまいます。多くの場合古いpurocedureを削除すれば問題は解決しますが、たまにすべてのprocedureに影響してしまうことがあります。 どうも最初に実行したprocedureに問題が発生するようなのですが、同じような経験をした方はいるでしょうか?

  • エクセルVBA イベントプロシージャに引数を渡せま

    お世話になります。 エクセル2003/XP 使用です。 イベントプロシージャに引数を渡せまるかどうか教えていただけますでしょうか? 下記のコード中の変数mysheetnameを ユーザーフォーム、→ CommandButton1のプロシージャに 引数として渡して行きたいのですが、 実行すると、一番最初のWorkbook_SheetBeforeRightClickの時点で、 コンパイルエラー:  プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。 とエラー表示されます。 イベントプロシージャに引数を渡すことはできますでしょうか? ---------- ThisWorkBook内 ---------- Public mysheetname As String Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) mysheetname = ActiveSheet.Name UserForm1.Show (mysheetname)     '←変数mysheetnameの値をユーザーフォームに渡したい。 End Sub ---------- ユーザーフォーム ---------- Private Sub UserForm_Initialize(ByVal mysheetname As String ) 処理 End Sub Private Sub CommandButton1_Click(ByVal mysheetname As String ) 処理 End Sub ’--------- ここまで 引数について少し理解し始めたばかりの者です。 よろしくお願いします。

  • Accessからoutlookのプロシージャー

    Accessからoutlookのプロシージャーを実行する方法は? AccessからExcelなら、エクセルに ************************ Sub エクセルマクロ() MsgBox "a" End Sub ************************ を作り、アクセス側で、 ************************ Private Sub AccessからExcel() Dim xlsWB As Object Set xlsWB = GetObject("D:\My Documents\up\エクセル.xls") xlsWB.Application.Run xlsWB.Name & "!エクセルマクロ" Set xlsWB = Nothing End Sub ************************ を実行すると、エクセル側のプロシージャーが実行されますが、 Accessからoutlookの場合は、どうすればいいでしょうか? Outlookの標準モジュールに、 ************************ Sub Outlookマクロ() MsgBox "a" End Sub を作っても、 アクセス側で、 Private Sub AccessからExcel() Dim xlsWB As Object Set xlsWB = GetObject("D:\My Documents\up\ ")‘ここをどうすればいいかわからない。 xlsWB.Application.Run xlsWB.Name & "! Outlookマクロ" Set xlsWB = Nothing End Sub ************************ と言うコードしか作れなくて、詰んでしまいます。 Accessからoutlookのプロシージャーを実行する方法をご教授ください。よろしくお願いします。

  • 元のプロシージャーを取得するプロパティ

    Sub test1() Call test2 End Sub Sub test2() If ?? Then MsgBox "test1から実行されたマクロです。" End If End Sub 上記のコードで どこから実行されたプロシージャ化を取得する方法はありますか? 現在は、 Dim bl_test1_yes As Boolean Sub test1() bl_test1_yes = True Call test2(bl_test1_yes) End Sub Sub test2(bl_test1_yes) If bl_test1_yes = True Then MsgBox "test1から実行されたマクロです。" End If End Sub としていますが、 元のプロシージャーを取得するプロパティがあれば教えてください。

  • Excel VBA onTime関数のプロシージャ引数に、引数(変数)つきのプロシージャを呼び出す方法を教えてください。

    現在ExcelVBAで一定時間ごとにメッセージを出すツールを作成しています。 その際にonTime関数を使っていますが、その引数のひとつである呼び出すプロシージャに「引数(変数)つきのプロシージャ」を設定しようとしています。 サイトを探してみたところ、引数にシングルクオーテーションで囲むなど書いてあったのですが、変数を引数としたプロシージャを設定すると、「プロシージャが見つかりません」のエラーがでます。 どなたかお力を貸してくれませんでしょうか。 ちなみに僕のコードは以下の通りです。(簡略化) ------フォーム Private Sub cmbOk_Click() Call メッセージ実行(txtTime.Text, txtContent.Text) End Sub ------ThisWorkbook Private Sub メッセージ実行(ByVal time As String, ByVal content As String) Dim starttime As Double MsgBox time & "毎に" & vbCr & content & vbCr & "を表示します。", vbInformation Unload frmSet starttime = Now + CDbl(TimeValue(time)) Application.OnTime starttime, "'expressContent" & time & content & "'" End Sub ------標準モジュール Dim starttime2 As Double Sub expressContent(ByVal time2 As String, ByVal content2 As String) MsgBox "content2", vbInformation starttime2 = Now + CDbl(TimeValue(time2)) Application.OnTime starttime2, "'expressContent" & time & content & "'" End Sub よろしくお願い致します。

  • subプロシージャーは標準モジュールではなくフォームのコードを書く部分

    subプロシージャーは標準モジュールではなくフォームのコードを書く部分に書いても問題ないのでしょうか? エクセルにVBAでフォームを挿入し、 「Private Sub UserForm_Initialize()」 などのフォームのモジュールに、 Sub test() MsgBox "あああ" End Sub という標準モジュールに書くべきのsubプロシージャーを書いてもなにもエラーにならないし正常に動きます。 subプロシージャーは標準モジュールではなくフォームのコードを書く部分に書いても問題ないのでしょうか? それともエラーにならなくても標準モジュールに書いた方がいいですか?

  • VBA プロシージャで値を渡す方法

    エクセルVBAのプロシージャで値を渡す方法はどうしたらいいのでしょうか。 たとえば、下記のようなプログラムを書いたとします。 --------------------------------------------- Private Sub test_main() Dim drink As String Dim alcohol As String Call test(cola, beer) End Sub Public Sub test_module(ByVal drink As String, ByVal alcohol As String) Cells(1, 1).Value = drink Cells(2, 2).Value = alcohol End Sub --------------------------------------------- このプログラムはもちろん不完全です。試してみたら動きませんでした。 やりたいことは、メインのプロシージャ(test_main)から、test_moduleを 呼び出し、同時に「cola」と「beer」の値を渡します。呼び出された先で、 エクセルのワークシートのセルに値を入力します。 重複しますが、それぞれの値「cola」と「beer」は変数「drink」と「alcohol」に代入されます。 この変数をcell(1,1)とcell(2,2)に入力します。 ワークシート上のcell(1,1)には「cola」、cell(2,2)には「beer」 と入力されます。 変数は数値ではなく、文字列です。 ポイントは、変数「drink」と「alcohol」をどのプロシージャに宣言するのか また、変数に値「cola」と「beer」をのどプロシージャでどういうふうに代入するのか。 そして代入した変数をどうやって呼び出したいプロシージャに渡すのかです。 このようなことをするには、上記プログラムをどう書き換えたらよいのでしょうか。

  • 関数やプロパティが載ってるサイト

    エクセルvba2003では使えなくて 2007では使える関数やプロパティが載ってるサイトを ご存知の方いらっしゃいますか?よろしくお願いします。

専門家に質問してみよう