(祝)東京オリンピック!

(祝)北京オリンピック!

ファイル移動関係

メインフォーム



   

COPY

Option Compare Database
Option Explicit
'-------------------------------------------------------------------
Private NenTuki()           As String
Private Fname               As Dictionary
Private ViewPosi            As Long
Private ShiftPosi           As Long
Private memSQL              As String
Private memTableSQL         As String       'SUBフォームがセットして年シフト時使用
Private memOrderSQL         As String       'SUBフォームがセットして年シフト時使用
Private memClickLabel       As String
'-------------------------------------------------------------------
Public Property Get mySQL() As String
    mySQL = memSQL
End Property
'-------------------------------------------------------------------
Public Property Let mySQL(ByVal val As String)
    memSQL = val
End Property
'-------------------------------------------------------------------
Public Property Get TableSQL() As String
    TableSQL = memTableSQL
End Property
'-------------------------------------------------------------------
Public Property Let TableSQL(ByVal val As String)
    memTableSQL = val
End Property
'-------------------------------------------------------------------
Public Property Get OrderSQL() As String
    OrderSQL = memOrderSQL
End Property
'-------------------------------------------------------------------
Public Property Let OrderSQL(ByVal val As String)
    memOrderSQL = val
End Property
'-------------------------------------------------------------------
Public Property Get ClickLabel() As String
    ClickLabel = memClickLabel
End Property
'-------------------------------------------------------------------
Public Property Let ClickLabel(ByVal val As String)
    memClickLabel = val
End Property
'-------------------------------------------------------------------
Private Sub Form_Open(Cancel As Integer)
    Dim EDate               As Long
    Dim SDate               As Long
    Dim I                   As Long

    Me.車検点検予定表SUB.SourceObject = "車検点検予定表SUB"

    ShiftPosi = 0
    ViewPosi = 13
    memTableSQL = ""
    memOrderSQL = ""

    '点検月名とフォームの表題の対照表の作成
    Call FNameMake

    Me.車検点検予定表SUB.Form.Painting = False
   
    Call ListAdd

    Call SubControl(True)

    Me.車検点検予定表SUB.Form.Painting = True
   
End Sub
'-------------------------------------------------------------------
Private Sub Form_Close()

    Set Fname = Nothing

End Sub
'-------------------------------------------------------------------
Private Sub エクセル_Click()
    Dim Rst                 As Recordset
    Dim Ws                  As Object
    Dim xls                 As Object
    Dim I                   As Long

    Set Ws = CreateObject("Wscript.Shell")

    '得意先テーブルを開く
    Set Rst = Me.車検点検予定表SUB.Form.Recordset.Clone

    'Excelオブジェクトを生成
    Set xls = CreateObject("Excel.Application")

    With xls
        '新しいブックを追加
        .Workbooks.Add

        For I = 0 To Rst.Fields.Count - 1
            .Cells(1, I + 1).Value = Fname(Rst.Fields(I).Name)
        Next I

        '2行目の1列目からレコードセットを出力
        .Cells(2, 1).CopyFromRecordset Rst
        Set Rst = Nothing

        .Visible = True

    End With

    Set xls = Nothing

End Sub
'-------------------------------------------------------------------
Private Sub シフト右_Click()

    ShiftPosi = ShiftPosi + 1

    '点検月名とフォームの表題の対照表の作成
    Call FNameMake

    Me.車検点検予定表SUB.Form.Painting = False
   
    Call ListAdd

    Call SubControl(True)

    Me.車検点検予定表SUB.Form.Painting = True
   
End Sub
'-------------------------------------------------------------------
Private Sub シフト左_Click()

    ShiftPosi = ShiftPosi - 1

    '点検月名とフォームの表題の対照表の作成
    Call FNameMake

    Me.車検点検予定表SUB.Form.Painting = False
   
    Call ListAdd

    Call SubControl(True)

    Me.車検点検予定表SUB.Form.Painting = True
   
