Access VBAでの印刷プレビュー

Private Sub 表示印刷_Click()

On Error GoTo Err_表示印刷_Click

Dim stDocName As String

stDocName = “mrepo_outsourcing_maker”
DoCmd.OpenReport stDocName, acPreview

※上の””にレポート名をいれればOK

Exit_表示印刷_Click:
Exit Sub

Err_表示印刷_Click:
MsgBox Err.Description
Resume Exit_表示印刷_Click

End Sub

Access 数値型 標準

書式設定の数値型と標準の違いが分からない。

プロパティで、小数点以下の設定ができるのでどっちも同じように思えるが、

数値型だと、入力したそのままの表示らしい。

標準型だと、桁区切りが入って、小数点第2(第3は四捨五入)のようだ。

いづれにしても、カンマ区切りを入れれば同じだし、小数点以下を0設定にしておけば、小数点以下が無い場合の数値においては、どっちでもいいってことだと判断する。

数値データ型および通貨データ型の書式を選択する

数値や通貨の値を表示するフィールドまたはコントロールに特定の書式プロパティ設定を選択していない場合、数値は [標準] の表示形式で、通貨の値は [通貨] の表示形式で表示されます。

数値および通貨の各データ型について用意されている定義済み書式の一覧とその説明

●General Number/数値

(既定) 入力したとおりの数値が表示されます。小数点の左側または右側に 11 桁まで表示できます。11 桁を超える数値の場合、またはコントロールの幅が足りなくてすべての桁を表示できない場合は、数値が四捨五入されます。小数点の右側または左側が 10 桁を超える非常に大きい (または小さい) 数値については、指数形式が使用されます。

123.456

●Currency/通貨

Windows の地域設定で指定されている通貨記号と書式を表示します。

¥123,456

●Fixed/固定

桁区切り記号なしで、小数点以下 2 桁を含む数値を表示します。フィールドに小数点以下 3 桁以上の値が格納されている場合は、小数点以下 2 桁に切り捨てられます。

1234.56

●Standard/標準

桁区切り記号および小数点以下 2 桁を含む数値を表示します。フィールドに小数点以下 3 桁以上の値が格納されている場合は、小数点以下 2 桁に切り捨てられます。

1,234.56

●Percent/パーセント

数値をパーセントとして、最後にパーセント記号を付けて小数点以下 2 桁まで表示します。基になる値に小数点以下 5 桁以上の値が含まれている場合は、切り捨てられます。

123.50%

●Scientific/指数

数値を指数表記で表示します。

Access ADO 更新

ADOによるレコードセットを使った更新方法を記載しておく。

Private Sub btn_更新_Click()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String

On Error GoTo ErrRtn

SQL = “SELECT * FROM dbo_accounts WHERE MNO =” & Me!edit_MNO & “”

Set cn = CurrentProject.Connection
rs.Open SQL, cn, adOpenKeyset, adLockOptimistic

cn.BeginTrans

While Not rs.EOF

If rs!MNO = edit_MNO Then
rs!前月末残高 = edit_残高
Else
MsgBox (“一致するメーカーNOが存在しません。”)
End If

rs.Update
rs.MoveNext
Wend

cn.CommitTrans

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

ExitErrRtn:
DoCmd.ShowAllRecords
Exit Sub

ErrRtn:
MsgBox “エラー: ” & Err.Description

cn.RollbackTrans
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

End Sub

Access 一覧表示フォームでの検索

抽出じゃなくて、そのレコードまで移動する場合の方法

Private Sub MNO検索_AfterUpdate()

DoCmd.GoToControl “txt_MNO”
DoCmd.FindRecord MNO検索

If InStr(Me!txt_MNO, MNO検索) = 0 Or Null Then
MsgBox “該当レコードはありません。”
End If

MNO検索 = Null
End Sub

ちなみにテキストのあいまい検索の場合は、

Private Sub メーカー名検索_AfterUpdate()
DoCmd.GoToControl “txt_メーカー名”
DoCmd.FindRecord “*” & メーカー名検索 & “*”

メーカー名検索 = Null
End Sub

レコードない場合の表示機能は調べる時間が無かった。

Access Dlookup 非連結テキストボックスに表示

レポートにて、あるテーブルからDlookupである条件のレコードフィールドを引っ張ってきたかったが、なかなかできなかった。

=DLookUp(“月次処理年月”,”dbo_mst_月次”,[終了確認]=”作業中”)

dbo_mst_月次 テーブル

JNO 月次処理年月 終了確認
1   2017/01/01   終了
2 2017/02/01 終了
3 2017/03/01 作業中
4 2017/04/01

2017/03/01 を出したいのに、2017/01/01がでます。そして、結論は?

=DLookUp(“[月次処理年月]”,”dbo_mst_月次”,”[終了確認]=’作業中'”)

ポイントは、
1.条件式部分全体をダブルクォーテーションでくくる
2.=の後は、数値ならそのまま、文字列ならシングルクォーテーションでくくる
3.変数で指定する場合は”[終了確認]=” & 変数 & “)”
となります。

Access 四捨五入

Accessには、四捨五入を行うための関数がない。四捨五入したいときは、Int関数やFix関数を利用します。下記の(1)と(2)の式は、[数値]が正の場合同じ結果になりますが、負数の場合、「0.5」の処理が異なります。(2)のほうが一般的、負数を考慮する必要がない場合は(1)のほうが式が単純で簡単。

