文庫本管理システム(改)

R7/11/10:更新
以前から気になっていたシステム内の<マクロ>を、全て VBA に変えました。『マクロをVisual Basic に変換』というツールがあるので、一から作るわけではなくてあまり苦労はなく、モジュールに組み込むときに少しだけ試行錯誤した程度です。これを機に『著者入力編集』に漢字の検索窓を追加しました。
以下はR3年の掲載内容で、R7/11/10:更新分は、末尾です。
 文庫管理システム(Access2003)

文庫本管理システム(R3年掲載)


テーブル


クエリー




フォーム(F_検索一覧)



フォーム(F_著者入力編集)


F_著者入力編集の終了ボタン(コマンド8)のプロパティ/イベント/クリック時のプロシージァー

Private Sub コマンド8_Click()
    'フォームを閉じる
    DoCmd.Close acForm, "F_著者入力編集"
    '「F_文庫入力編集」が開いていたら[著者コード]を空にして再クエリ
    If SysCmd(acSysCmdGetObjectState, acForm, "F_文庫入力編集") = 1 Then
        Forms![F_文庫入力編集]![著者コード] = ""
        Forms![F_文庫入力編集]![著者コード].Requery
    End If
End Sub

フォーム(F_文庫入力編集)


コンボボックス[著者コード]のプロパティ/イベント/リスト外入力時のプロシージァー

Private Sub 著者コード_NotInList(NewData As String, Response As Integer)
    'T_著者(Q_著者)に無いデータを入力したら
    Dim Tsuika As Integer
    Response = acDataErrContinue
    Beep
    Tsuika = MsgBox("新しい著者名です。追加しますか?", vbYesNo + vbQuestion, "確認")
    Select Case Tsuika
        Case vbYes
            'フォームを開く
            DoCmd.OpenForm "F_著者入力編集"
            '新規レコードへ移動
            DoCmd.GoToRecord , , acNewRec
          '[著者名]に代入してフォーカス
            Forms![F_著者入力編集]![著者名] = NewData
            Forms![F_著者入力編集]![著者名].SetFocus
        Case vbNo
            Me!著者コード = Null
            Me!著者コード.Dropdown
    End Select
End Sub

フォーム(F_蔵書管理メニュー)

後書き

※R3年の掲載から約3年経過し、この間にメルカリで Access2010 を手に入れました。Access2003で組んだこの文庫本管理も2010上で問題なく稼働していますが、表示の様子が変わった以上に機能も増えているようです。(詳しくないので解説は無理です。)

題名・著者名検索フォームの改良(R6年1月更新)


 R_結果印刷のデザインビュー

検索結果の印刷(R7年7月更新)

後書き2



マクロをVBAに(R7年11月10日更新)

◎すべてのマクロをVBAに変えました。
◎『検索フォーム』用のVBAです。
Option Compare Database
Option Explicit
Dim ken_txt As String
Dim k_txt1 As String
Dim k_txt2 As String
Dim k_txt3 As String

Private Sub Form_Open(Cancel As Integer)
'最初は何も表示しない
    ken_txt = "題名=''"
    Me.Filter = ken_txt
    Me.FilterOn = True
    Me!題名検索 = ""
    Me!著者名検索 = ""
    DoCmd.GoToControl "題名検索"
End Sub

Private Sub 結果印刷_Click()
'「結果印刷」ボタンをクリックしたら、R_検索結果を開いて
'ken_txtを条件にFilterを掛ける
    DoCmd.OpenReport "R_検索結果", acViewPreview, , ken_txt
End Sub

Private Sub 検索開始_Click()
'題名と著者名は部分一致
    k_txt1 = "[題名] Like '*" & Me![題名検索] & "*'"
    k_txt2 = "[著者名] Like '*" & Me![著者名検索] & "*'"
'著者名は'アンソロジー'で、備考に著者の名前が入っている
    k_txt3 = "[著者名]='アンソロジー' And [備考] Like '*" & Me![著者名検索] & "*'"
'( )内の著者名検索の条件を優先する(記述方法が難しい)
    ken_txt = k_txt1 & " And (" & k_txt2 & " Or " & k_txt3 & ")"
    Me.Filter = ken_txt
    Me.FilterOn = True
End Sub

Private Sub 検索値クリア_Click()
    ken_txt = "題名=''"
    Me.Filter = ken_txt
    Me.FilterOn = True
    Me!題名検索 = ""
    Me!著者名検索 = ""
End Sub

Private Sub 検索閉じる_Click()
        DoCmd.Close acForm, "F_検索一覧"
End Sub


◎『文庫入力フォーム』用のVBAです。
Private Sub Form_Open(Cancel As Integer)
    DoCmd.GoToControl "文庫入力題名検索"
End Sub

