Excel VBA質問箱 IV

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

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


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

【26776】実行ボタンの省略について mimi 05/7/17(日) 17:01 質問[未読]
【26777】Re:日付の自動生成について かみちゃん 05/7/17(日) 17:10 発言[未読]
【26796】Re:日付の自動生成について mimi 05/7/18(月) 15:57 質問[未読]
【26800】Re:日付の自動生成について ponpon 05/7/18(月) 17:36 回答[未読]
【26809】Re:日付の自動生成について かみちゃん 05/7/19(火) 1:04 回答[未読]
【26824】Re:日付の自動生成について ponpon 05/7/20(水) 0:00 発言[未読]
【26827】Re:日付の自動生成について かみちゃん 05/7/20(水) 0:28 回答[未読]
【26825】Re:日付の自動生成について mimi 05/7/20(水) 0:17 質問[未読]
【26826】Re:日付の自動生成について かみちゃん 05/7/20(水) 0:22 回答[未読]
【26856】Re:日付の自動生成について mimi 05/7/21(木) 14:04 お礼[未読]

【26776】実行ボタンの省略について
質問  mimi  - 05/7/17(日) 17:01 -

引用なし
パスワード
   お願いします。

A1に"年"、b1に"月"を入れ、実行すると自動的にA列に1ヶ月の日付が入力されるマクロを作りました。

これを実行操作をすること無く、年と月をセルに入力したら自動で日付が挿入されるにはどうすればよいでしょうか?


Sub smpmonthly()
Dim rg As Range
Dim rgall As Range
Dim themonth As Integer
Dim theyear As Integer
Dim days As Integer

Range("a4:a35").ClearContents
theyear = Range("a1")
themonth = Range("b1")

Set rg = Range("a4")
days = Day(DateSerial(theyear, themonth + 1, 1) - 1)
rg.Value = DateSerial(theyear, themonth, 1)

Set rgall = Range(rg, rg.Offset(days - 1, 0))
Range("a4").AutoFill Destination:=rgall, Type:=xlFillDays

Set rg = Nothing
Set rgall = Nothing

End Sub

【26777】Re:日付の自動生成について
発言  かみちゃん  - 05/7/17(日) 17:10 -

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

>A1に"年"、b1に"月"を入れ、実行すると自動的にA列に1ヶ月の日付が入力されるマクロを作りました。
>
>これを実行操作をすること無く、年と月をセルに入力したら自動で日付が挿入されるにはどうすればよいでしょうか?

計算式ではいけないのですか?
=DATE($A$1,$B$1,ROW()-3)
まぁ、うるう年や、大の月、小の月対応は必要ですが・・・

どうしても、VBAというのであれば、
Worksheet_Changeイベントでできます。

【26796】Re:日付の自動生成について
質問  mimi  - 05/7/18(月) 15:57 -

引用なし
パスワード
   >Worksheet_Changeイベントでできます。


ありがとうございます。
やってみましたが、うまくいきません。
何処が悪いでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rg As Range
Dim rgall As Range
Dim themonth As Integer
Dim theyear As Integer
Dim days As Integer

Range("a4:a35").ClearContents
theyear = Range("a1").Value
themonth = Range("b1").Value

Set rg = Range("a4")

days = Day(DateSerial(theyear, themonth + 1, 1) - 1)
rg.Value = DateSerial(theyear, themonth, 1)

Set rgall = Range(rg, rg.Offset(days - 1, 0))
Range("a4").AutoFill Destination:=rgall, Type:=xlFillDays

Set rg = Nothing
Set rgall = Nothing


End Sub

【26800】Re:日付の自動生成について
回答  ponpon  - 05/7/18(月) 17:36 -

引用なし
パスワード
   こんにちは。
標準モジュールに、Sub smpmonthly()
があるとして
シートモジュールに

Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
   If IsEmpty(.Value) Then Exit Sub
   If IsNumeric(.Value) = False Then Exit Sub
   If .Count > 1 Then Exit Sub
   If Not Application.Intersect(Target, Range("A1:B1")) Is Nothing Then
    Application.EnableEvents = False
     Call smpmonthly
    Application.EnableEvents = True
   End If
  End With
End Sub


で出来ると思います。
なお、A列4行以下の書式は、日付にする必要がありそうです。

【26809】Re:日付の自動生成について
回答  かみちゃん  - 05/7/19(火) 1:04 -

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

>やってみましたが、うまくいきません。

