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

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

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

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

Q&A

解決済

4回答

4943閲覧

EXCEL VBA ニューザーフォームTxetBoxの値を使用して計算したい

masayone

総合スコア13

VBA

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

0グッド

0クリップ

投稿2018/08/15 04:33

編集2018/08/15 15:38

イメージ説明
ユーザーフォームの全体を貼付けます。
◆EXCEL 2016
質問事項

1)VBA ニューザーフォーム内でのn月後の日付計算について⓵自年月日を入力し「2018/08/01」⓶利用期間「3」入力(nケ月後)③至年月日「2018/10/31」と計算し表示させたい。
2)オプションボタンの初期設定(true)が再度選択しなければ反映してくれない
⓵入力中頻度の高いボタンのまま、変更時は都度変更していきたい。

以下のプログラムを設定しています

⓵ Private Sub txt自年月日_Change()
⓶ Dim org As String
③ Dim buf As String
④ Dim n As Long
⑤ With Me.txt自年月日
⑥ n = val(txt利用期間)
⑦ org = .Value
⑧ If Len(org) = 8 Then
⑨ buf = _Mid(org, 1, 4) & "/" &Mid(org, 5, 2) & "/" & Mid(org, 7, 2)
⑩ If IsDate(buf) = True Then
⑪ .Value = buf
⑫ txt至年月日.Text = DateAdd("m", 3, buf) - 1
⑬ End If ' IsDate
⑭ End If ' Len = 8
⑮ End With ' ActiveCell
⑯ End Sub
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
⑫ txt至年月日.Text = DateAdd("m", 3, buf) – 1の(”m”,3,buf)-1 数値「3」を
⑥ n = val(txt利用期間)の変数「n」を指定しても数値として反応しない、これを変数でクリアできないか悩んでいます。

ちなみにVarTypeメソッドで変数「n」を調べた所「文字列ではない」msgboxで確認できました
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
※一応解決できました。
内容入力順番にありました。
⓵自年月日 ⓶至年月日 ⓷利用期間 この場合 n = val(txt利用期間.Text)
の場合先に⓶至年月日が処理され「0」とみなされ計算されていました。
入力順を変更 ⓷→⓵で⓶が「n]を⓵を数値とし計算されました。
新たなご質問です
最初の入力順で、IF文で、「txt利用期間が空白であれば処理をせず、
入力があった場合に、
⑫ txt至年月日.Text = DateAdd("m", 3, buf) - 1を計算する。」
等を記載するにはどの様にすればいいのでしょうか?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
画像の貼付けをしましたが張り付ていますでしょうか?
宜しくお願い致します。

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

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

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

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

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

guest

回答4

0

ベストアンサー

masayone様の2018/08/16 02:13までのコメントを受けて
改めて回答します。

やりたいことは
「"利用者情報"というワークシートに
ユーザーフォームで入力した情報を記録したい」
といったところでしょうか。

そして、当初の質問内容は
①「ユーザーフォームのTextBoxの値を使用して計算したい」であり、
現在masayone様がひっかかっておられるのは
②「オプションボタンの初期化が思い通りに実現できない」
ということでよろしいでしょうか。

上記の推察を元に②について回答します。


「利用目的」というテキストボックスは
「その他」のためだけに用意されているように
思われるのですが、いかがでしょうか?

この推察が正しい場合、
オプションボタンの選択によって
テキストボックスの値を代入しなおすのは
余計な作業なので、
「登録」ボタン押下時
オプションボタン「その他」以外が選択されていて
テキストボックス「利用目的」に入力がある場合を
Exit Subで排除してはどうでしょう。

「利用目的」には常に
オプションボタンの状態を反映したいというのであれば、
以下の方法を参考にしてみてください。


ユーザーフォームを複数挿入されているかもしれませんが、
(貼り付けられた画像の)ユーザーフォーム内に
先の私の回答の初期化文を追記してください。

"駐車場入力Form"というのが、
件のユーザーフォームであると仮定するとこうなります。

VBA

1Private Sub 駐車場入力Form_initialize() '※これがForm名重複部分です 2 3 UserForm1.txt連番.Value = Worksheets("利用者情報").Range("A65536").End(xlUp) 4 UserForm1.Show 5 6 opt通勤.Value = True 7 利用目的.Text = "通勤" 8 9End Sub

追記部分は元の記述の前でも後ろでも構いません。

次に

最初の入力順で、IF文で、「txt利用期間が空白であれば処理をせず、
入力があった場合に、

を条件に加えた下記のサンプルコードを参考に
本文を書き換えてみてください。

VBA