Private Sub 文庫入力新規_Click()
    DoCmd.GoToRecord , , acNewRec
    DoCmd.GoToControl "題名"
End Sub

Private Sub 文庫入力終了_Click()
    DoCmd.Close acForm, "F_文庫入力編集"  
End Sub

Private Sub 文庫入力題名検索_AfterUpdate()
    With CodeContextObject
        If (Forms!F_文庫入力編集!文庫入力題名検索 <> "") Then
            ' 題名検索が空でなければ
            DoCmd.GoToControl "題名"
            DoCmd.FindRecord Forms!F_文庫入力編集!文庫入力題名検索, acAnywhere, False, acDown, False, acCurrent, True
        End If
        If (.題名 Like "*" & .文庫入力題名検索 & "*") Then
            '見つかったら
            Exit Sub
        End If
        ' ヒットしなかった時
            If (MsgBox("新規に入力しますか", 4) = 6) Then
            ' 新しいレコード
            DoCmd.GoToRecord acForm, "F_文庫入力編集", acNewRec
            ' [番号] = Format(DMax("番号","T_文庫本")+1)
            .番号 = Format(DMax("番号", "T_文庫本") + 1)
            ' 「題名」
            DoCmd.GoToControl "題名"
            .題名 = .文庫入力題名検索
            End If
        ' 「題名検索」
        DoCmd.GoToControl "文庫入力題名検索"
        ' 「題名検索」 = ""
        .文庫入力題名検索 = ""
    End With
End Sub


◎『著者名入力フォーム』用のVBAです。
〇漢字(=[シメイケンサク])または かな(=[カナケンサク]) で探して、ヒットしなければ、自動的に新規入力になります。
Option Compare Database
'挿入前処理
Private Sub Form_BeforeInsert(Cancel As Integer)
    '連番の作成、現在の最大値+1を入力
  Me![著者NO] = Format(DMax("著者NO", "T_著者") + 1)
End Sub

Private Sub Form_Open(Cancel As Integer)
    ' 「シメイケンサク」 へ
    DoCmd.GoToControl "シメイケンサク"
End Sub

Private Sub カナケンサク_AfterUpdate()
    With CodeContextObject
        If (Forms!F_著者入力編集![カナケンサク] <> "") Then
            ' 「かな」 へ
            DoCmd.GoToControl "かな"
            DoCmd.FindRecord Forms!F_著者入力編集![カナケンサク], acAnywhere, False, acDown, False, acCurrent, True
        End If
        If (.[かな] Like .[カナケンサク] & "*") Then
            Exit Sub
        End If
        ' 著者名新規
        Call 著者名新規
    End With
End Sub

Private Sub 著者入力新規_Click()
    ' 新しいレコード
    DoCmd.GoToRecord acForm, "F_著者入力編集", acNewRec
    ' [著者名]
    DoCmd.GoToControl "著者名"
End Sub

Private Sub 著者入力終了_Click()
    'フォームを閉じる
    DoCmd.Close acForm, "F_著者入力編集"
    '「F_文庫入力編集」が開いていたら[著者コード]を空にして再クエリ
    If SysCmd(acSysCmdGetObjectState, acForm, "F_文庫入力編集") = 1 Then
        Forms![F_文庫入力編集]![著者コード] = ""
        Forms![F_文庫入力編集]![著者コード].Requery
    End If
End Sub

Private Sub シメイケンサク_AfterUpdate()
      With CodeContextObject
        If (Forms!F_著者入力編集![シメイケンサク] <> "") Then
            ' 「著者名」 へ
            DoCmd.GoToControl "著者名"
            DoCmd.FindRecord Forms!F_著者入力編集![シメイケンサク], acAnywhere, False, acDown, False, acCurrent, True
        End If
        If (.著者名 Like .[シメイケンサク] & "*") Then
            Exit Sub
        End If
        ' 著者名新規
        Call 著者名新規
    End With
End Sub

Function 著者名新規()
    With CodeContextObject
        If (MsgBox("新規に入力しますか", 4) = 6) Then
            ' 新しいレコード
            DoCmd.GoToRecord acForm, "F_著者入力編集", acNewRec
            ' [著者NO] = Format(DMax("著者NO","T_著者")+1)
            .著者NO = Format(DMax("著者NO", "T_著者") + 1)
            .著者名 = Forms!F_著者入力編集![シメイケンサク]
            .[かな] = Forms!F_著者入力編集![カナケンサク]
            ' 「著者名」 へ
            DoCmd.GoToControl "著者名"
            Exit Function
        End If
        ' 「カナケンサク」
        DoCmd.GoToControl "カナケンサク"
        ' "" を代入
        .[カナケンサク] = ""
    End With
End Function


後書き3


 

[<ホーム>へ戻る]