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

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

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

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

Q&A

解決済

1回答

810閲覧

クラスで保持しているデータをフォームのテキストボックスに表示する方法

domiso

総合スコア1

VBA

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

0グッド

0クリップ

投稿2021/09/08 06:17

前提・実現したいこと

Access VBAにて売上管理システムの開発を行っています。
クラスで保持しているデータをフォームのテキストボックスに表示する方法について
ご教示頂きたく質問いたします。

該当のソースコード

'#クラス
private 受注番号_ as string
private 商品名_ as string
private 単価_ as long
private 数量_ as long
private 送料_ as long
private 売上日_ as date
private 納品日_ as date

Public Property Get 受注番号() As String
受注番号 = 受注番号_
End Property
Public Property Let 受注番号(ByVal s As String)
受注番号_ = s
End Property

・・・省略・・・

Public Property Get 送料() As long
送料 = 送料_
End Property
Public Property Let 送料(ByVal l As long)
送料_ = l
End Property

Public Property Get 納品日() As date
納品日 = 納品日_
End Property
Public Property Let 納品日(ByVal d As date)
納品日_ = d
End Property

該当のソースコード

'#フォーム
'フォームの設定値をクラスにセット
Dim 売上データ as New cls売上データ
with 売上データ
.受注番号 = フォーム.txt受注番号
.商品名 = フォーム.txt商品名
.単価 = clng(フォーム.txt単価.value)
.数量 = clng(フォーム.txt数量.value)
.送料 = clng(フォーム.txt送料.value)
.売上日 = Nz(フォーム.txt売上日.Value, vbEmpty)
.納品日 = Nz(フォーム.txt納品日.Value, vbEmpty)
end with

処理の流れ

以下のような処理を行います。
<検索>
①DBから取得したデータをクラスの各変数に設定
②クラスの各変数からデータを取得してフォーム上のテキストボックスに設定
<登録・更新>
③テキストボックスの値をクラスの各変数に設定
④クラスの各変数に設定したデータを使ってDBを更新

フォーム上で売上データを作成した時点では「送料」「納品日」は未入力を許容する仕様であるため、
当初はDBも「送料」「納品日」は空白で登録しようしました。
しかし、③のタイミングでデータ未入力場合にエラーが発生するため、「送料」には0を「納品日」には0:00:00を設定しています。

不明点

クラスの変数にデータを設定している時点で空白での登録は不可と考えています。
そのため、取得したデータを表示する時点で「0」「0:00:00」の場合は空白に置換しようと考えました。しかし、この場合、ユーザが意図して送料に「0」を設定した場合も空白で表示されてしまいます。
他に「全ての変数の型をStringにすれば回避できる」のではとも考えましたが、それではDBの型と不一致になるので却下しました。
いい方法があればご教示ください。

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

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

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

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

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

hex309

2021/09/08 07:41

「そのため、取得したデータを表示する時点で「0」「0:00:00」の場合は空白に置換しようと考えました。しかし、この場合、ユーザが意図して送料に「0」を設定した場合も空白で表示されてしまいます。」 ということですが、結局どうされたいのでしょうか?
domiso

2021/09/08 08:23

最終目的が不明確で申し訳ありません。 実現したいことは上記クラスを使用しつつ、フォーム上の「区分」「送料」を空白で表示させたいです。
hex309

2021/09/08 08:27

念の為確認ですが、『ユーザが意図して送料に「0」を設定した場合』も空白でよろしいのですか?
domiso

2021/09/08 08:32

『ユーザが意図して送料に「0」を設定した場合』は「0」と表示させたいです。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

Long型、Date型の変数は未入力という状態はありません。
宣言した時点で初期値が格納されます。
Longなら0、Dateなら0:00:00が初期値です。

未入力という状態を持たせたいなら、プロパティ変数をVariant型で宣言したらどうでしょう。
初期値はEmptyなので、未入力かどうかはIsEmpty関数で判定できます。
ただし、Variant型はどのようなデータ型でも代入できてしまうので Property Let で数値かどうか(日付かどうか)を判定するといいでしょう。

vba

1private 送料_ as Variant 2private 納品日_ as Variant 3 4Public Property Get 送料() As Variant 5 送料 = 送料_ 6End Property 7Public Property Let 送料(ByVal l As Variant) 8 If IsNumeric(l) Then 9 送料_ = CLng(l) 10 Else 11 MsgBox "Error: 数値でない" 12 End If 13End Property 14 15Public Property Get 納品日() As Variant 16納品日 = 納品日_ 17End Property 18Public Property Let 納品日(ByVal d As Variant) 19 If IsDate(d) Then 20 送料_ = CDate(l) 21 Else 22 MsgBox "Error: 日付でない" 23 End If 24End Property

他に「全ての変数の型をStringにすれば回避できる」のではとも考えましたが、それではDBの型と不一致になるので却下しました。

これに関しては、Variant型に数値を代入した場合は内部的に数値型となります。日付を代入するとDate型になります。下記のコードで確認できます。

vba

1Public Sub Test() 2 Dim l As Variant, d As Variant 3 4 l = CLng(1234) 5 Debug.Print TypeName(l) 'Long 6 7 d = CDate("2021/09/08") 8 Debug.Print TypeName(d) 'Date 9 10End Sub 11

投稿2021/09/08 12:13

編集2021/09/08 13:39
hatena19

総合スコア34075

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

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

domiso

2021/09/09 00:02

ありがとうございます。 variant型で定義して数値or日付のチェックを行えば実現できそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問