歯抜けの日ごとのデータを0で保管する
```
DECLARE @testDate DATETIME = '2023-05-01';
select a.prod_date,case when b.qty is null then 0 else b.qty end as prod_qty FROM [testDB].[dbo].[cal_ori] a
left join [testDB].[dbo].[cal] b
on a.prod_date = b.prod_date
--where a.prod_date >= '2023-05-04' and a.prod_date <= '2023-05-31'
where a.prod_date >= DATEADD(day, 1, EOMONTH (@testDate , -1)) and a.prod_date <= EOMONTH(@testDate)
```
※カレンダーマスタに対して、歯抜けのテーブルをjoinして、存在しない日付の値を任意の値に、case分で変換する
FormのUnloadについて
POINT
vbModeless・・・閉じる処理をVBAから実行しても閉じれます。
vbModal・・・UserForm上に埋め込まれてるコントールからのみ、閉じる処理が可能
フォームから処理を実行して、自動終了するような場合は、vbModelessでFormを起動する必要がありあます。
'呼び出し元 Public Sub main() UserForm1.Show vbModeless Unload UserForm1 End Sub 'Formを開いて、MSGを出力しているだけ Private Sub UserForm_Initialize() MsgBox "init" 'ここでUnloadすると『オブジェクト変数または・・・』が発生 'デバック自体は通るけど、多分実際に実行されるのが、呼び出し元のEnd Subのタイミングで実行されるので、 '通っているように見えるんだと思われる。 ' Unload UserForm1 End Sub
FormのUnloadについて
POINT
vbModeless・・・閉じる処理をVBAから実行しても閉じれます。
vbModal・・・UserForm上に埋め込まれてるコントールからのみ、閉じる処理が可能
フォームから処理を実行して、自動終了するような場合は、vbModelessでFormを起動する必要がありあます。
'呼び出し元 Public Sub main() UserForm1.Show vbModeless Unload UserForm1 End Sub 'Formを開いて、MSGを出力しているだけ Private Sub UserForm_Initialize() MsgBox "init" 'ここでUnloadすると『オブジェクト変数または・・・』が発生 'デバック自体は通るけど、多分実際に実行されるのが、呼び出し元のEnd Subのタイミングで実行されるので、 '通っているように見えるんだと思われる。 ' Unload UserForm1 End Sub
FormのUnloadについて
POINT
vbModeless・・・閉じる処理をVBAから実行しても閉じれます。
vbModal・・・UserForm上に埋め込まれてるコントールからのみ、閉じる処理が可能
フォームから処理を実行して、自動終了するような場合は、vbModelessでFormを起動する必要がありあます。
'呼び出し元 Public Sub main() UserForm1.Show vbModeless Unload UserForm1 End Sub 'Formを開いて、MSGを出力しているだけ Private Sub UserForm_Initialize() MsgBox "init" 'ここでUnloadすると『オブジェクト変数または・・・』が発生 'デバック自体は通るけど、多分実際に実行されるのが、呼び出し元のEnd Subのタイミングで実行されるので、 '通っているように見えるんだと思われる。 ' Unload UserForm1 End Sub
vba:行の一括削除
こちらの記事を参考にさせていただきました!
```
Private Sub DeleteNgRows()
Dim row_End As Long
Dim rng_DeleteRows As Range
'最終行取得
row_End = ThisWorkbook.Worksheets("pivot").Cells(Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To row_End
'Rangeに削除対象行を格納 ※今回はB列が空白なら削除。
If IsEmpty(ThisWorkbook.Worksheets("pivot").Cells(i, 1)) Or IsNumeric(ThisWorkbook.Worksheets("pivot").Cells(i, 1)) = False Then
'初回のみ
If rng_DeleteRows Is Nothing Then
Set rng_DeleteRows = ThisWorkbook.Worksheets("pivot").Rows(i).EntireRow
'2回目以降は追加
Else
Set rng_DeleteRows = Union(rng_DeleteRows, ThisWorkbook.Worksheets("pivot").Rows(i).EntireRow)
End If
End If
Next
'削除対象行が1つでもあれば行削除を実施
If Not rng_DeleteRows Is Nothing Then rng_DeleteRows.Delete
End Sub
```