Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8409 / 13646 ツリー ←次へ | 前へ→

【33430】スピンボタンでの年と月の増減 mickeypapa 06/1/11(水) 22:53 質問[未読]
【33433】Re:スピンボタンでの年と月の増減 かみちゃん 06/1/11(水) 23:17 発言[未読]
【33439】Re:スピンボタンでの年と月の増減 mickeypapa 06/1/12(木) 9:03 お礼[未読]
【33437】Re:スピンボタンでの年と月の増減 ichinose 06/1/12(木) 7:17 発言[未読]
【33441】Re:スピンボタンでの年と月の増減 mickeypapa 06/1/12(木) 9:13 お礼[未読]
【33443】Re:スピンボタンでの年と月の増減 ichinose 06/1/12(木) 10:13 発言[未読]
【33484】Re:スピンボタンでの年と月の増減 mickeypapa 06/1/12(木) 17:38 お礼[未読]

【33430】スピンボタンでの年と月の増減
質問  mickeypapa E-MAIL  - 06/1/11(水) 22:53 -

引用なし
パスワード
   TextBoxとSpinButtonをそれぞれ
年 Spin
月 Spin
の様に配置して、スピンボタンで
それぞれ年と月の増減をさせようと考え以下のように
コードを書いたのですが、どうも力業のような感じで
日付として増減するには他に方法があるように思えるのですが
ご教授宜しくお願いいたします。

Private Sub spin1_SpinDown()'--------年
  With txtYear
    .Value = Val(.Value) - 1
  End With
End Sub

Private Sub spin1_SpinUp()
  With txtYear
    .Value = Val(.Value) + 1
  End With
End Sub

Private Sub spin2_SpinDown()'--------月
  With txtMonth
    If .Value = 1 Then
      .Value = "12"
      txtYear.Value = Val(txtYear.Value) - 1
    Else
    .Value = Val(.Value) - 1
    End If
  End With
End Sub

Private Sub spin2_SpinUp()
  With txtMonth
    If .Value = 12 Then
      .Value = "1"
      txtYear.Value = Val(txtYear.Value) + 1
    Else
    .Value = Val(.Value) + 1
    End If
  End With
End Sub

Private Sub UserForm_Initialize()
'----------------3ヶ月前のデータより呼び出す
  txtYear = Format(DateAdd("M", -2, Date), "yyyy")
  txtMonth = Format(DateAdd("M", -2, Date), "M")
End Sub

【33433】Re:スピンボタンでの年と月の増減
発言  かみちゃん  - 06/1/11(水) 23:17 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>日付として増減するには他に方法があるように思えるのですが

どのようなことがなさりたいのかがわかりませんが、
私個人としては、素直なコードかと思います。
特にこれといった名案がないので、感想だけ書きました。

【33437】Re:スピンボタンでの年と月の増減
発言  ichinose  - 06/1/12(木) 7:17 -

引用なし
パスワード
   おはようございます。

>それぞれ年と月の増減をさせようと考え以下のように
>コードを書いたのですが、どうも力業のような感じで
コードを少しでも少なくしたいと言うことでしたら
使用可能なプロパティを活用する方法もあります。

新規ブックのユーザ―フォーム(Userform1)に

  Textbox1---年入力表示用(西暦)
  SpinButton1---Textbox1の値の上下の変更用
  Textbox2---月入力表示用(1〜12)
  SpinButton2---Textbox2の値の上下の変更用

を配置してください。
コントロールのプロパティは既定値のままで変更しないで下さい。
他には、Sheet1というシート名を持つシートのセルA1とA2を使用します。

上記のUserform1のモジュールに

'=================================================================
Private Sub SpinButton1_Change()
  TextBox1.Value = SpinButton1.Value
End Sub
'=================================================================
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
  With TextBox1
    Cancel = True
    If IsNumeric(.Text) Then
     If Val(.Text) >= 1900 And Val(.Text) <= 9999 Then
       Cancel = False
       End If
     End If
    End With
End Sub
'=================================================================
Private Sub SpinButton2_Change()
  TextBox2.Value = SpinButton2.Value
End Sub
'=================================================================
Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
  With TextBox2
    Cancel = True
    If IsNumeric(.Text) Then
     If Val(.Text) >= 1 And Val(.Text) <= 12 Then
       Cancel = False
       End If
     End If
    End With
End Sub
'=================================================================
Private Sub UserForm_Initialize()
  With Worksheets("sheet1")
    .Range("a1").Value = Year(Date)
    .Range("a2").Value = Month(Date)
    End With
  With SpinButton1
    .Max = 9999
    .Min = 1900
    .ControlSource = "=sheet1!a1"
    End With
  TextBox1.ControlSource = "=sheet1!a1"
  TextBox2.ControlSource = "=sheet1!a2"
  With SpinButton2
    .Max = 12
    .Min = 1
    .ControlSource = "=sheet1!a2"
    End With