End Sub
'-------------------------------------------------------------------
Private Sub 右_Click()

    ViewPosi = ViewPosi + 1

    Me.車検点検予定表SUB.Form.Painting = False
   
    Call SubControl

    Me.車検点検予定表SUB.Form.Painting = True
   
End Sub
'-------------------------------------------------------------------
Private Sub 左_Click()

    ViewPosi = ViewPosi - 1

    Me.車検点検予定表SUB.Form.Painting = False
   
    Call SubControl

    Me.車検点検予定表SUB.Form.Painting = True
  
End Sub
'-------------------------------------------------------------------
Private Sub 解除_Click()
    Dim Ctrl                As Access.Control

    Me.車検点検予定表SUB.Form.Painting = False

    For Each Ctrl In Me.車検点検予定表SUB.Form.Controls
        If Ctrl.ControlType = acLabel Then
            With Ctrl
                Select Case True
                Case InStr(.Caption, "_■") > 0
                    .Caption = Replace(.Caption, "_■", "")
                Case InStr(.Caption, "_▲") > 0
                    .Caption = Replace(.Caption, "_▲", "")
                Case InStr(.Caption, "_▼") > 0
                    .Caption = Replace(.Caption, "_▼", "")
                End Select
            End With
        End If
    Next Ctrl

    ClickLabel = ""
    TableSQL = ""
    OrderSQL = ""

    Me.車検点検予定表SUB.Form.RecordSource = mySQL & ";"
    Me.車検点検予定表SUB.Form.Requery

    Me.車検点検予定表SUB.Form.Painting = True

End Sub
'-------------------------------------------------------------------
Private Sub ListAdd()
    Dim Rs                  As DAO.Recordset
    Dim Touroku             As String
    Dim TourokuDate         As Long
    Dim HaishaDate          As Long
    Dim BaseDate            As Long
    Dim ShokaiSpan          As Long
    Dim ShakenSpan          As Long
    Dim TenkenSpan          As Long
    Dim I                   As Long
    Dim SetSQL              As String

    Set Rs = CurrentDb.OpenRecordset("車検証", dbOpenSnapshot)

    If Rs.BOF Then
        Set Rs = Nothing
        Exit Sub
    End If

    Do Until Rs.EOF
        '車検証(レコードセット)から値を取得
        Touroku = Rs("登録番号")
        TourokuDate = Rs("登録日")
        HaishaDate = Nz(Rs("廃車日"), 999999)
        BaseDate = Rs("有効期限")
        ShokaiSpan = Rs("初回有効期間")
        ShakenSpan = Rs("継続有効期間")
        TenkenSpan = Rs("点検有効期間")
        'テーブル車検点検listに追加
        Call ListMake(Touroku, TourokuDate, HaishaDate, BaseDate, ShokaiSpan, ShakenSpan, TenkenSpan)
        Rs.MoveNext
    Loop

    'レコードセットの参照破棄
    Set Rs = Nothing

    'フォームのデータSQLの作成
    mySQL = "SELECT A.登録番号"
    mySQL = mySQL & ", Max(A.ID) AS ID"
    mySQL = mySQL & ", Max(A.登録日) AS 登録日"
    mySQL = mySQL & ", Max(A.廃車日) AS 廃車日"
    mySQL = mySQL & ", Max(A.有効期限) AS 有効期限"
    For I = 1 To UBound(NenTuki)
        mySQL = mySQL & ", Max(IIf(A.年月='" & NenTuki(I) & "',A.車検点検ID,Null)) AS " & "F" & I
    Next I
    mySQL = mySQL & " FROM 車検点検list AS A"
    mySQL = mySQL & " GROUP BY A.登録番号"

    If TableSQL <> "" Then
        If OrderSQL <> "" Then
            SetSQL = "SELECT X.* FROM (" & Replace(mySQL, "車検点検list", TableSQL) & ") AS X " & OrderSQL & ";"
        Else
            SetSQL = "SELECT X.* FROM (" & Replace(mySQL, "車検点検list", TableSQL) & ") AS X;"
        End If
    Else
        SetSQL = mySQL & ";"
    End If

    Me.車検点検予定表SUB.Form.RecordSource = SetSQL

