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

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

ただいまの
回答率

89.69%

Access vba 「フォームコントロール」ラベルに、月を加算していきたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,649

nekomura

score 130

よろしくお願いいたします。
下記画像のようなフォームを作成しています。

赤楕円部分がコンボボックス「cmb期」。
中身は「01」と「07」の二つで、それぞれが年度の上期・下期を表しています。
オレンジ楕円部分は、ラベル「label月1~6」、コンボボックスの値に応じて半期分の月をそれぞれに入れたいと思っています。

・コンボボックスの値が「01」(上期)であれば下方にあるサブフォームのラベル6つを1月~6月に
・コンボボックスの値が「07」(下期)であれば、下方にあるサブフォームのラベル6つを7月~12月 に
イメージ説明

そこで、以下コードでコンボボックスの値に応じて、ラベルに希望の月を出力することは出来たのですが、

Private Sub cmb期_AfterUpdate()

Const H1 = "01"
Const H2 = "07"
    If Me!cmb期.Value = H1 Then
        Forms![メインフォーム名]![サブフォーム名].Form![label月_1].Caption = "1月"
    ElseIf Me!cmb期.Value = H2 Then
        Forms![メインフォーム名]![サブフォーム名].Form![label月_1].Caption = "7月"
    End If

End Sub


上記コードのように、上期ならば1月、2月、3月…、
下期ならば7月、8月、9月…、と、同じコードをずらずら書いていくのは成果物として見栄えが悪い為、関数や変数(例:m1~m6)を使って、①~⑥のラベルに月を加算していけるようなコードに仕上げたい
と思っています。

試行錯誤したところ、DateSerial関数やDateAdd関数などが当てはまりそうな気はしたのですが、
この場合どのように記述すればよいのか行き詰ってしまい、質問をさせていただくことにいたしました。
この関数を使用したものでも、また他の方法でも、皆様のお考えを伺いたく存じます。
また、ラベルに出力したい値は、「○月」のみです。
のラベルに1月または7月から始まり、⑥までに一月ずつ加算された値を出したいです。

サンプルコードなどございますとますます参考になります。
有職者の皆様、ご教示のほどよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

見た目は日付に紐付いているように見えますが、実際やっていることは数値の足し上げですよね。
つまり、初期値(1か7)に対して、+1、+2、と各ラベルにやっているのと変わらないのではないでしょうか。

Private Sub cmb期_AfterUpdate()
  Dim i As Long ' ループ変数
  Dim lngStart As Long ' 初期値

  Const H1 = "01"
  Const H2 = "07"

  If Me!cmb期.Value In (H1,H2) Then  ' 一応正しい選択肢なのかだけチェック
    lngStart = CLng(Me!cmb期.Value)
    For i = 0 to 5
       Forms![メインフォーム名]![サブフォーム名].Form.Controls("label月_" & CStr(i+1)).Caption = CStr(lngStart + i) & "月"    ' ラベルを変数を利用して指定、月を初期値+ループ変数として指定
    Next
  End If
End Sub

テストせず記憶で書いているのでどこか間違っているかもしれませんが、ラベル名が連番になっている前提で上記のようなコードでいいのではないでしょうか。

※ただし、初期値が8以降、つまり終わりまでの間に12月→1月という表示がある場合はそれを踏まえた書き方をする必要があります。13月にならないように。


 追記

Private Sub cmb期_AfterUpdate()
  Dim i As Long ' ループ変数
  Dim lngStart As Long ' 初期値

  Const H1 = "01"
  Const H2 = "07"

  If Me!cmb期.Value = H1 OR Me!cmb期.Value = H2 Then  ' 一応正しい選択肢なのかだけチェック
    lngStart = CLng(Me!cmb期.Value)   ' この時点で lngStart は 1 か 7なはず
    For i = 0 to 5
       Forms![メインフォーム名]![サブフォーム名].Form.Controls("label月_" & CStr(i+1)).Caption = CStr(lngStart + i) & "月"    ' ラベルを変数を利用して指定、月を初期値+ループ変数として指定
    Next
  End If
End Sub

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/16 12:03

    http://www.feedsoft.net/access/tips/tips66.html

    こういう設定で自動的にできるようになりますのでどうぞ。

    せっかくなのでおまけ。
    http://wp.kaz.bz/teratail/38109-1.mdb

    ついでに別解。サブフォーム側にラベル変更の処理をまとめておいてメイン側から実行。
    http://wp.kaz.bz/teratail/38109-2.mdb


    ご参考までによろしければどうぞ。

    キャンセル

  • 2016/06/16 12:03

    Suenaga様
    ご指摘のとおり、最終的には変数間違いでした。
    lngStart の、頭文字ミス…というなんともお粗末な結果で。。。

    細部の書き方のテクニック、全体の動きのロジックなど今回も大変ためになるご回答に感謝です。
    また、問題解決するまで私のつたない質問にお応えくださったことに感謝いたします。
    無事に解決して、とてもうれしいです。
    ありがとうございました!

    キャンセル

  • 2016/06/16 12:06

    suenaga様
    今、参考URLを拝見しました。
    何から何まで本当に感謝です。

    データベースまで!感激です。。。(涙)
    これから昼休みなのでじっくり見たりいじったりしてみます!
    いつもありがとうございます!

    キャンセル

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

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