質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1317閲覧

クラス内プロパティへの数字(数値)の受け渡し方

moh1ee

総合スコア73

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/05/14 05:59

編集2017/05/14 06:21

###前提・実現したいこと
例として商品データ受け渡しのためにクラスを作成しました。
クラス内では商品名、数量、価格の3項目を保持します。

ユーザーがフォーム上のテキストボックスへ入力した情報をクラス内変数へ格納するのですが
値のチェックも行いたいと思っています。

クラスのメンバ変数へのアクセスはプロパティのLet、Getステートメントを通ります

###発生している問題
数量、価格など計算対象にもなる項目のメンバ変数の型について悩んでしまいました。
以下検討中のパターンです。個人的には【C】のパターンは無いかなと思っており
【A】か【B】のどちらかなのですが・・・
一般的な方法や、自分はこうしている等アドバイス頂けませんでしょうか?

前提:
Variant型は基本使用しない
クラスに受け渡し前の値の型は文字列型/VarType(TextBox1.Value) = 8(文字列型)より
チェック内容は数値であるか、有効範囲内の値であるか等

【A】
・メンバ変数、パラメータは文字列型で宣言
・プロパティ内で数値型へ変換その他チェックを全て行う
・クラス内外で計算に使用する際には都度、型変換して使用する

メリット:チェック内容の記述が1箇所で済む。
デメリット:計算には都度型変換が必要、数の項目を文字列として格納するのに違和感(自分だけかも)

【B】
・メンバ変数、パラメータは数値型で宣言する
・受け渡し前に数値として有効かだけをチェック(渡し時の型エラー予防)
・有効なら型変換してクラスへ格納、その他チェックをプロパティ内で行う

メリット:計算にそのまま使用できる、項目と型で違和感がない。
デメリット:クラスへ渡す前に都度、型のチェックが入る。チェック項目がクラスの内、外に分かれる。

【C】
・メンバ変数、パラメータは数値型で宣言する
・受け渡し前に全てのチェックを済ます
・クラスでは値を保持するだけ

メリット:計算にそのまま使用できる、項目と型で違和感がない。
デメリット:同じチェックの記述がが点在する、クラスの恩恵が薄い。

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

あくまで自分が実装するのであれば、ということで1つの案としてアドバイスさせていただきます。

まずクラス内でのメンバ変数の持ち方ですが、これは数値であるべき変数なら数値型で宣言します。

次にこのメンバ変数を参照するプロパティですが、Let/Getともに数値型で宣言します。
これは数値として扱われるべきプロパティが文字列型での受け渡しになるのは違和感があるからです。

最後に、テキストボックスへの入力値をプロパティにセットするために、もう1つLetを作成します。
文字列型を渡して、数値チェックをしながら数値型に変換するためのLetになります。

以下はチェックは行っていませんが簡単な例です。

クラスモジュール(Class1)

Private numX As Integer 'Xの格納用メンバ変数 'プロパティ:X Property Get X() As Integer X = numX End Property Property Let X(i As Integer) numX = i End Property '文字列型からの変換 Property Let strX(s As String) 'このサンプルでは数値チェックまではしていません numX = Val(s) End Property

呼び出し側

Sub Test Dim c As New Class1 '文字列で値をセット c.strX = "123" '数値で値を参照・代入 c.X = c.X * 2 Msgbox c.X '246が表示されます。 End Sub

投稿2017/05/15 07:31

編集2017/05/15 07:32
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moh1ee

2017/05/15 13:09

回答ありがとうございます。 変換用のLetを置くという発想はありませんでした。 クラス毎に持っても良いでしょうし、使用規模によっては変換用のクラスを持つのありかもしれませんね。 考えが広がりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問