End Sub
'-------------------------------------------------------------------
Private Sub 実行_Click()
    Dim Rs                  As DAO.Recordset
    Dim Touroku             As String
    Dim TourokuDate         As Long
    Dim HaishaDate          As Long
    Dim BaseDate            As Long
    Dim ShokaiSpan          As Long
    Dim ShakenSpan          As Long
    Dim TenkenSpan          As Long
    Dim EDate               As Long
    Dim SDate               As Long
    Dim I                   As Long
    Dim Qdf                 As QueryDef
    Dim mySQL               As String

    SDate = DateSerial(Year(Date) - 1, Month(Date), 1)
    EDate = DateSerial(Year(Date) + 2, Month(Date), 0)

    Set Rs = CurrentDb.OpenRecordset("車検証", dbOpenSnapshot)

    If Rs.BOF Then
        Set Rs = Nothing
        Exit Sub
    End If

    'DoCmd.RunSQL "DELETE * FROM 車検点検list;"

    Do Until Rs.EOF
        '車検証(レコードセット)から値を取得
        Touroku = Rs("登録番号")
        TourokuDate = Rs("登録日")
        HaishaDate = Nz(Rs("廃車日"), 999999)
        BaseDate = Rs("有効期限")
        ShokaiSpan = Rs("初回有効期間")
        ShakenSpan = Rs("継続有効期間")
        TenkenSpan = Rs("点検有効期間")
        'テーブル車検点検listに追加
        Call ListMake(Touroku, TourokuDate, BaseDate, HaishaDate, ShokaiSpan, ShakenSpan, TenkenSpan)
        Rs.MoveNext
    Loop

    'レコードセットの参照破棄
    Set Rs = Nothing

    '点検月名とフォームの表題の対照表の作成
    Set Fname = New Dictionary
    Do Until DateSerial(Year(SDate), Month(SDate) + I, 1) > EDate
        I = I + 1
        ReDim Preserve NenTuki(I)
        NenTuki(I) = StrConv(Format(DateSerial(Year(SDate), Month(SDate) + I - 1, 1), "geemm"), vbUpperCase)
        Fname.Add "F" & I, NenTuki(I)
    Loop

    'フォームのデータSQLの作成
    memSQL = "SELECT A.登録番号"
    memSQL = memSQL & ", Max(A.登録日) AS 登録日"
    memSQL = memSQL & ", Max(A.廃車日) AS 廃車日"
    memSQL = memSQL & ", Max(A.有効期限) AS 有効期限"""
    For I = 1 To UBound(NenTuki)
        memSQL = memSQL & ", Max(IIf(A.年月='" & NenTuki(I) & "', A.車検点検ID, Null)) AS " & "F" & I
    Next I
    memSQL = memSQL & " FROM 車検点検list AS A"
    memSQL = memSQL & " GROUP BY A.登録番号"

    'クエリの作成
    Set Qdf = CurrentDb.CreateQueryDef("Q_一覧表", mySQL & ";")
    Set Qdf = Nothing

