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

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

サンプル集

フォームのテキストボックスに数字のみ入力

配置: フォームに、テキストボックスx (xは0から5まで)を配置
動作: テキストボックス1からテキストボックス5に入力するごとに、テキストボックス0
   に合計するようにします。
設定: テキストボックスの「IME入力モード」を使用不可に設定

COPY

  1. Option Compare Database
  2. Option Explicit
  3. '-------------------------------------------------------------------
  4.  
  5. Private WithEvents myControl As C_Controls
  6.  
  7. '-------------------------------------------------------------------
  8. Private Sub Form_Load()
  9.  
  10. Set myControl = New C_Controls
  11. With myControl
  12. Set .Parent = Me
  13. Call .Init
  14. End With
  15.  
  16. End Sub
  17. '-------------------------------------------------------------------
  18. Private Sub mycontrol_Change(myCont As Object)
  19. Dim Total As Variant
  20. Dim I As Long
  21.  
  22. Select Case myCont.Name
  23. Case "テキスト1", "テキスト2", "テキスト3", "テキスト4", "テキスト5"
  24. Total = ValOut(myCont.Text)
  25. For I = 2 To 10 Step 2
  26. If myCont.Name <> "テキスト" & I Then
  27. Total = Total + ValOut(Me("テキスト" & I).Value)
  28. End If
  29. Next I
  30. Me.テキスト0.Value = Total
  31. End Select
  32.  
  33. End Sub
  34. '-------------------------------------------------------------------
  35. Private Function ValOut(Val As Variant) As Variant
  36.  
  37. If Nz(Val, "") = "" Then
  38. ValOut = 0
  39. Else
  40. ValOut = CDec(Val)
  41. End If
  42. End Function
  43. '-------------------------------------------------------------------
  44. Private Sub mycontrol_KeyPress(myCont As Object, KeyAscii As Integer)
  45.  
  46. Select Case myCont.Name
  47. Case "テキスト1", "テキスト2", "テキスト3", "テキスト4", "テキスト5"
  48. If (KeyAscii < Asc("0") And KeyAscii > 31) Or KeyAscii > Asc("9") Then
  49. If KeyAscii = Asc(".") Then
  50. If InStr(myCont.Text, ".") > 0 Then
  51. KeyAscii = 0
  52. End If
  53. Else
  54. KeyAscii = 0
  55. End If
  56. End If
  57. End Select
  58.  
  59. End Sub

レポートを縮小拡大するプロシージャ

R: 拡大/縮小の比率
    1.15    'B5サイズをA4サイズに拡大
    0.817   'B4サイズをA4サイズに縮小

COPY

  1. Public Sub ReportSizeChange(ReportName As String, R As Double)
  2. Dim NewReportName As String, ctl As Control, rpt As Report, i As Integer
  3. If R = 1 Then
  4. Exit Sub
  5. ElseIf R < 1 Then
  6. NewReportName = ReportName & "_SizeDown"
  7. Else
  8. NewReportName = ReportName & "_SizeUp"
  9. End If
  10. DoCmd.CopyObject , NewReportName, acReport, ReportName
  11. On Error Resume Next
  12. DoCmd.OpenReport NewReportName, acViewDesign
  13. Set rpt = Reports(NewReportName)
  14. If R > 1 Then
  15. rpt.Width = rpt.Width * R
  16. For i = 0 To 8
  17. rpt.Section(i).Height = rpt.Section(i).Height * R
  18. Next
  19. End If
  20. For Each ctl In rpt.Controls
  21. With ctl
  22. .Move .Left * R, .Top * R, .Width * R, .Height * R
  23. .FontSize = Int(.FontSize * R)
  24. End With
  25. Next
  26. If R < 1 Then
  27. rpt.Width = rpt.Width * R
  28. For i = 0 To 8
  29. rpt.Section(i).Height = rpt.Section(i).Height * R
  30. Next
  31. End If
  32. Set rpt = Nothing
  33. End Sub

フォーム内でレコードを保存しようとするたびに変更内容の確認を求める方法



   

