プロが教えるわが家の防犯対策術!

VBA マクロ超初心者です。仕事で作成しなくてはいけなくなったのですが、お手上げ状態です。
同僚で解る人もいるのですが、教えていただいているのですが、何度質問できなくて助けて下さい。
少し前にも同じような質問をしましたが、下記のプログラムを修正して教えていただけると助かります。
UserFormにテキストボックス【実行日】【有効期日】【有効期日周期】を作成し、実行日を入力したら有効期日周期の年によって有効期日が自動でテキストボックスに入力されるプログラムを作成したいです。
 
Private Sub 実行日_Enter()
Dim dt As Date
Dim dy As Date
Dim s As String

Me.実行日 = dt
Me.有効期日=dy

テキストボックスの実行日に[20200531]と入力したら[2020/05/31]と
変換できるプログラムを作りたい。のですが、

S = "20200531"
dt = CDate(Format(s, "####/##/##"))

のプログラムでもデバックが表示されてどこがわるいのかもわかりません。


If 有効期日周期.Value = "1年" Then
d = DateAdd("yyyy", 1, dt) ' 年
Me.有効期日 = d

End If

End Sub

色々ネットで検索したのですが、どの部分のプログラムを使えばいいのか
検討もつきません。
宜しくお願い致します。

A 回答 (5件)

質問内容をよく理解できてません(何年たっても初級者ですので)が、多分こういう事なのかな?と回答してみます。



Private Sub 実行日_Enter()
Dim dt As Date
Dim dy As Date
Dim s As String

'Me.実行日 = dt '変数に何も入れていないのですけど?
'Me.有効期日 = dy '上記同様

s = "20200531"
s = Format(CLng(s), "0000/00/00")

Me.実行日.Text = s

If 有効期日周期.Text = "1年" Then
dt = CDate(s)
dy = DateAdd("yyyy", 1, dt) ' 年
Me.有効期日.Text = CStr(dy)

End If

End Sub

もし違うようでしたらベテランさんの回答を待っててください。
    • good
    • 0
この回答へのお礼

めぐみんさん
ありがとうございました。
全然詳しいです!!

『'Me.実行日 = dt '変数に何も入れていないのですけど?
'Me.有効期日 = dy '上記同様             』
をdt = Me.実行日 に変えたら変数を入れたことになるのでしょうか?
(わからなくて、すみません。)
dt = Me.実行日にして実行したら、デバックがでて黄色になります。
dt = Me.実行日は、プログラムの中で実行日を入力する代わりに、dtをいれるのかと思っていました。(dt=実行日)

お礼日時:2020/05/31 20:54

Private Sub 実行日_Enter()


Dim dt As Date
Dim dy As Date
Dim s As String

Me.実行日 = dt
Me.有効期日=dy

テキストボックスの実行日に[20200531]と入力したら[2020/05/31]と
変換できるプログラムを作りたい。のですが、

S = "20200531"
dt = CDate(Format(s, "####/##/##"))

のプログラムでもデバックが表示されてどこがわるいのかもわかりません。


If Me.有効期日周期.Value = "1年" Then              <= 有効期日周期の前にMe.がありません。
d = DateAdd("yyyy", 1, dt) ' 年
Me.有効期日 = d

End If

End Sub
    • good
    • 0

こんばんは!



もう一つの質問の方に投稿しようと思ったのですが、
締め切り済みだったのでこちらに投稿します。

とりあえずやってみました
↓の画像のようなユーザーフォームになっているとします。
テキストボックス1~テキストボックス3のオブジェクト名はすべて左側のラベル名としています。

そして左側のような入力後 → コマンドボタンをクリックすると右側のようになるようにしています。

Private Sub CommandButton1_Click()
 Dim myY As Long, myM As Long, myD As Long
 Dim myDate As Date

  With 実行日
   myY = Left(.Value, 4)
   myM = Mid(.Value, 5, 2)
   myD = Right(.Value, 2)
   myDate = DateSerial(myY, myM, myD)
   .Value = myDate
  End With
   有効期日 = DateAdd("yyyy", Val(有効期日周期), myDate)
End Sub

※ 画像のように、テキストボックスの「有効期日周期」は単に数値のみの入力としています。

※ 今回も細かいエラー処理はしていません。
足りに「有効期日周期」が空白だとエラーになります。

※ CDate関数をお使いのようですが、
当方の認識ではシリアル値に変換可能な文字列だけがシリアル値に変換可能だと思っていますので、
単に数値の羅列ではシリアル値とは認識されないと思います。m(_ _)m
「VBA 作成中のプログラムを使って文」の回答画像3
    • good
    • 1

No.3です。



Cdate関数を使ってみました。
前回のコードよし少し簡単にできます。
↓に変更してみてください。

Private Sub CommandButton1_Click()
 Dim myDate As Date

  With 実行日
   myDate = CDate(Format(.Value, "0000/00/00"))
   .Value = myDate
  End With
   有効期日 = DateAdd("yyyy", Val(有効期日周期), myDate)
End Sub

これでも前回と同じ動きになると思います。m(_ _)m
    • good
    • 0
この回答へのお礼

tom04さん
回答ありがとうございます。
両方とも試しましたが、
myDate = CDate(Format(.Value, "0000/00/00")) ←がデバックが出て、【型が一致しません】とでます。20200601とエクセルにはこのまま
表示されて、もう一回enterをクリックすると、もう一行下に2020/6/1で
表示されます。
先に回答していただいた方は、
myM = Mid(.Value, 5, 2)←部分が黄色になります。そしてenterをもう一度クリックすると下に2020/6/1で表示されます。

お礼日時:2020/05/31 20:08

No.1のお礼に対して。



>dt = Me.実行日にして実行したら、デバックがでて黄色になります。

日付型と文字列では = で代入は不可能でしょう。

多分No.1を

Private Sub 実行日_Enter()
Dim dt As Date
Dim dy As Date
Dim s As String

s = Me.実行日.Text ' 文字列型で宣言した変数に文字列を入れる
s = Format(CLng(s), "0000/00/00")

If 有効期日周期.Text = "1年" Then
dt = CDate(s)
dy = DateAdd("yyyy", 1, dt) ' 年
Me.有効期日.Text = CStr(dy)

End If

End Sub

こんな感じじゃないのかな?
If文の意味(”1年")がこれであっているのであればですけど。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!