(1) Int([数値] + 0.5)
 ・[数値]フィールドが「1.4」の場合、戻り値は「1」
 ・[数値]フィールドが「1.5」の場合、戻り値は「2」
 ・[数値]フィールドが「1.6」の場合、戻り値は「2」
 ・[数値]フィールドが「-1.4」の場合、戻り値は「-1」
 ・[数値]フィールドが「-1.5」の場合、戻り値は「-1」 ← 負数の「0.5」を数値が大きくなるほうに処理する
 ・[数値]フィールドが「-1.6」の場合、戻り値は「-2」

(2) Fix([数値] + 0.5 * Sgn([数値]))
 ・[数値]フィールドが「1.4」の場合、戻り値は「1」
 ・[数値]フィールドが「1.5」の場合、戻り値は「2」
 ・[数値]フィールドが「1.6」の場合、戻り値は「2」
 ・[数値]フィールドが「-1.4」の場合、戻り値は「-1」
 ・[数値]フィールドが「-1.5」の場合、戻り値は「-2」 ← 負数の「0.5」を絶対値が大きくなるほうに処理する
 ・[数値]フィールドが「-1.6」の場合、戻り値は「-2」

四捨五入を小数点第2位や小数点第3位で行いたい場合は、小数点の位置をずらして四捨五入をしてから、小数点の位置を戻す。たとえば「1.24を1.2」、「1.25を1.3」というように小数点第2位を四捨五入したい場合は、数値を10倍して四捨五入してから10で割る。

(1) Int([数値] * 10 + 0.5) / 10
(2) Fix([数値] * 10 + 0.5 * Sgn([数値])) / 10

また、「1.234を1.23」、「1.235を1.24」というように小数点第3位を四捨五入したい場合は、数値を100倍して四捨五入してから100で割ります。

(1) Int([数値] * 100 + 0.5) / 100
(2) Fix([数値] * 100 + 0.5 * Sgn([数値])) / 100

同じ考え方で、10の位や100の位の数値を四捨五入することもできます。たとえば「1234を1200」、「3456を3500」というように10の位を四捨五入するには、数値を100で割って四捨五入してから100倍します。「単価を切りよく100円単位で揃えたい」というようなときに便利です。

(1) Int([数値] / 100 + 0.5) * 100
(2) Fix([数値] / 100 + 0.5 * Sgn([数値])) * 100

Access 更新で少数点以下が削除される

VBAにて、あるテーブルの値にて、更新したら、小数点以下が削除された。

結局は、更新する側のテーブルのフィールドが、floatじゃなかったということだけ。

int形式は、整数だけなので、少数まで扱いたい場合は、floatにする。

Access 別テーブルの値で更新する

Private Sub データ更新_Click()
Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim SQL As String

On Error GoTo ErrRtn

Set cn = CurrentProject.Connection
cn.BeginTrans

#########前は、下の内容でよかったのに、今回は、演算子がないというエラー########
‘SQL = “UPDATE ”
‘SQL = SQL & “dbo_accounts ”
‘SQL = SQL & “SET 当月金額 = test.合計 ”
‘SQL = SQL & “FROM dbo_accounts INNER JOIN test ”
‘SQL = SQL & “ON dbo_accounts.MNO = test.MNO”
################################################
####結局下記のようにしてOKになった。#####
SQL = “UPDATE ”
SQL = SQL & “dbo_accounts ”
SQL = SQL & “INNER JOIN test ”
SQL = SQL & “ON dbo_accounts.MNO = test.MNO ”
SQL = SQL & “SET 当月金額 = test.合計 ”

cmd.ActiveConnection = cn
cmd.CommandText = SQL
cmd.Execute

cn.CommitTrans

cn.Close: Set cn = Nothing

ExitErrRtn:
Exit Sub

ErrRtn:
MsgBox “エラー: ” & Err.Description

cn.RollbackTrans
cn.Close: Set cn = Nothing

End Sub

Access 並び替えが変わるのを防ぐ方法

フォームでテーブルのデータを表示していて、なにかVBA処理のボタンなどを押して更新すると、並びが、変わってしまう場合がある。よくあるのが、主キーの順番になってしまう場合がある。

それを指定した並び替えにプロパティーなどで設定しているにも関わらず、並びが変わってしまう。

VBAの処理の中に、下記の1行を最後に入れておけば最後に並びを戻すことができる。

DoCmd.SetOrderBy “JNO DESC”

Access SQLでデータの更新

SQL = “UPDATE ”
SQL = SQL & “dbo_stock_parts ”
SQL = SQL & “INNER JOIN ”
SQL = SQL & “job_product_parts_calc ON ”
SQL = SQL & “(dbo_stock_parts.HNO = job_product_parts_calc.HNO AND ”
SQL = SQL & “job_product_parts_calc.JNO = ” & Me!JNO & “) ”
SQL = SQL & “SET ”
SQL = SQL & “在庫数 = 在庫数 + job_product_parts_calc.計算数”

dbo_stock_partsテーブルには、JNO,HNO,在庫数フィールドがあり、job_product_parts_calcテーブル内には、JNO,HNO,計算数が存在する。

この2つのテーブルでHNOで一致しているものと、フォーム内のJNOが一致しているjob_product_parts_calc内の計算数で、dbo_stock_partsテーブルの在庫数を更新させるSQLになる。

実際に使っている例題は、この備忘録で、「VBA SQL」とでも検索すれば出てくる。