フォームのテキストボックスに数字のみ入力
配置: フォームに、テキストボックスx (xは0から5まで)を配置 動作: テキストボックス1からテキストボックス5に入力するごとに、テキストボックス0 に合計するようにします。 設定: テキストボックスの「IME入力モード」を使用不可に設定
Option Compare Database
Option Explicit
'-------------------------------------------------------------------
Private WithEvents myControl As C_Controls
'-------------------------------------------------------------------
Private Sub Form_Load()
Set myControl = New C_Controls
With myControl
Set .Parent = Me
Call .Init
End With
End Sub
'-------------------------------------------------------------------
Private Sub mycontrol_Change(myCont As Object)
Dim Total As Variant
Dim I As Long
Select Case myCont.Name
Case "テキスト1", "テキスト2", "テキスト3", "テキスト4", "テキスト5"
Total = ValOut(myCont.Text)
For I = 2 To 10 Step 2
If myCont.Name <> "テキスト" & I Then
Total = Total + ValOut(Me("テキスト" & I).Value)
End If
Next I
Me.テキスト0.Value = Total
End Select
End Sub
'-------------------------------------------------------------------
Private Function ValOut(Val As Variant) As Variant
If Nz(Val, "") = "" Then
ValOut = 0
Else
ValOut = CDec(Val)
End If
End Function
'-------------------------------------------------------------------
Private Sub mycontrol_KeyPress(myCont As Object, KeyAscii As Integer)
Select Case myCont.Name
Case "テキスト1", "テキスト2", "テキスト3", "テキスト4", "テキスト5"
If (KeyAscii < Asc("0") And KeyAscii > 31) Or KeyAscii > Asc("9") Then
If KeyAscii = Asc(".") Then
If InStr(myCont.Text, ".") > 0 Then
KeyAscii = 0
End If
Else
KeyAscii = 0
End If
End If
End Select
End Sub
レポートを縮小拡大するプロシージャ
R: 拡大/縮小の比率
1.15 'B5サイズをA4サイズに拡大
0.817 'B4サイズをA4サイズに縮小
Public Sub ReportSizeChange(ReportName As String, R As Double)
Dim NewReportName As String, ctl As Control, rpt As Report, i As Integer
If R = 1 Then
Exit Sub
ElseIf R < 1 Then
NewReportName = ReportName & "_SizeDown"
Else
NewReportName = ReportName & "_SizeUp"
End If
DoCmd.CopyObject , NewReportName, acReport, ReportName
On Error Resume Next
DoCmd.OpenReport NewReportName, acViewDesign
Set rpt = Reports(NewReportName)
If R > 1 Then
rpt.Width = rpt.Width * R
For i = 0 To 8
rpt.Section(i).Height = rpt.Section(i).Height * R
Next
End If
For Each ctl In rpt.Controls
With ctl
.Move .Left * R, .Top * R, .Width * R, .Height * R
.FontSize = Int(.FontSize * R)
End With
Next
If R < 1 Then
rpt.Width = rpt.Width * R
For i = 0 To 8
rpt.Section(i).Height = rpt.Section(i).Height * R
Next
End If
Set rpt = Nothing
End Sub
フォーム内でレコードを保存しようとするたびに変更内容の確認を求める方法
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim strMsg As String
Dim iResponse As Integer
'確認メッセージ
strMsg = "変更があります。更新しますか?" & Chr(10)
strMsg = strMsg & "「はい」「いいえ」をクリックしてください。"
'メッセージの表示
iResponse = MsgBox(strMsg, vbQuestion + vbYesNo, "更新確認?")
'「いいえ」がクリックされた場合
If iResponse = vbNo Then
'変更を戻す
DoCmd.RunCommand acCmdUndo
'手続きのキャンセル
Cancel = True
End If
End Sub
'-------------------------------------------------------------------
Private Sub cmd更新_Click()
Dim strMsg As String
Dim iResponse As Integer
If Not Me.Dirty Then
Msgbox "変更はありません。キャンセルします。"
Exit Sub
End If
'確認メッセージ
strMsg = "更新しますか?" & Chr(10)
strMsg = strMsg & "「はい」「いいえ」をクリックしてください。"
iResponse = MsgBox(strMsg, vbQuestion + vbYesNo, "更新確認?")
If iResponse = vbYes Then
Me.BeforeUpdate = ""
DoCmd.RunCommand acCmdSaveRecord
Me.BeforeUpdate = "[イベント プロシージャ]"
Msgbox "更新されました。"
Else
DoCmd.RunCommand acCmdUndo
Msgbox "更新はキャンセルされました。"
End If
DoEvents
End Sub
グループの縦をグループ名、横を月にした集計を作成
Private Sub Unko()
Dim subSQL As String
Dim mySQL As String
Dim NenTuki() As String
Dim I As Long
'作成する年月の配列を作成
ReDim NenTuki(12)
For I = 1 To 12
NenTuki(I) = StrConv(Format(DateSerial(2021, 3 + I, 1), "geemm"), vbUpperCase)
Next I
'基本となるクエリの作成
subSQL = "SELECT"
subSQL = subSQL & " A.登録番号"
For I = 1 To UBound(NenTuki)
subSQL = subSQL & ", MAX(IIf(A.年月='" & NenTuki(I) & "',A.給油,Null)) AS " & "O_" & NenTuki(I)
subSQL = subSQL & ", MAX(IIf(A.年月='" & NenTuki(I) & "',A.稼働日数,Null)) AS " & "K_" & NenTuki(I)
subSQL = subSQL & ", MAX(IIf(A.年月='" & NenTuki(I) & "',A.走行距離,Null)) AS " & "S_" & NenTuki(I)
Next I
subSQL = subSQL & " FROM"
subSQL = subSQL & " (SELECT"
subSQL = subSQL & " StrConv(Format(X.[シリアル値],'gee') & Format(X.[シリアル値],'mm'),8) AS 年月"
subSQL = subSQL & ", X.登録番号"
subSQL = subSQL & ", X.給油"
subSQL = subSQL & ", X.稼働日数"
subSQL = subSQL & ", X.走行距離"
subSQL = subSQL & " FROM 運行 AS X)"
subSQL = subSQL & " AS A"
subSQL = subSQL & " GROUP BY A.登録番号"
subSQL = subSQL & " ORDER BY A.登録番号"
'出力フィールドの作成
mySQL = "SELECT"
mySQL = mySQL & " B.登録番号"
'月の給油フィールド
For I = 1 To UBound(NenTuki)
mySQL = mySQL & ", B.O_" & NenTuki(I)
Next I
'給油合計フィールド
mySQL = mySQL & ", (0 " '0はダミー
For I = 1 To UBound(NenTuki)
mySQL = mySQL & " + Nz(B.O_" & NenTuki(I) & ",0)"
Next I
mySQL = mySQL & ") AS 給油合計"
'月の稼働日数フィールド
For I = 1 To UBound(NenTuki)
mySQL = mySQL & ", B.K_" & NenTuki(I)
Next I
'稼働日数合計フィールド
mySQL = mySQL & ", (0 " '0はダミー
For I = 1 To UBound(NenTuki)
mySQL = mySQL & " + Nz(B.K_" & NenTuki(I) & ",0)"
Next I
mySQL = mySQL & ") AS 稼働日数合計"
'月の走行距離フィールド
For I = 1 To UBound(NenTuki)
mySQL = mySQL & ", B.S_" & NenTuki(I)
Next I
'年間走行距離フィールド
mySQL = mySQL & ", ("
' 計算期間の有効データを保持する最終月を求めデータを取得する
For I = 12 To 1 Step -1
If I = 12 Then
mySQL = mySQL & " Switch(Not IsNull(B.S_" & NenTuki(I) & "),B.S_" & NenTuki(I)
Else
mySQL = mySQL & ", Not IsNull(B.S_" & NenTuki(I) & "), B.S_" & NenTuki(I)
End If
Next I
mySQL = mySQL & ", True, Nz(B.S_" & NenTuki(1) & "))" 'Switchの最終処理
mySQL = mySQL & " - "
' -計算期間の有効データを保持する最初月を求めデータを取得する
For I = 1 To 12
If I = 1 Then
mySQL = mySQL & " Switch(Not IsNull(B.S_" & NenTuki(I) & "),B.S_" & NenTuki(I)
Else
mySQL = mySQL & ", Not IsNull(B.S_" & NenTuki(I) & "), B.S_" & NenTuki(I)
End If
Next I
mySQL = mySQL & ", True, Nz(B.S_" & NenTuki(12) & "))" 'Switchの最終処理
mySQL = mySQL & ") AS 年間走行距離"
mySQL = mySQL & " FROM (" & subSQL & ") AS B;"
'作成したSQL分を表示
Me.temp = mySQL
'エクセルに出力
Call エクセル(mySQL)
End Sub
レコードセットをエクセルに書き込む
Private Sub エクセル(ByVal mySQL As String)
Dim Rst As Recordset
Dim xls As Object
Dim I As Long
'レコードセットを作成
Set Rst = CurrentDb.OpenRecordset(mySQL)
'Excelオブジェクトを生成
Set xls = CreateObject("Excel.Application")
xls.Visible = True
'新しいブックを追加
With xls.Application.Workbooks.Add
'1行目の1列目からフィールド名を出力
For I = 0 To Rst.Fields.Count - 1
.Sheets(1).Cells(1, I + 1).Value = Rst.Fields(I).Name
Next I
'2行目の1列目からレコードセットを出力
.Sheets(1).Cells(2, 1).CopyFromRecordset Rst
End With
'オブジェクトの参照の破棄
Set xls = Nothing
Rst.Close
Set Rst = Nothing
End Sub