End Sub
'-------------------------------------------------------------------
Private Sub ListMake(ByVal Touroku As String, _
                     ByVal TourokuDate As Long, _
                     ByVal HaishaDate As Long, _
                     ByVal BaseDate As Long, _
                     ByVal ShokaiSpan As Long, _
                     ByVal ShakenSpan As Long, _
                     ByVal TenkenSpan As Long)
    Dim ShuseiDate          As Long
    Dim BUF                 As Long
    Dim I                   As Long
    Dim NenTuki             As String
    Dim ShaID               As String
    Dim FLG                 As String
    Dim bufSQL              As String

    ShuseiDate = BaseDate + 1
    For I = -(6 + Abs(ShiftPosi)) To (6 + Abs(ShiftPosi))
        BUF = DateSerial(Year(ShuseiDate), Month(ShuseiDate) + TenkenSpan * I, Day(ShuseiDate)) - 1
        If BUF <= TourokuDate Then
            '登録日以前に車検・点検はない
            NenTuki = StrConv(Format(TourokuDate, "geemm"), vbUpperCase)
            ShaID = "登_" & Format(TourokuDate, "eemmdd") & "_" & Touroku
            FLG = "登"
            BUF = TourokuDate
        ElseIf BUF >= HaishaDate Then
            '廃車日以降に車検・点検はない
            NenTuki = StrConv(Format(HaishaDate, "geemm"), vbUpperCase)
            ShaID = "廃_" & Format(HaishaDate, "eemmdd") & "_" & Touroku
            FLG = "廃"
            BUF = HaishaDate
        Else
            If BUF < DateSerial(Year(TourokuDate), Month(TourokuDate) + ShokaiSpan, Day(TourokuDate)) - 1 Then
                '初回有効期限内に車検はないが、有効期限であるばあい車検とする
                If I = 0 Then
                    NenTuki = StrConv(Format(BUF, "geemm"), vbUpperCase)
                    ShaID = "検_" & Format(BUF, "eemmdd") & "_" & Touroku
                    FLG = "検"
                Else
                    NenTuki = StrConv(Format(BUF, "geemm"), vbUpperCase)
                    ShaID = "点_" & Format(BUF, "eemmdd") & "_" & Touroku
                    FLG = "点"
                End If
            Else
                If I = 0 Then
                    '有効期限は車検
                    NenTuki = StrConv(Format(BUF, "geemm"), vbUpperCase)
                    ShaID = "検_" & Format(BUF, "eemmdd") & "_" & Touroku
                    FLG = "検"
                Else
                    If (TenkenSpan * I) Mod ShakenSpan = 0 Then
                        '車検と点検が重なる場合は車検
                        NenTuki = StrConv(Format(BUF, "geemm"), vbUpperCase)
                        ShaID = "検_" & Format(BUF, "eemmdd") & "_" & Touroku
                        FLG = "検"
                    Else
                        '重ならない場合は点検
                        NenTuki = StrConv(Format(BUF, "geemm"), vbUpperCase)
                        ShaID = "点_" & Format(BUF, "eemmdd") & "_" & Touroku
                        FLG = "点"
                    End If
                End If
            End If
        End If

        If DCount("車検点検ID", "車検点検list", "車検点検ID='" & ShaID & "'") = 0 Then
            '追加クエリの作成
            bufSQL = "INSERT INTO 車検点検list"
            bufSQL = bufSQL & " (年月日,"
            bufSQL = bufSQL & " 登録日,"
            bufSQL = bufSQL & " 廃車日,"
            bufSQL = bufSQL & " 有効期限,"
            bufSQL = bufSQL & " 年月,"
            bufSQL = bufSQL & " 登録番号,"
            bufSQL = bufSQL & " 車検点検ID,"
            bufSQL = bufSQL & " 車検点検別)"
            bufSQL = bufSQL & " VALUES "
            bufSQL = bufSQL & " (" & BUF & ","
            bufSQL = bufSQL & " " & TourokuDate & ","
            bufSQL = bufSQL & " " & IIf(HaishaDate = 999999, "NULL", HaishaDate) & ","
            bufSQL = bufSQL & " " & BaseDate & ","
            bufSQL = bufSQL & " '" & NenTuki & "',"
            bufSQL = bufSQL & " '" & Touroku & "',"
            bufSQL = bufSQL & " '" & ShaID & "',"
            bufSQL = bufSQL & " '" & FLG & "');"
            '追加の実行
            DoCmd.RunSQL bufSQL
        End If
    Next I

End Sub
'-------------------------------------------------------------------
Private Sub 閉じる_Click()

    DoCmd.Close acForm, Me.Name, acSaveYes