1Private Sub opt通勤_Change() 2 3 If opt通勤.Value = True Then 4 利用目的.Text = "通勤" 5 End If 6 7End Sub 8 9Private Sub opt通学_Change() 10 11 If opt通学.Value = True Then 12 利用目的.Text = "通学" 13 End If 14 15End Sub 16 17Private Sub optその他_Change() 18 19 If optその他.Value = True Then 20 利用目的.Text = "その他" 21 End If 22 23End Sub 24 25Private Sub txt自年月日_Change() 26 27 Dim org As String 28 Dim buf As String 29 Dim n As Long 30 31 With Me.txt自年月日 32 n = Val(txt利用期間.Text) 33 org = .Value 34 35 If Len(org) = 8 Then 36 buf = Mid(org, 1, 4) & "/" & Mid(org, 5, 2) & "/" & Mid(org, 7, 2) 37 If IsDate(buf) = True Then 38 .Value = buf 39 If txt利用期間.Text <> "" Then '「txt利用期間」が空白でない場合 40 txt至年月日.Text = DateAdd("m", n, buf) - 1 41 End If 42 End If ' IsDate 43 End If ' Len = 8 44 45 End With ' ActiveCell 46 47End Sub 48 49Private Sub txt利用期間_Change() 50 51 Dim n As Long 52 n = Val(txt利用期間.Text) 53 54 txt至年月日.Text = DateAdd("m", n, txt自年月日.Text) - 1 55 56End Sub

ただしこの場合、
選択されたオプションボタンと
反映テキストボックスに矛盾がないか、
また、「その他」選択時に
任意テキスト入力がされているかを調べねばなりません。

「その他」選択時は自動入力された"その他"を
削除してから任意テキスト入力しなければならないので、
ユーザーにはやさしくないような気がします。


teratailの機能のひとつとして、
「表題と同じ問題にぶつかった方に向けて
トラブルシューティング法を示す」ことがあると思うので、
表題の問題がある程度解決したら一度解決済とし、
別問題は別問題として
新たに質問した方がよいのでないかと思います。

がんばってください。

投稿2018/08/15 22:22

3109

総合スコア80

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

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

masayone

2018/08/16 01:00

3109さん 沢山のご回答ありがとうございました。 質問を明確に目的を伝えきれず、お手数をお掛けしました。 3109さんの丁寧なご回答痛み入ります 今回のご指摘も肝に銘じ、切磋琢磨致します。 ご回答を参考に作り上げていきます。 ありがとうございました、3109さんをフォローさせて頂きます。 ※今回作成物は、シルバー人材センターへのボランティアで作成中のものです。
3109

2018/08/16 18:00

そうだったんですね。 作成物が完成して、作業の負担軽減になるといいですね。 私も勉強になりました。 ありがとうございました。
guest

0

画像貼り付いてますよ。

それでオプションボタンの意図がわかりました。

オプションボタン初期値

オプションボタンの初期値は
VBEのプロパティーウィンドウで
オプションボタンを選択して
ValueをFalseからTrueに変更しましょう。


ここからコメントに対しての回答になります。

①まずプロパティーウィンドウの「通勤」以外の"Value"が
"False"になっているか確認してください
(すべて"False"でもOK)
②次にオプションボタンの"(オブジェクト名)"が
それぞれ"opt通勤"、"opt通学"、"optその他"と入力され
紐づいているか確認してください
③下記の初期化プロシージャーを追加してみてください

VBA

1'ユーザーフォーム名はご自分でつけられたものを置換してください 2Private Sub UserForm_initialize() 3 4 opt通勤.Value = True 5 6 利用目的.Text = "通勤" 7 8End Sub 9 10Private Sub opt通勤_Change() 11 12 If opt通勤.Value = True Then 13 利用目的.Text = "通勤" '※Value:trueに変更してます。画面にも◎に黒 14 End If 15 16End Sub 17 18Private Sub opt通学_Change() 19 20 If opt通学.Value = True Then 21 利用目的.Text = "通学" 22 End If 23 24End Sub 25 26Private Sub optその他_Change() 27 28 If optその他.Value = True Then 29 利用目的.Text = "その他" 30 End If 31 32End Sub

これでいかがでしょうか?

投稿2018/08/15 11:49

編集2018/08/15 13:16
3109

総合スコア80

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

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

masayone

2018/08/15 12:31

3109さん早い回答ありがとうございます。 大変助かります。 ⓵先の日付の計算 IF文の作成 ⓶オプションボタンの件 ーーーーーーーーーーーーーーーーー Private Sub opt通勤_Change() If opt通勤.Value = True Then 利用目的 = "通勤"  ※Value:trueに変更してます。画面にも◎に黒 If opt通勤.Value = True Then 利用目的 = "通勤" End If End Sub ーーーーーーーーーーーーーー Private Sub opt通学_Change() If opt通学.Value = True Then 利用目的 = "通学" End If End Sub ーーーーーーーーーーーーーーー Private Sub optその他_Change() If optその他.Value = True Then 利用目的 = "その他" End If End Sub ーーーーーーーーーーーーーーーーーーー 登録ボタンに確認用MsgBox If 車両 = "" Then MsgBox "車両を選択してください。" Exit Sub End If ーーーーーーーーーーーーーーーーーーー 上記で登録時確認しているのですが、”選択してください”、再度オプションボタンをチェックしなおして、登録が出来る状態です。他に何か邪魔をする要因があるのでしょうか。
masayone

