今まで月に4時間へばりつかないといけなかった作業が40分で済む 0394デフォルトの名無しさん (アウアウエー Sa6a-rwsx)2021/04/25(日) 01:50:00.98ID:RbwSHn/Ua 可読性ゼロの複雑な関数書いて悦に入ってるヤツは無能 0395デフォルトの名無しさん (ワッチョイ 2cda-wusC)2021/04/25(日) 06:48:34.57ID:rqvjO/ad0 本当の地獄はこれから 0396デフォルトの名無しさん (ワッチョイ 3af0-3cD6)2021/04/25(日) 09:13:58.07ID:CqRWqB530 Sub 文字列から日付() ThisWorkbook.Worksheets("1").Activate With ActiveSheet Dim yy As Integer, mm As Integer, dd As Integer yy = Worksheets("1").Range("A1").Value mm = Worksheets("1").Range("B1").Value dd = Worksheets("1").Range("C1").Value Worksheets("1").Range("B2") = DateSerial(Year:=yy, Month:=mm, Day:=dd) End With End Sub
日付1から日付2までの期間のすべての日付をD1〜D999に表示したいのですが 初心者過ぎてむずかしいです 0400デフォルトの名無しさん (アウアウウー Sa08-wusC)2021/04/25(日) 10:15:36.34ID:eytlE9OXa>>399 閏年が大変だな 0401デフォルトの名無しさん (ワッチョイ 3af0-3cD6)2021/04/25(日) 10:23:41.87ID:CqRWqB530 D999としてますが実際はD7ぐらいしかつかわないので 閏年は考慮しなくても大丈夫です 0402デフォルトの名無しさん (ワッチョイ 1e01-K+SG)2021/04/25(日) 10:27:00.72ID:trooC9Gj0 注意 標準モジュールではなくお目当てのシートモジュールに記載すること Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1:C1")) Is Nothing Or Target.Cells.Count > 3 Then Exit Sub Application.EnableEvents = False Dim yy As Integer, mm As Integer, dd As Integer yy = Range("A1").Value mm = Range("B1").Value dd = Range("C1").Value Range("B2") = DateSerial(Year:=yy, Month:=mm, Day:=dd) Application.EnableEvents = True End Sub 0403デフォルトの名無しさん (ワッチョイ 1e01-K+SG)2021/04/25(日) 10:28:07.28ID:trooC9Gj0 あ、ごめんこれ違うわ 0404デフォルトの名無しさん (ワッチョイ 1e01-K+SG)2021/04/25(日) 10:32:09.85ID:trooC9Gj0 ユーザーフォームは経由は処理が面倒だしエクセルいま手元にないから検証が俺には無理だわ ただのシート経由ならまだ行けるけど 0405デフォルトの名無しさん (ワッチョイ 1e01-K+SG)2021/04/25(日) 10:36:16.85ID:trooC9Gj0 あとB2への処理がすでに日付と月の入力で重複しとるやん どうしろと 初心者ならユーザーフォームなんてクソ面倒なもの 使わないほうがいいと思うけど 0406デフォルトの名無しさん (ワッチョイ 245f-QM0T)2021/04/25(日) 10:39:05.26ID:4pLy3lS70>>399 とりあえずこんな感じかなあ 変数宣言は省略
日付1 = Datesirial(適当に) 日付2 = Datesirial(適当に)
For day = 日付1 To 日付2 R = R + 1 Cell(R , "D").Value = day Next d 0407デフォルトの名無しさん (ワッチョイ 245f-QM0T)2021/04/25(日) 10:40:46.57ID:4pLy3lS70 ↑ Next d × Next day ○ 0408デフォルトの名無しさん (ワッチョイ 1e01-K+SG)2021/04/25(日) 10:42:21.10ID:trooC9Gj0 For d = 日付1 To 日付2 R = R + 1 Cell(R , "D").Value = d Next d 0409デフォルトの名無しさん (ワッチョイ 1e01-K+SG)2021/04/25(日) 10:49:18.11ID:trooC9Gj0 修正
columns("d").clearcontents 日付1 = Datesirial(適当に) 日付2 = Datesirial(適当に) For d = 日付1 To 日付2 R = R + 1 Cells(R , "D").Value = d Next d 0410デフォルトの名無しさん (ワッチョイ 3af0-3cD6)2021/04/25(日) 10:58:25.82ID:CqRWqB530>>406 アドバイスありがとうございます! 初心者なのですが業務上ユーザーフォームを使わなければならなくて(泣 Private Sub Worksheet_Change(ByVal Target As Range) Dim 日付1 As Integer, 日付2 As Integer 日付1 = Datesirial(適当に) 日付2 = Datesirial(適当に)
For day = 日付1 To 日付2 R = R + 1 Cell(R , "D").Value = day Next d
↑ユーザーフォーム経由じゃなくても 上記のようなエクセル表を作りたいのですが 簡単な方法ありますか? 0413デフォルトの名無しさん (ワッチョイ 245f-QM0T)2021/04/25(日) 11:14:40.82ID:4pLy3lS70>>410 全部Long型で宣言しないと あとはこれも宣言する Dim day As Long Dim R As Long
そしてNext dayに直す 0414デフォルトの名無しさん (ワッチョイ 1e01-K+SG)2021/04/25(日) 11:16:40.69ID:trooC9Gj0 変数名がdayだとvbaの標準命令のday(シリアル値)とかぶるからエラー起こさない? 0415350 (アウアウウー Sa83-jiG2)2021/04/25(日) 11:25:35.70ID:kagSPvTda 予約語じゃなく関数名だから大丈夫じゃないかな ただ、関数を書いたときに頭文字が小文字になったり嫌だから避けるかな 0416デフォルトの名無しさん (ワッチョイ 245f-hDy1)2021/04/25(日) 11:39:20.76ID:4pLy3lS70>>414 あーそういう心配もあるのね 分かりやすく書いたつもりなんだけど 0417350 (アウアウウー Sa83-jiG2)2021/04/25(日) 11:40:49.20ID:kagSPvTda 試してみると、同一スコープ内だと Dim day As Long day = VBA.day(Now()) Debug.Print day のように関数名を修飾しないとでした 当たり前か 0418デフォルトの名無しさん (ワッチョイ 3af0-3cD6)2021/04/25(日) 12:09:23.12ID:CqRWqB530 Private Sub Worksheet_Change(ByVal Target As Range) Dim 日付1 As Long Integer, 日付2 As Integer 日付1 = Datesirial(適当に) 日付2 = Datesirial(適当に)
For day = 日付1 To 日付2 Dim R As Long
R = R + 1 Cell(R , "D").Value = day Next day
End Sub
こんな感じでしょうか? 0419デフォルトの名無しさん (アウアウウー Sa08-wusC)2021/04/25(日) 12:12:35.21ID:eytlE9OXa 変数に日付1とかやるならdayも日付でよくね 0420デフォルトの名無しさん (ワッチョイ 3af0-3cD6)2021/04/25(日) 12:36:35.37ID:CqRWqB530 Private Sub Worksheet_Change(ByVal Target As Range) Dim 日付1 As Long Integer, 日付2 As Integer 日付1 = Datesirial(適当に) 日付2 = Datesirial(適当に)
For day = 日付1 To 日付2 Dim R As Long
R = R + 1 Cell(R , "D").Value = day Next day
End Sub
Changeしたいシートに記述してみたんですけど構文エラーになりました 0421デフォルトの名無しさん (ワッチョイ 1e01-K+SG)2021/04/25(日) 12:41:57.46ID:trooC9Gj0 適当にってのは自分で好きな変数に書き換えろってことだぞ… あとapplication.enableevents=falseにしないと無限ループになるぞ 処理後はtrue あとdimをループの中に入れないで 詳しくはググって 0422デフォルトの名無しさん (ワッチョイ 1e01-K+SG)2021/04/25(日) 12:43:38.04ID:trooC9Gj0 あと If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub
こういうようなのを冒頭に入れないと、どこに何を入れても命令が実行されるから遅くなる 0423デフォルトの名無しさん (アウアウウー Sa83-jiG2)2021/04/25(日) 12:59:50.89ID:kagSPvTda 結果として上手くいっているのかもしれないけど、 R がループ内で宣言されていると、毎回初期化を期待しているみたいでイヤですね この場合、R の宣言はプロシジャの先頭にあるものとみなされるのだろうけど 0424デフォルトの名無しさん (ワッチョイ 3af0-3cD6)2021/04/25(日) 13:05:39.55ID:CqRWqB530 Private Sub Worksheet_Change(ByVal Target As Range) application.enableevents=false If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub Dim 日付1 As Long Integer, 日付2 As Integer 日付1 = Datesirial(Long) 日付2 = Datesirial(Long)
application.enableevents=true End Sub 0436デフォルトの名無しさん (ワッチョイ 1e01-K+SG)2021/04/25(日) 15:24:13.50ID:trooC9Gj0 間違えた Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1:C2")) Is Nothing Or Target.Cells.Count > 6 Then Exit Sub columns("d").clearcontents application.enableevents=false