Excel VBA質問箱 IV

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

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


8119 / 13645 ツリー ←次へ | 前へ→

【34991】日にちが経過しても数式が入るようにしたい クマ 06/2/17(金) 18:01 質問[未読]
【35006】Re:日にちが経過しても数式が入るようにし... [名前なし] 06/2/18(土) 2:54 発言[未読]
【35007】Re:日にちが経過しても数式が入るようにし... クマ 06/2/18(土) 10:43 発言[未読]
【35018】Re:日にちが経過しても数式が入るようにし... [名前なし] 06/2/18(土) 16:12 回答[未読]
【35062】Re:日にちが経過しても数式が入るようにし... クマ 06/2/20(月) 15:37 お礼[未読]
【35017】Re:日にちが経過しても数式が入るようにし... Kein 06/2/18(土) 14:01 発言[未読]

【34991】日にちが経過しても数式が入るようにした...
質問  クマ  - 06/2/17(金) 18:01 -

引用なし
パスワード
       B C D E F G H I J        
1      1  2  3  4  5  6  7  8  9
2  1/1
3  1/2
4  1/3
・  ・
・  ・
・  ・
・  ・
31  1/31
1日たつと
    B C D E F G H I J 
1      1  2  3  4  5  6  7  8  9
2  1/2
3  1/3
・  ・
30  1/31
31  2/1

このような予約表を作りsheet1をリストボックスに表示しています。セルに数式が入っています。1日たつと1/1の行がなくなり1/31のしたに2/1が表示されるようにしています。数式はC31にはsheet2C31を表示するようにしています。1/31が上に移動したとき、C31にsheet2C32、D31にsheet2D32・・・が入るようにしたいのですがどうすればいいでしょうか?

【35006】Re:日にちが経過しても数式が入るように...
発言  [名前なし]  - 06/2/18(土) 2:54 -

引用なし
パスワード
   ▼クマ さん:
>sheet1をリストボックスに表示しています。

なんのためにですか?


>セルに数式が入っています。

どのセルにどんな数式が入っているですか?


>1日たつと1/1の行がなくなり1/31のしたに2/1が表示されるようにしています。

どのような方法でですか?


>1/31が上に移動したとき、C31にsheet2C32、D31にsheet2D32・・・が入る
>ようにしたいのですがどうすればいいでしょうか?

今はどうしているのですか?

【35007】Re:日にちが経過しても数式が入るように...
発言  クマ  - 06/2/18(土) 10:43 -

引用なし
パスワード
   ▼[名前なし] さん:
>▼クマ さん:
>>sheet1をリストボックスに表示しています。
>
>なんのためにですか?
>予約表を作っていて、ユーザーフォームから内容を記入してもらいsheet2に入力するようにしています。sheet1には予約が入っているかいないかだけを表示し、予約が入っているところには、●が表示されます。これをリストボックスを使ってユーザーフォームに表示しています。
>
>>セルに数式が入っています。
>
>どのセルにどんな数式が入っているですか?
>IF(Sheet2!c31="","","●")
>
>>1日たつと1/1の行がなくなり1/31のしたに2/1が表示されるようにしています。
>
>どのような方法でですか?
>Private Sub Workbook_Open()
  Dim Ck As Variant
  Dim xDy As Date

  xDy = DateAdd("d", 29, Date)
  With Worksheets("Sheet1") '←処理対象のシートを指定する
   Ck = Application.Match(CLng(Date) - 1, .Range("B:B"), 0)
   If Not IsError(Ck) Then
     .Rows("2:" & Ck).Delete xlShiftUp
   End If
   With .Range("B65536").End(xlUp)
     If .Value < xDy Then
      .DataSeries xlColumns, xlChronological, , , xDy
     End If
     .EntireColumn.AutoFit
   End With
   .Activate
  End With
End Sub
>
>>1/31が上に移動したとき、C31にsheet2C32、D31にsheet2D32・・・が入る
>>ようにしたいのですがどうすればいいでしょうか?
>
>今はどうしているのですか?
考え中です・・・他にいい方法ありましたらよろしくお願いします。

【35017】Re:日にちが経過しても数式が入るように...
発言  Kein  - 06/2/18(土) 14:01 -

引用なし
パスワード
   まず細かいミスですが、A2に1/1を入力してフィルコピーすると、1/31は A32 に入る
はずですね ?
>1/31が上に移動したとき、C31にsheet2C32、D31にsheet2D32・・・
>が入るようにしたい
Sheet2 にも同じように日付を入れた列があるなら、VlookUp関数を使って日付が
一致した行のC,D列のデータを引っ張れるはずです。逆に考えると、Sheet2に日付が
なければ、データを入力してから数日経つと、どれがどの日のデータだったか忘れて
しまい、表組みした意味がなくなりますよね ?

【35018】Re:日にちが経過しても数式が入るように...
回答  [名前なし]  - 06/2/18(土) 16:12 -

引用なし
パスワード
   ▼クマ さん:
Sheet1の表の部分は数式だけで出来ると思います。
Sheet2の1行目が1/1として、

Sub Macro1()
  With Worksheets("Sheet1")
    .Range("B2").Formula = "=TODAY()"
    .Range("B3").Resize(30).Formula = "=B2+1"
    .Range("C2").Resize(31, 9).Formula = "=IF(OFFSET(Sheet2!C$1,DATEDIF(""1/1"",$B2,""D""),0)="""","""",""●"")"
  End With
End Sub

を実行すると、Sheet1に数式が入力されます。
実行した後はもうこのマクロは不要ですので削除してかまいません。
(念のために、マクロ実行前にブックを保存してください。)

Sheet1のB列最上部(B2)が今日の日付になり、B列に今日を基点として31日分の
日付が表示されます。C列以降にはB列の日付を基にSheet2のC1からOFFSETした
位置の値を参照する式が入力されます。そのため、Sheet1は必ず1行目の1/1から
抜けが無い状態に存在しなければいけません。(2/18なら49行目)

B2の =TODAY() のところを適当な日付に変えてみてください。
C列以降が自動で参照範囲(表示結果)が変わると思います。

=TODAY() により勝手にブックを開いた日に日付が変わるので、
Workbook_Openイベントのコードは不要になります。

【35062】Re:日にちが経過しても数式が入るように...
お礼  クマ  - 06/2/20(月) 15:37 -

引用なし
パスワード
   返事が遅れましたが、大変勉強になりました。またわからないことがあればよろしくお願いします。

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