End Sub

これでUserform1を表示させて試してみて下さい。


尚、UserForm_Initializeイベントで記述しているコードは、
事前にプロパティ設定が可能です。
が、結構スピンボタンのControlSourceの指定に苦慮しました。
ControlSourceに指定するセルの値が
Min、Maxプロパティの範囲を逸脱した値が入っていたりすると
ControlSourceが指定できないので注意して下さい。

コツとしては、UserForm_Initializeで
コードで設定している順序でプロパティを設定することです。

試してみて下さい。

【33439】Re:スピンボタンでの年と月の増減
お礼  mickeypapa E-MAIL  - 06/1/12(木) 9:03 -

引用なし
パスワード
   ▼かみちゃん さん:
有り難うございます。Spinのコントロールを
DateAddを使って出来ないものかなと考えていました。
そうすれば、If文で月が12から1になったときに
年を−1するような事をしなくても済むかなと
思っていたものですから、どうも有り難うございました。

【33441】Re:スピンボタンでの年と月の増減
お礼  mickeypapa E-MAIL  - 06/1/12(木) 9:13 -

引用なし
パスワード
   ▼ichinose さん:
こんにちは、有り難うございます。
コードを試させていただきました。
以下のような動作はSpinのコントロール
では無理なのでしょうか?
月の増減は循環しながら
月が12→1の時に年が増加
月が1→12の時に年が減少
と言うような動作を考えておりました。

【33443】Re:スピンボタンでの年と月の増減
発言  ichinose  - 06/1/12(木) 10:13 -

引用なし
パスワード
   ▼mickeypapa さん:
>月の増減は循環しながら
>月が12→1の時に年が増加
>月が1→12の時に年が減少
>と言うような動作を考えておりました。
↑これを見過ごしていました。

新規ブックのユーザ―フォーム(Userform1)に

  Textbox1---年入力表示用(西暦)
  SpinButton1---Textbox1の値の上下の変更用
  Textbox2---月入力表示用(1〜12)
  SpinButton2---Textbox2の値の上下の変更用

を配置してください。
コントロールのプロパティは既定値のままで変更しないで下さい。
他には、Sheet1というシート名を持つシートのセルA1とA2を使用します。

上記のUserform1のモジュールに

とここまでは前回と同じで・・・・、

'================================================================
Private Sub SpinButton1_Change()
  TextBox1.Value = SpinButton1.Value
End Sub
'=================================================================
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
  With TextBox1
    Cancel = True
    If IsNumeric(.Text) Then
     If Val(.Text) >= 1900 And Val(.Text) <= 9999 Then
       SpinButton1.Value = TextBox1.Text
       Cancel = False
       End If
     End If
    End With
End Sub
'=================================================================
Private Sub SpinButton2_Change()
  If SpinButton2.Value = 13 Then
   SpinButton2.Value = 1
   With Worksheets("sheet1").Range("a1")
    .Value = .Value + 1
    TextBox1.Text = .Value
    End With
  ElseIf SpinButton2.Value = 0 Then
   SpinButton2.Value = 12
   With Worksheets("sheet1").Range("a1")
    .Value = .Value - 1
    TextBox1.Text = .Value
    End With
   End If
  TextBox2.Value = SpinButton2.Value
End Sub
'=================================================================
Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
  With TextBox2
    Cancel = True
    If IsNumeric(.Text) Then
     If Val(.Text) >= 1 And Val(.Text) <= 12 Then
       SpinButton2.Value = TextBox2.Text
       Cancel = False
       End If
     End If
    End With
End Sub
'=================================================================
Private Sub UserForm_Initialize()
  With Worksheets("sheet1")
    .Range("a1").Value = Year(Date)
    .Range("a2").Value = Month(Date)
    End With
  With SpinButton1
    .Max = 9999
    .Min = 1900
    .Value = Year(Date)
    End With
  With TextBox1
   .ControlSource = "=sheet1!a1"
   .Text = Year(Date)
   End With
  With TextBox2
   .ControlSource = "=sheet1!a2"
   .Text = Month(Date)
   End With
  With SpinButton2
    .Max = 13
    .Min = 0
    .Value = Month(Date)
    End With
End Sub

これで試してみてください。
でもこれだとそんなに元のコードと変わりませんか?

【33484】Re:スピンボタンでの年と月の増減
お礼  mickeypapa E-MAIL  - 06/1/12(木) 17:38 -

引用なし
パスワード
   ▼ichinose さん:
有り難うございます。Spinのコントロールの方法を
勉強させていただきました。MAXとMINの設定も
勉強になりました。今まで適当に+1000、-1000と入れていました。

8409 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free