COPY

  1. Private Sub Form_BeforeUpdate(Cancel As Integer)
  2. Dim strMsg As String
  3. Dim iResponse As Integer
  4. '確認メッセージ
  5. strMsg = "変更があります。更新しますか?" & Chr(10)
  6. strMsg = strMsg & "「はい」「いいえ」をクリックしてください。"
  7. 'メッセージの表示
  8. iResponse = MsgBox(strMsg, vbQuestion + vbYesNo, "更新確認?")
  9. '「いいえ」がクリックされた場合
  10. If iResponse = vbNo Then
  11. '変更を戻す
  12. DoCmd.RunCommand acCmdUndo
  13. '手続きのキャンセル
  14. Cancel = True
  15. End If
  16.  
  17. End Sub
  18. '-------------------------------------------------------------------
  19. Private Sub cmd更新_Click()
  20. Dim strMsg As String
  21. Dim iResponse As Integer
  22.  
  23. If Not Me.Dirty Then
  24. Msgbox "変更はありません。キャンセルします。"
  25. Exit Sub
  26. End If
  27. '確認メッセージ
  28. strMsg = "更新しますか?" & Chr(10)
  29. strMsg = strMsg & "「はい」「いいえ」をクリックしてください。"
  30. iResponse = MsgBox(strMsg, vbQuestion + vbYesNo, "更新確認?")
  31.  
  32. If iResponse = vbYes Then
  33. Me.BeforeUpdate = ""
  34. DoCmd.RunCommand acCmdSaveRecord
  35. Me.BeforeUpdate = "[イベント プロシージャ]"
  36. Msgbox "更新されました。"
  37. Else
  38. DoCmd.RunCommand acCmdUndo
  39. Msgbox "更新はキャンセルされました。"
  40. End If
  41.  
  42. DoEvents
  43.  
  44. End Sub

グループの縦をグループ名、横を月にした集計を作成



   

