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

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

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

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

Access

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

関数

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

Q&A

解決済

1回答

7881閲覧

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

nekomura

総合スコア132

VBA

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

Access

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

関数

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

0グッド

0クリップ

投稿2016/06/15 11:26

編集2016/06/15 11:29

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

赤楕円部分がコンボボックス「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月から始まり、⑥までに一月ずつ加算された値を出したいです。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

VBA

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

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

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


追記

VBA

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

投稿2016/06/15 12:33

編集2016/06/16 02:16
kaz.Suenaga

総合スコア2037

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

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

nekomura

2016/06/16 01:22 編集

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表示になっているだけかもしれませんが…) 重ね重ねのお願いでまことに恐縮ですが、今一度この問題を解決できるテクニックをご教示いただけないでしょうか。 どうぞよろしくお願いいたします。
kaz.Suenaga

2016/06/16 01:35

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

2016/06/16 01:41

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

2016/06/16 01:48

ん、0 1 ですか? となると Me!cmb期.Value が 0 で、 CLng(Me!cmb期.Value) が 1 となっちゃいますね。。。 コンボボックスから想定通りに値が渡っていないのではないでしょうか。
nekomura

2016/06/16 02:11 編集

suenaga様 ご返答ありがとうございます。 Me!cmb期.Valueのみをイミディウェイトに出すと「01」でした。 これはConstでも指定している文字列の「01」のことですよね? ingStart(CLng(Me!cmb期.Value))のみをイミディエイトすると、suenaga様のおっしゃるとおり「1」が出力されました。 この結果では、良くないという事…ですよね? ご返答に理解が付いていかず申し訳ないです。 >コンボボックスから想定通りに値が渡っていない となると、どのように解決すればよいのでしょうか… 物分りが悪くてご面倒をおかけして大変恐縮ですが、出力結果などを元にもし何かお分かりになりそうでしたらご教示いただけますか。 すみません。。。。。。
kaz.Suenaga

2016/06/16 02:14

Me!cmb期.Value が "01" の時、 CLng(Me!cmb期.Value) の結果は 1 なはずなので、lngStart = 1 となるはず、ということで、 > Me!cmb期.Valueのみをイミディウェイトに出しても、「01」ですが、 > これはConstでも指定している文字列の「01」のことですよね? > ingStartのみをイミディエイトすると、「1」が出力されました。 であればOKですね。 ちょっとややこしくなってきたので、回答に追記して ORの件とかを修正したものを書きますね。
kaz.Suenaga

2016/06/16 02:17

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

2016/06/16 02:31

Suenaga様 ご回答ありがとうございます。 また、or句の正しいテクニックのご教示に感謝いたします! lngStartの値は、コンボボックスの選択に応じて問題なく1,7がイミディエイトに出力されました!! 依然、ラベルへの反映はコンボボックス1の場合、7の場合共に0~5月の表示のままです…。 ラベル名は、label月_1 ~ label月_6です。 何が良くないのでしょうか…. デザインビューなどを見返したり、ご教示のコードを見ているのですが なかなか原因が突き止められません。。。
kaz.Suenaga

2016/06/16 02:37

んー、だとすると全体的な動きはあってそうなので、ラベルに代入する値の部分で何か間違っているかもしれませんね。 Forms![メインフォーム名]![サブフォーム名].Form.Controls("label月_" & CStr(i+1)).Caption = CStr(lngStart + i) & "月" この部分の、 CStr(lngStart + i) & "月" が代入される値です。 何をやっているかというと、初期値+ループ変数を文字列型化しているだけです。 0~5月になる、ということは、上記の lngStart が0となっているということなので、変数名が間違っているとか、そういうことではないでしょうか。
jawa

2016/06/16 02:51

横から失礼します。 回答へのコメントのところどころにingStartという変数名も見えていますので、 ``` lngStart = CLng(Me!cmb期.Value) ``` で格納している変数か ``` ~.Caption = CStr(lngStart + i) & "月" ``` でキャプションにセットしている変数のどちらかで変数名を間違えているのではないでしょうか。 宣言していない変数を使用できないよう、行頭に ``` option explicit ``` を記述することをお勧めします。
nekomura

2016/06/16 03:00

jawa様 いつもお世話になっております。 >回答へのコメントのところどころにingStartという変数名も見えていますので、 ``` lngStart = CLng(Me!cmb期.Value) ``` で格納している変数か ``` ~.Caption = CStr(lngStart + i) & "月" ``` でキャプションにセットしている変数のどちらかで変数名を間違えているのではないでしょうか。 まさに…その通りでございました。 お気づきになってくださり感謝です! こういった細かいところに目を配れるように早くならないとだめだなあと、痛感しております。 option explicit!そうですよね、勉強では学んでいたのに、実際になると焦ってすぐにそういったテクニックを失念するところ、早く改善していきたいです。 無事に解決いたしました。 コメントをくださりありがとうございました!!
nekomura

2016/06/16 03:03

Suenaga様 ご指摘のとおり、最終的には変数間違いでした。 lngStart の、頭文字ミス…というなんともお粗末な結果で。。。 細部の書き方のテクニック、全体の動きのロジックなど今回も大変ためになるご回答に感謝です。 また、問題解決するまで私のつたない質問にお応えくださったことに感謝いたします。 無事に解決して、とてもうれしいです。 ありがとうございました!
nekomura

2016/06/16 03:06

suenaga様 今、参考URLを拝見しました。 何から何まで本当に感謝です。 データベースまで!感激です。。。(涙) これから昼休みなのでじっくり見たりいじったりしてみます! いつもありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問