End Sub
'-------------------------------------------------------------------
Private Sub SubControl(Optional ByVal FLG As Boolean = False)
    Dim I                   As Long
    Dim Posi                As Double
    Dim Span                As Double
    Dim fCount              As Long

    Me.車検点検予定表SUB.Form.SelHeight = 1
  
    Posi = Me.車検点検予定表SUB.Form("F1").Left
    For I = 1 To Fname.Count
        If Fname.Exists("F" & I) Then
            If I > (ViewPosi - 1) And I < (ViewPosi + 13) Then
                '13テキストボックス・ラベルを表示にし隙間なく並べる
                With Me.車検点検予定表SUB
                    With .Form("F" & I)
                        Span = .Width
                        .Left = Posi
                        .Visible = True
                    End With
                    With .Form("L" & I)
                        If FLG Then
                            If InStr(ClickLabel, Fname("F" & I)) > 0 Then
                                .Caption = ClickLabel
                            Else
                                .Caption = Fname("F" & I)
                            End If
                        End If
                        .Left = Posi
                        .Visible = True
                    End With
                    With .Form("BK" & I)
                        .Left = Posi
                        .Visible = True
                    End With
                    Posi = Posi + Span
                End With
            Else
                'その他は非表示にする
                With Me.車検点検予定表SUB
                    .Form("F" & I).Visible = False
                    With .Form("L" & I)
                        If FLG Then
                            If InStr(ClickLabel, Fname("F" & I)) > 0 Then
                                .Caption = ClickLabel
                            Else
                                .Caption = Fname("F" & I)
                            End If
                        End If
                        .Visible = False
                    End With
                    With .Form("BK" & I)
                        .Visible = False
                    End With
                End With
            End If
            'ラベルにセットした数をカウント
            fCount = fCount + 1
        End If
    Next I
 
    'ラベルにセットした数を上限にする
    If (ViewPosi + 12) >= fCount Then
        If Me.右.Enabled Then
            Me.右.Enabled = False
        End If
    Else
        If Not Me.右.Enabled Then
            Me.右.Enabled = True
        End If
    End If

    If ViewPosi <= 1 Then
        If Me.左.Enabled Then
            Me.左.Enabled = False
        End If
    Else
        If Not Me.左.Enabled Then
            Me.左.Enabled = True
        End If
    End If

End Sub
'-------------------------------------------------------------------
Private Sub FNameMake()
    Dim SDate               As Long
    Dim EDate               As Long
    Dim I                   As Long

    SDate = DateSerial(Year(Date) - 1 + ShiftPosi, Month(Date), 1)
    EDate = DateSerial(Year(Date) + 2 + ShiftPosi, Month(Date) + 1, 0)

    '点検月名とフォームの表題の対照表の作成
    Set Fname = Nothing
    Set Fname = New Dictionary
    Do Until DateSerial(Year(SDate), Month(SDate) + I, 1) > EDate
        I = I + 1
        ReDim Preserve NenTuki(I)
        NenTuki(I) = StrConv(Format(DateSerial(Year(SDate), Month(SDate) + I - 1, 1), "geemm"), vbUpperCase)
        Fname.Add "F" & I, NenTuki(I)
    Loop

    With Fname
        .Add "登録番号", "登録番号"
        .Add "登録日", "登録日"
        .Add "廃車日", "廃車日"
        .Add "有効期限", "有効期限"
    End With

    Call SetSelectCell

End Sub
'-------------------------------------------------------------------
Private Sub SetSelectCell()
    Dim Rs                  As DAO.Recordset
    Dim SDate               As Long
    Dim EDate               As Long
    Dim mySQL               As String
    Dim bufStr()            As String
    Dim I                   As Long

    SDate = DateSerial(Year(Date) - 1 + ShiftPosi, Month(Date), 1)
    EDate = DateSerial(Year(Date) + 2 + ShiftPosi, Month(Date) + 1, 0)

    mySQL = "SELECT"
    mySQL = mySQL & " A.車検点検ID"
    mySQL = mySQL & " FROM"
    mySQL = mySQL & " 車検点検list AS A"
    mySQL = mySQL & " WHERE (A.年月日>=" & SDate & ") AND (A.年月日<=" & EDate & ");"

    Set Rs = CurrentDb.OpenRecordset(mySQL, dbOpenSnapshot)

    If Rs.BOF Then
        Exit Sub
    End If

    I = 0
    Do Until Rs.EOF
        ReDim Preserve bufStr(I)
        bufStr(I) = Rs("車検点検ID")
        I = I + 1
        Rs.MoveNext
    Loop

    Rs.Close
    Set Rs = Nothing
    
    Me.車検点検予定表SUB.Form.SelectCell = Join(bufStr, ",")