COPY

  1. Private Sub Unko()
  2. Dim subSQL As String
  3. Dim mySQL As String
  4. Dim NenTuki() As String
  5. Dim I As Long
  6.  
  7. '作成する年月の配列を作成
  8. ReDim NenTuki(12)
  9. For I = 1 To 12
  10. NenTuki(I) = StrConv(Format(DateSerial(2021, 3 + I, 1), "geemm"), vbUpperCase)
  11. Next I
  12.  
  13. '基本となるクエリの作成
  14. subSQL = "SELECT"
  15. subSQL = subSQL & " A.登録番号"
  16. For I = 1 To UBound(NenTuki)
  17. subSQL = subSQL & ", MAX(IIf(A.年月='" & NenTuki(I) & "',A.給油,Null)) AS " & "O_" & NenTuki(I)
  18. subSQL = subSQL & ", MAX(IIf(A.年月='" & NenTuki(I) & "',A.稼働日数,Null)) AS " & "K_" & NenTuki(I)
  19. subSQL = subSQL & ", MAX(IIf(A.年月='" & NenTuki(I) & "',A.走行距離,Null)) AS " & "S_" & NenTuki(I)
  20. Next I
  21. subSQL = subSQL & " FROM"
  22. subSQL = subSQL & " (SELECT"
  23. subSQL = subSQL & " StrConv(Format(X.[シリアル値],'gee') & Format(X.[シリアル値],'mm'),8) AS 年月"
  24. subSQL = subSQL & ", X.登録番号"
  25. subSQL = subSQL & ", X.給油"
  26. subSQL = subSQL & ", X.稼働日数"
  27. subSQL = subSQL & ", X.走行距離"
  28. subSQL = subSQL & " FROM 運行 AS X)"
  29. subSQL = subSQL & " AS A"
  30. subSQL = subSQL & " GROUP BY A.登録番号"
  31. subSQL = subSQL & " ORDER BY A.登録番号"
  32.  
  33. '出力フィールドの作成
  34. mySQL = "SELECT"
  35. mySQL = mySQL & " B.登録番号"
  36. '月の給油フィールド
  37. For I = 1 To UBound(NenTuki)
  38. mySQL = mySQL & ", B.O_" & NenTuki(I)
  39. Next I
  40. '給油合計フィールド
  41. mySQL = mySQL & ", (0 " '0はダミー
  42. For I = 1 To UBound(NenTuki)
  43. mySQL = mySQL & " + Nz(B.O_" & NenTuki(I) & ",0)"
  44. Next I
  45. mySQL = mySQL & ") AS 給油合計"
  46. '月の稼働日数フィールド
  47. For I = 1 To UBound(NenTuki)
  48. mySQL = mySQL & ", B.K_" & NenTuki(I)
  49. Next I
  50. '稼働日数合計フィールド
  51. mySQL = mySQL & ", (0 " '0はダミー
  52. For I = 1 To UBound(NenTuki)
  53. mySQL = mySQL & " + Nz(B.K_" & NenTuki(I) & ",0)"
  54. Next I
  55. mySQL = mySQL & ") AS 稼働日数合計"
  56. '月の走行距離フィールド
  57. For I = 1 To UBound(NenTuki)
  58. mySQL = mySQL & ", B.S_" & NenTuki(I)
  59. Next I
  60. '年間走行距離フィールド
  61. mySQL = mySQL & ", ("
  62. ' 計算期間の有効データを保持する最終月を求めデータを取得する
  63. For I = 12 To 1 Step -1
  64. If I = 12 Then
  65. mySQL = mySQL & " Switch(Not IsNull(B.S_" & NenTuki(I) & "),B.S_" & NenTuki(I)
  66. Else
  67. mySQL = mySQL & ", Not IsNull(B.S_" & NenTuki(I) & "), B.S_" & NenTuki(I)
  68. End If
  69. Next I
  70. mySQL = mySQL & ", True, Nz(B.S_" & NenTuki(1) & "))" 'Switchの最終処理
  71. mySQL = mySQL & " - "
  72. ' -計算期間の有効データを保持する最初月を求めデータを取得する
  73. For I = 1 To 12
  74. If I = 1 Then
  75. mySQL = mySQL & " Switch(Not IsNull(B.S_" & NenTuki(I) & "),B.S_" & NenTuki(I)
  76. Else
  77. mySQL = mySQL & ", Not IsNull(B.S_" & NenTuki(I) & "), B.S_" & NenTuki(I)
  78. End If
  79. Next I
  80. mySQL = mySQL & ", True, Nz(B.S_" & NenTuki(12) & "))" 'Switchの最終処理
  81. mySQL = mySQL & ") AS 年間走行距離"
  82. mySQL = mySQL & " FROM (" & subSQL & ") AS B;"
  83.  
  84. '作成したSQL分を表示
  85. Me.temp = mySQL
  86.  
  87. 'エクセルに出力
  88. Call エクセル(mySQL)
  89.  
  90. End Sub

レコードセットをエクセルに書き込む



   

COPY

  1. Private Sub エクセル(ByVal mySQL As String)
  2. Dim Rst As Recordset
  3. Dim xls As Object
  4. Dim I As Long
  5.  
  6. 'レコードセットを作成
  7. Set Rst = CurrentDb.OpenRecordset(mySQL)
  8.  
  9. 'Excelオブジェクトを生成
  10. Set xls = CreateObject("Excel.Application")
  11. xls.Visible = True
  12.  
  13. '新しいブックを追加
  14. With xls.Application.Workbooks.Add
  15. '1行目の1列目からフィールド名を出力
  16. For I = 0 To Rst.Fields.Count - 1
  17. .Sheets(1).Cells(1, I + 1).Value = Rst.Fields(I).Name
  18. Next I
  19. '2行目の1列目からレコードセットを出力
  20. .Sheets(1).Cells(2, 1).CopyFromRecordset Rst
  21. End With
  22.  
  23. 'オブジェクトの参照の破棄
  24. Set xls = Nothing
  25. Rst.Close
  26. Set Rst = Nothing
  27.  
  28. End Sub