2018/08/15 12:36

(正)Private Sub opt通勤_Change() If opt通勤.Value = True Then  利用目的 = "通勤"  ※Value:trueに変更してます。画面にも◎に黒  End If End Sub 先のコメントでIf op通勤以下が重複記載して投稿してしまいました。 VBAには正を書いています。
3109

2018/08/15 13:09

コードで記述したいので、 回答を追記しました。
masayone

2018/08/15 15:23

3109さんありがとうございます。 ユーザーフォーム名を既に使用しているので「名前が適切でありません」のエラーが出ます オプションボタンはフレーム内に配置しています。 このフレームは5カ所あります。 別に使用しているのは ――――――――――――――――――――――― Private Sub cmd登録_Click() ーーー省略ーーーーー ‘“F1”はtxt氏名が代入されるカ所があるとA列に連番を表示 If Range("F1").Offset(1).Value = "" Then Range("F1").Offset(1).Value = txt連番.Value Else 'Range("F1").End(xlDown).Offset(1).Value = txt連番.Value End If Dim i As Integer i = 1 Do While Cells(i + 1, "F").Value <> "" Cells(i + 1, "A").Value = i i = i + 1 Loop ーーーー以下省略ーーーーー ――――――――――――――――――――――――――― Private Sub 駐車場入力Form_initialize() ※これがForm名重複部分です UserForm1.txt連番.Value = Worksheets("利用者情報").Range("A65536").End(xlUp) UserForm1.Show End Sub ――――――――――――――――――――――――― 部分々を切り抜きましたがこれで、説明になっていますでしょうか? Private Sub 駐車場入力Form_initialize() この中に登録していけばよいのでしょうか? VBA初心者で申し訳ありません。
masayone

2018/08/15 15:40

3109さんユーザーフォームの全体を貼付けました。 65歳のおじさんがVBAに挑戦しております。 宜しくお願い致します。
masayone

2018/08/15 17:13

追加です 利用目的等は変数として Option Explicit Private 性別 As String Private lastRow As Long Private 利用目的 As String Private 車両 As String Private 施設名 As String ーーーーーーーーーーーーーーーー このように変数の宣言をしております。 Private 施設場所 As String
guest

0

実現したいことは
下記のようなユーザーフォームの作成でしょうか?

ユーザーフォーム

VBA

1Private Sub txt自年月日_Change() 2 3 Dim org As String 4 Dim buf As String 5 Dim n As Long 6 7 With Me.txt自年月日 8 n = Val(txt利用期間.Text) 9 org = .Value 10 11 If Len(org) = 8 Then 12 'MID関数前のアンダースコアは不要だと思いますが 13 '今回は折り返しとして原文を活かしました 14 buf = _ 15 Mid(org, 1, 4) & "/" & Mid(org, 5, 2) & "/" & Mid(org, 7, 2) 16 If IsDate(buf) = True Then 17 .Value = buf '記述の順序を変えました 18 If txt利用期間.Text = "" Then '条件を追加しました 19 '「txt利用期間」が未入力の場合 20 txt至年月日.Text = buf 21 Else 22 txt至年月日.Text = DateAdd("m", n, buf) - 1 23 End If 24 End If ' IsDate 25 End If ' Len = 8 26 27 End With ' ActiveCell 28 29End Sub 30 31Private Sub txt利用期間_Change() 32 33 Dim n As Long 34 n = Val(txt利用期間.Text) 35 36 txt至年月日.Text = DateAdd("m", n, txt自年月日.Text) - 1 37 38End Sub

2)オプションボタンの初期設定(true)が再度選択しなければ反映してくれない

⓵入力中頻度の高いボタンのまま、変更時は都度変更していきたい。

こちらに関してはmasayone様の意図が
汲み取れませんでした。

投稿2018/08/15 11:28

3109

総合スコア80

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

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

0

txt利用期間 ってのがナニモノかわかりませんが、もしかして
n = val(txt利用期間.Text)
では。

投稿2018/08/15 04:51

y_waiwai

総合スコア87774

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

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

masayone

2018/08/15 11:41

y_waiwaiさん早速の回答ありがとうございました。 txt利用期間.Text Textbookです。 問題は入力順に起因していました。
masayone

2018/08/15 11:52

誤Textbook→正TextBoxでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問