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

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

ただいまの
回答率

90.51%

  • VBA

    2296questions

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

  • Access

    589questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

  • 関数

    258questions

    関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,589

nekomura

score 124

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

赤楕円部分がコンボボックス「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 10:18 編集

    Suenaga様
    月が、ラベルに順番に表示されました!
    さすがです、ありがとうございます。
    ただ、少しまだ解決できない問題があるので二点、追記で質問をさせてください。

    ・一点目
    ラベルに反映される月が、0月からスタートされてしまいます。
    また、テストとして定数を一つずつ実行したところ、H1,H2のとき共に0~5月になります。

    ・二点目
     If Me!cmb期.Value In (H1,H2) Then
    この部分ですが、Inが使えない?ようでコンパイルエラーになります。
    エラー内容は「実行時エラー451
    Property Let プロシージャが定義されておらず、Property Getプロシージャから
    オブジェクトが返されませんでした。」でした。
    Inをやめて、Orにしてみたところ(括弧有り,無し共に)、初めのH1の場合にしか反映されません。
    これは、Ifelse文などで二回同じ処理を書くしかないのかなと思い、試したところ
    H7の場合も0~5月表示となってしまいました。(これは、一点目の質問にあるように、どちらも0~5表示になっているだけかもしれませんが…)

    重ね重ねのお願いでまことに恐縮ですが、今一度この問題を解決できるテクニックをご教示いただけないでしょうか。
    どうぞよろしくお願いいたします。

    キャンセル

  • 2016/06/16 10:35

    んー、そうすると
    lngStart = CLng(Me!cmb期.Value)
    がうまく機能していなそうですね。
    その下の行に
    Debug.Print Me!cmb期.Value, lngStart
    としてみてイミディエイトにどう表示されるか確認してみてもらえますか。

    キャンセル

  • 2016/06/16 10:41

    suenaga様
    早々のご回答に感謝いたします。
    イミディエイトには、「01」と表記されています。。。。
    よろしくお願いいたします。

    キャンセル

  • 2016/06/16 10:48

    ん、0 1 ですか?
    となると Me!cmb期.Value が 0 で、 CLng(Me!cmb期.Value) が 1 となっちゃいますね。。。

    コンボボックスから想定通りに値が渡っていないのではないでしょうか。

    キャンセル

  • 2016/06/16 11:10 編集

    suenaga様
    ご返答ありがとうございます。

    Me!cmb期.Valueのみをイミディウェイトに出すと「01」でした。
    これはConstでも指定している文字列の「01」のことですよね?
    ingStart(CLng(Me!cmb期.Value))のみをイミディエイトすると、suenaga様のおっしゃるとおり「1」が出力されました。
    この結果では、良くないという事…ですよね?
    ご返答に理解が付いていかず申し訳ないです。

    >コンボボックスから想定通りに値が渡っていない
    となると、どのように解決すればよいのでしょうか…
    物分りが悪くてご面倒をおかけして大変恐縮ですが、出力結果などを元にもし何かお分かりになりそうでしたらご教示いただけますか。
    すみません。。。。。。

    キャンセル

  • 2016/06/16 11:14

    Me!cmb期.Value が "01" の時、 CLng(Me!cmb期.Value) の結果は 1 なはずなので、lngStart = 1 となるはず、ということで、

    > Me!cmb期.Valueのみをイミディウェイトに出しても、「01」ですが、
    > これはConstでも指定している文字列の「01」のことですよね?
    > ingStartのみをイミディエイトすると、「1」が出力されました。

    であればOKですね。

    ちょっとややこしくなってきたので、回答に追記して ORの件とかを修正したものを書きますね。

    キャンセル

  • 2016/06/16 11:17

    追記しました。

    ・IN を OR に書き換えました。もしかするとここの書き方が違ってませんか。

    キャンセル

  • 2016/06/16 11:31

    Suenaga様
    ご回答ありがとうございます。
    また、or句の正しいテクニックのご教示に感謝いたします!
    lngStartの値は、コンボボックスの選択に応じて問題なく1,7がイミディエイトに出力されました!!

    依然、ラベルへの反映はコンボボックス1の場合、7の場合共に0~5月の表示のままです…。
    ラベル名は、label月_1 ~ label月_6です。
    何が良くないのでしょうか….
    デザインビューなどを見返したり、ご教示のコードを見ているのですが
    なかなか原因が突き止められません。。。



    キャンセル

  • 2016/06/16 11:37

    んー、だとすると全体的な動きはあってそうなので、ラベルに代入する値の部分で何か間違っているかもしれませんね。

    Forms![メインフォーム名]![サブフォーム名].Form.Controls("label月_" & CStr(i+1)).Caption = CStr(lngStart + i) & "月"

    この部分の、 CStr(lngStart + i) & "月" が代入される値です。
    何をやっているかというと、初期値+ループ変数を文字列型化しているだけです。

    0~5月になる、ということは、上記の lngStart が0となっているということなので、変数名が間違っているとか、そういうことではないでしょうか。

    キャンセル

  • 2016/06/16 11:51

    横から失礼します。

    回答へのコメントのところどころにingStartという変数名も見えていますので、
    ```
    lngStart = CLng(Me!cmb期.Value)
    ```
    で格納している変数か
    ```
    ~.Caption = CStr(lngStart + i) & "月"
    ```
    でキャプションにセットしている変数のどちらかで変数名を間違えているのではないでしょうか。

    宣言していない変数を使用できないよう、行頭に
    ```
    option explicit
    ```
    を記述することをお勧めします。

    キャンセル

  • 2016/06/16 12:00

    jawa様
    いつもお世話になっております。
    >回答へのコメントのところどころにingStartという変数名も見えていますので、
    ```
    lngStart = CLng(Me!cmb期.Value)
    ```
    で格納している変数か
    ```
    ~.Caption = CStr(lngStart + i) & "月"
    ```
    でキャプションにセットしている変数のどちらかで変数名を間違えているのではないでしょうか。

    まさに…その通りでございました。
    お気づきになってくださり感謝です!
    こういった細かいところに目を配れるように早くならないとだめだなあと、痛感しております。
    option explicit!そうですよね、勉強では学んでいたのに、実際になると焦ってすぐにそういったテクニックを失念するところ、早く改善していきたいです。

    無事に解決いたしました。
    コメントをくださりありがとうございました!!

    キャンセル

  • 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を拝見しました。
    何から何まで本当に感謝です。

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

    キャンセル

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

  • VBA

    2296questions

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

  • Access

    589questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

  • 関数

    258questions

    関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。