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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 342

King_of_Flies

score 310

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

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

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

'メッセージ出力用文字列
Private Const ERROR_MESSAGE_HOGE As String = "~が設定されていません。"
Private Const INFO_MESSAGE_HOGE As String = "~が完了しました"
'-- 略
Private Const QUESTION_MESSAGE_HOGE As String  = "~を出力しますか?"

'セル番地の定義
Private Const HOGESHEET_TITLE As String  = "$B$2"
Private Const HOGESHEET_HEADER_NO As String = "$C$3"
Private Const HOGESHEET_HEADER_NAME AS String = "$D$3"
'--略
Private Const HUGESHEET_HEADER_SKILL As String = "$I$3"
  • やりたいこと
    メッセージ出力用文字列のための定数と
    セル番地の定義用文字列を構造体として持ち、
    下記のような実装にしたい。
Private Type MessageString
    Const ERROR_MESSAGE_HOGE As String = "~が設定されていません。"
    Const INFO_MESSAGE_HOGE As String = "~が完了しました"
    Const QUESTION_MESSAGE_HOGE As String  = "~を出力しますか?"
End Type

Private Type HogeSellAddress
    Const TITLE As String  = "$B$2"
    Const HEADER_NO As String = "$C$3"
    Const HEADER_NAME AS String = "$D$3"
End Type

Private Type HugeSellAddress
    Const HEADER_SKILL As String = "$I$3"
End Typr


Private Sub setString()
    Dim hogeSA As HogeSellAddress
    HogeSheet.Range(hogeSA.TITLE).Value = "title"

    Dim hugeSA As HugeSellAddress
    HugeSheet.Range(hugeSA.HEADER_SKILL).Value = "skill"
End Sub

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/06 15:30

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

    キャンセル

  • 2018/03/06 18:34 編集

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

    キャンセル

  • 2018/03/08 09:21

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る