すでにponponさんから、レスがついていますが、標準モジュールのコードを使わず、
以下のコードをシートモジュールに置いて処理してみてください。

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim themonth As Integer
 Dim theyear As Integer
 Dim days As Integer
 
 With Target
  If IsEmpty(.Value) Then Exit Sub
  If Not IsNumeric(.Value) Then Exit Sub
  If .Count > 1 Then Exit Sub
 End With
 
 '入力セルがA1とB1の場合のみ処理する
 If Target.Address = Range("A1").Address Or _
  Target.Address = Range("B1").Address Then
  
  'A1とB1に数値が入力してあれば、処理する。
  If Range("A1").Value <> "" And Range("B1").Value <> "" And _
   IsNumeric(Range("A1").Value) And IsNumeric(Range("B1").Value) Then
    '前回の値をクリアする。
    Range("A4:A35").ClearContents
    '年のセル
    theyear = Range("A1").Value
    '月のセル
    themonth = Range("B1").Value
    '月の値が1〜12かをチェック(小数点だったときも反応してしまうが・・・)
    If themonth >= 1 And themonth <= 12 Then
     With Range("A4")
      '1ヶ月分の日付を生成する。
      For days = 1 To Day(DateSerial(theyear, themonth + 1, 1) - 1)
       .Offset(days - 1).Value = DateSerial(theyear, themonth, days)
      Next
     End With
    Else
     MsgBox "月の値は、1〜12を入力してください。"
     Range("B1").Select
    End If
  End If
  '以下、別にいらない機能
  If Target.Address = Range("A1").Address Then
   Range("B1").Select
  End If
  If Target.Address = Range("B1").Address Then
   Range("A1").Select
  End If
  'ここまで
 End If
End Sub

【26824】Re:日付の自動生成について
発言  ponpon  - 05/7/20(水) 0:00 -

引用なし
パスワード
   かみちゃんさん こんばんは。
よけいな事してすみませんでした。

別の板で忙しそうだったので・・・・

自分のコードは、数字の範囲とか入力の有無とかいろいろと足りないところが多く、
勉強になりました。

この場合、
Application.EnableEvents = False
Application.EnableEvents = Trueは、記述しなくてもいいのですか?

記述するとしたら、どこに入れるとよいのでしょう? 教えてください。

【26825】Re:日付の自動生成について
質問  mimi  - 05/7/20(水) 0:17 -

引用なし
パスワード
   いいえponponさん
いただいたマクロ、自分なりにアレンジしていたのですが
なかなか旨くいかず困っていました。
勉強になりました。

かみちゃんさんので解決しました。

ponponさん、かみちゃんさん 有難う御座います。
とても感謝しています。

かみちゃん さんへ
2点ほど質問があるのですが

1、'A1とB1に数値が入力してあれば、処理する。
  If Range("A1").Value <> "" And Range("B1").Value <> ""
  の <> "" はどの様な意味でしょうか?

2、今回出勤管理表のマクロを作成しました。
  シートモジュールを利用した場合、表をコピーして
  他のシートに貼り付けて利用することが出来なくなります。
  何か良い方法はあるでしょうか?


何卒、アドバイスをお願いいたします。

【26826】Re:日付の自動生成について
回答  かみちゃん  - 05/7/20(水) 0:22 -

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

>1、'A1とB1に数値が入力してあれば、処理する。
>  If Range("A1").Value <> "" And Range("B1").Value <> ""
>  の <> "" はどの様な意味でしょうか?

「<>」で「等しくない」を意味します。
""は、長さ0の文字列、空白を意味します。
といことで、「<>""」で「空白に等しくない」、「空白以外」となります。

>2、今回出勤管理表のマクロを作成しました。
>  シートモジュールを利用した場合、表をコピーして
>  他のシートに貼り付けて利用することが出来なくなります。

シートごとコピーするわけにはいかないのですか?
または、標準モジュールに置いて、シート上にコマンドボタンを置いて、標準モジュールのマクロを実行する
ように仕組みを変えるかです。
もっとも、最初に書きましたように、マクロを使わず計算式で対処するのが簡単かと思いますが・・・

【26827】Re:日付の自動生成について
回答  かみちゃん  - 05/7/20(水) 0:28 -

引用なし
パスワード
   ponponさん、おつかれさまです。かみちゃん です。

>別の板で忙しそうだったので・・・・

あら、ご覧になられてましたか。お騒がせしまして、すみませんでした。

>Application.EnableEvents = False
>Application.EnableEvents = Trueは、記述しなくてもいいのですか?

Worksheet_Changeが、A1のセルまたはB1のセルの値に何か入力されたときのみしか動かないようにしていますので、
EnableEvents プロパティで、イベントを制御する必要はないと思っています。
こちらで、動作確認済みですが、何か問題があれば、ぜひご指摘ください。

【26856】Re:日付の自動生成について
お礼  mimi  - 05/7/21(木) 14:04 -

引用なし
パスワード
   かみちゃん さん

ありがとうございました。
勉強になりました。

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