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

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

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

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

Q&A

2回答

829閲覧

VBA モデルに当てはまる概念を作成するにはどうしたらよいですか。

King_of_Flies

総合スコア382

VBA

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

0グッド

0クリップ

投稿2018/03/06 00:49

VBAにて開発をしており、現在下記要件を満たしつつ、
定数を構造化(?)したいと考えております。

前提①
ある標準モジュール内でのみ使用される定数は、
その標準モジュール内で宣言する。

現在のコードの宣言部を一部を抜粋します。

VBA

1'メッセージ出力用文字列 2Private Const ERROR_MESSAGE_HOGE As String = "~が設定されていません。" 3Private Const INFO_MESSAGE_HOGE As String = "~が完了しました" 4'-- 略 5Private Const QUESTION_MESSAGE_HOGE As String = "~を出力しますか?" 6 7'セル番地の定義 8Private Const HOGESHEET_TITLE As String = "$B$2" 9Private Const HOGESHEET_HEADER_NO As String = "$C$3" 10Private Const HOGESHEET_HEADER_NAME AS String = "$D$3" 11'--略 12Private Const HUGESHEET_HEADER_SKILL As String = "$I$3" 13
  • やりたいこと

メッセージ出力用文字列のための定数と
セル番地の定義用文字列を構造体として持ち、
下記のような実装にしたい。

VBA

1Private Type MessageString 2 Const ERROR_MESSAGE_HOGE As String = "~が設定されていません。" 3 Const INFO_MESSAGE_HOGE As String = "~が完了しました" 4 Const QUESTION_MESSAGE_HOGE As String = "~を出力しますか?" 5End Type 6 7Private Type HogeSellAddress 8 Const TITLE As String = "$B$2" 9 Const HEADER_NO As String = "$C$3" 10 Const HEADER_NAME AS String = "$D$3" 11End Type 12 13Private Type HugeSellAddress 14 Const HEADER_SKILL As String = "$I$3" 15End Typr 16 17 18Private Sub setString() 19 Dim hogeSA As HogeSellAddress 20 HogeSheet.Range(hogeSA.TITLE).Value = "title" 21 22 Dim hugeSA As HugeSellAddress 23 HugeSheet.Range(hugeSA.HEADER_SKILL).Value = "skill" 24End Sub

上記、書くには書きましたが、実際にはConstの定義は構造体で持てないのか、
Dim hogeSA As HogeSellAddressの宣言直後に
hogeSAを入力し、ctr + spaceによる入力補完で候補の出力がされません。

Type内の宣言で定数以外(変数)を定義した場合は入力補完にて候補が出るため、
定数であることが要因でしょうが、このような記述をしたいと考えた場合は
どのような対処が必要でしょうか。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

VBE画面 > デバッグ > VBAProjectのコンパイル を実行してみてください。
提示の定義(Type内にConst)は不正として検出されます。

対応策としては以下の3点があげられるかと。
1.Typeを定義し、Typeを生成する関数を作成
2.クラスを定義し、プロパティで定義を返す
3.Constの変数名を、構造体っぽく書く(MESSAGE_HOGE_ERROR)

自分は今回のようなケースだと、3で対応してます。

また、アドレスについては、基本的には Enum で行・列番号を定義して使っています。

投稿2018/03/06 05:02

ExcelVBAer

総合スコア1175

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

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

退会済みユーザー

退会済みユーザー

2018/03/06 06:30

実務では私も3番を使うところですね。小難しくしてコーディング量を増やしても仕方ないですし。
jawa

2018/03/06 09:34 編集

「入力補完をしたい」というニーズがあるようですので、自分なら今回は2番にしそうです。 もしくはTypeで宣言だけしておいて初期化時に定数を代入するとか。
ExcelVBAer

2018/03/08 00:21

コメントありがとうございます! 人と状況によりけりですよねぇ
guest

0

クラスモジュールならそれっぽいことができるかな。

参考:ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ *Ateitexe

読み出し専用プロパティとして定義すれば、という感じです。

投稿2018/03/06 00:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問