End Sub 



   

COPY

Option Compare Database
Option Explicit
'-------------------------------------------------------------------
Private Sub L13_Click()

    Call LabelClick("L13")

End Sub
'-------------------------------------------------------------------
Private Sub L14_Click()

    Call LabelClick("L14")

End Sub
'-------------------------------------------------------------------
Private Sub L15_Click()

    Call LabelClick("L15")

End Sub
'-------------------------------------------------------------------
Private Sub L16_Click()

    Call LabelClick("L16")

End Sub
'-------------------------------------------------------------------
Private Sub LabelClick(ByVal lName As String)
    Dim SubSQL              As String
    Dim HoldSQl             As String
    Dim SetSQL              As String
    Dim Origin              As String
    Dim Ctrl                As Access.Control

    For Each Ctrl In Me.Controls
        If Ctrl.ControlType = acLabel Then
            With Ctrl
            If .Name <> lName Then
                Select Case True
                Case InStr(.Caption, "_■") > 0
                    .Caption = Replace(.Caption, "_■", "")
                Case InStr(.Caption, "_▲") > 0
                    .Caption = Replace(.Caption, "_▲", "")
                Case InStr(.Caption, "_▼") > 0
                    .Caption = Replace(.Caption, "_▼", "")
                End Select
            End If
            End With
        End If
    Next Ctrl

    With Me(lName)
        Select Case True
        Case InStr(.Caption, "_■") > 0
            Origin = Replace(.Caption, "_■", "")
            .Caption = Origin & "_▲"
        Case InStr(.Caption, "_▲") > 0
            Origin = Replace(.Caption, "_▲", "")
            .Caption = Origin & "_▼"
        Case InStr(.Caption, "_▼") > 0
            Origin = Replace(.Caption, "_▼", "")
            .Caption = Origin
        Case Else
            Origin = .Caption
            .Caption = Origin & "_■"
        End Select

        HoldSQl = Me.Parent.mySQL
        SubSQL = "(SELECT B.* FROM 車検点検list AS B WHERE B.年月='" & Origin & "')"
        SubSQL = "(SELECT B.* FROM 車検点検list AS B WHERE B.登録番号 IN (SELECT C.登録番号 FROM 車検点検list AS C WHERE C.年月='" & Origin & "'))"
    
        Select Case True
        Case InStr(.Caption, "■") > 0
            SetSQL = Replace(HoldSQl, "車検点検list", SubSQL) & ";"
            Me.Parent.ClickLabel = .Caption
            Me.Parent.TableSQL = SubSQL
            Me.Parent.OrderSQL = ""
        Case InStr(.Caption, "▲") > 0
            SetSQL = "SELECT X.* FROM (" & Replace(HoldSQl, "車検点検list", SubSQL) & ") AS X ORDER BY X." & Replace(lName, "L", "F") & " ASC;"
            Me.Parent.ClickLabel = .Caption
            Me.Parent.TableSQL = SubSQL
            Me.Parent.OrderSQL = "ORDER BY X." & Replace(lName, "L", "F") & " ASC"
        Case InStr(.Caption, "▼") > 0
            SetSQL = "SELECT X.* FROM (" & Replace(HoldSQl, "車検点検list", SubSQL) & ") AS X ORDER BY X." & Replace(lName, "L", "F") & " DESC;"
            Me.Parent.ClickLabel = .Caption
            Me.Parent.TableSQL = SubSQL
            Me.Parent.OrderSQL = "ORDER BY X." & Replace(lName, "L", "F") & " DESC"
        Case Else
            SetSQL = HoldSQl & ";"
            Me.Parent.ClickLabel = ""
            Me.Parent.TableSQL = ""
            Me.Parent.OrderSQL = ""
        End Select
    End With

    Me.RecordSource = SetSQL
    Me.Requery

End Sub