歯抜けの日ごとのデータを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:行の一括削除

mmm-program.com

 

こちらの記事を参考にさせていただきました!

 

```

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

```