名称マスタリストを作成の3回目です。
さあ、はじめましょう。
-------------------------------------------------------------------
前回は、レポートのレイアウトの作成をしました。
今回は、フォーム上でのVBAを解説します。
1.印刷ボタンについて
1-2.btn印刷_Click()
If intinsatu = 1 Then '印刷確認(有り)
If MsgBox("印刷を開始しますか", (vbYesNo + vbDefaultButton2 + _
vbInformation), "印刷") = vbYes Then
Else
[名称区分コード].SetFocus
Exit Sub
End If
End If
intRet = 印刷処理(2)
印刷をするのかMsgBoxで確認させます。
”はい”を押すと印刷処理(2)を処理させます。
1-3.MsgBoxについて
MsgBox関数
メッセージボックスを表示しユーザーの応答を待ちます。
MsgBox(メッセージ,ボタンとアイコン,タイトル)
メッセージ:表示するメッセージ
ボタンとアイコン:ボタンとアイコンを指示
タイトル:タイトルバーの文字列
分類 値 記号
内容
ボタンの指定 0 vbOKOnly [OK]ボタンだけ
1 vbOKCancel
[OK]と[キャンセル]ボタン
2 vbAbortRetrylgnore [中止]、[再試行]、
[無視]ボタン
3 vbYesNoCancel
[はい]、[いいえ]、
[キャンセル]ボタン
4 vbYesNo
[はい]、[いいえ]ボタン
5 vbRetryCancel
[再試行]、[キャンセル]ボタン
-*-------*-------*-------*-------*-------*-------*-------*-------*-
2.印刷処理()について
Functionで印刷処理を作成して下さい。
Function 印刷処理(insatu_sentaku As Integer) As Integer
'◎ポイント解説 1 -----*-----*-----*-----
Select Case Me![名称区分コード]
Case "全て印刷"
Forms(cFormName_M)![sta名称区分コード] = 0
Forms(cFormName_M)![end名称区分コード] = 999
Case "大分類"
Forms(cFormName_M)![sta名称区分コード] = 1
Forms(cFormName_M)![end名称区分コード] = 1
Case "中分類"
Forms(cFormName_M)![sta名称区分コード] = 2
Forms(cFormName_M)![end名称区分コード] = 2
Case "納品書見出し"
Forms(cFormName_M)![sta名称区分コード] = 3
Forms(cFormName_M)![end名称区分コード] = 3
Case "請求書見出し"
Forms(cFormName_M)![sta名称区分コード] = 4
Forms(cFormName_M)![end名称区分コード] = 4
Case "納品書備考"
Forms(cFormName_M)![sta名称区分コード] = 5
Forms(cFormName_M)![end名称区分コード] = 5
Case "請求書備考"
Forms(cFormName_M)![sta名称区分コード] = 6
Forms(cFormName_M)![end名称区分コード] = 6
Case "回収方法"
Forms(cFormName_M)![sta名称区分コード] = 7
Forms(cFormName_M)![end名称区分コード] = 7
Case "単位"
Forms(cFormName_M)![sta名称区分コード] = 8
Forms(cFormName_M)![end名称区分コード] = 8
End Select
t_RecordSource = "rp_sp_名称マスタリスト"
On Error GoTo Err_印刷処理
Dim stDocName As String
stDocName = "r_名称マスタリスト"
'印刷の処理
If insatu_sentaku = 1 Then
'◎ポイント解説 2 -----*-----*-----*-----
'プレビューの処理
DoCmd.OpenReport stDocName, acPreview
DoCmd.RunCommand 245 '自動調整
Else
'◎ポイント解説 3 -----*-----*-----*-----
'印刷の処理
Call prtReport(stDocName, cnsA4, cns縦), 2)
End If
Forms(cFormName_M)![名称区分コード].SetFocus
Exit_印刷処理:
Exit Function
Err_印刷処理:
'◎ポイント解説 4 -----*-----*-----*-----
If Err = 2501 Then
DoCmd.Close acReport, stDocName, acSaveNo
Application.Echo True
Else
MsgBox "エラーナンバー " & Err.Number & _
vbCrLf & _
Err.Description, vbCritical, "エラー"
End If
Resume Exit_印刷処理
End Function
では、詳しく解説します。
2-1.◎ポイント解説 1 について
フォームに隠しテキストを貼り付けました。
[sta名称区分コード]、[end名称区分コード]です。
別に隠す必要はなかったのですが、こんなやり方もあるんだと
知っておいてください。
[名称区分コード]により"大分類"は1、"中分類"は2、・・・・・
と決まっています。
"全て印刷"は0〜999を入れます。
フォームに数値を渡す。これは解りました。
では、t_RecordSource = "rp_sp_名称マスタリスト"の
ストアドプロシージャにどう渡すのか?
記述されていませんよね。どこで渡すの?
それは、レポートに記述します。(面倒くさいです。)
前回説明しました。
レポートの左上にある黒■(レポートヘッダーの左上)を右クリック
レポートのデータタグに入力パラメータがあります。
そこに以下の命令を入れます。つないで一文で入れてください。
@sta名称区分コード smallint = Forms!名称マスタリスト!sta名称区分コード,
@end名称区分コード smallint = Forms!名称マスタリスト!end名称区分コード
これでセット完了です。
フォームの項目がストアドプロシージャの引数にわたすことが
できました。
2-2.◎ポイント解説 3 について
印刷の処理になります。
印刷では、さまざまな問題が発生します。
プリンターが変わったらレポートを修正したということありませんか?
プリンターが違ったら、印刷がおかしくなった
そんな時、モジュールを作っておくと便利なんです。
用紙は何?、印刷の向きは?これを設定して印刷させます。
Call prtReport(stDocName, cnsA4, cns縦, 2)
今回は、"rp_sp_名所マスタリスト"でA4用紙で縦向きに印刷させます。
"2"のいみですが、印刷時モードのときプレビューを表示させない
処理です。
ご丁寧に印刷をするとプレビューも描画してくれます。
でも、印刷しているのにプレビューを描画させても意味がありません。
だから、表示させないようにしています。
------ 印刷モジュールの設定 -------
Sub prtReport(rptName As String, Psize As Integer, _
Porient As Integer, syori As Integer)
Dim DevString As str_DEVMODE
Dim DM As type_DEVMODE
Dim strDevModeExtra As String
Dim rpt As Report
If syori = 2 Then
Application.Echo False
End If
DoCmd.OpenReport rptName, acViewDesign
Set rpt = Reports(rptName)
If Not IsNull(rpt.PrtDevMode) Then
strDevModeExtra = rpt.PrtDevMode
DevString.RGB = strDevModeExtra
LSet DM = DevString
DM.intPaperSize = Psize
DM.intOrientation = Porient
DM.intCopies = Pcopy
LSet DevString = DM
Mid(strDevModeExtra, 1, 94) = DevString.RGB
rpt.PrtDevMode = strDevModeExtra
Else
MsgBox "用紙設定が出来ません!"
End If
If syori = 1 Then
Else
DoCmd.OpenReport rptName, acViewNormal
DoCmd.Close acReport, rptName, acSaveNo
End If
If syori = 2 Then
Application.Echo True
End If
End Sub
------ 用紙サイズと向きの設定 -------
用紙サイズと向き
'用紙サイズ
Global Const cnsA3 = 8
Global Const cnsA4 = 9
Global Const cnsA5 = 11
Global Const cnsB4 = 12
Global Const cnsB5 = 13
'用紙方向
Global Const cns縦 = 1
Global Const cns横 = 2
2-3.◎ポイント解説 2 について
プレビューの処理です。
1がプレビューで表示、2がプレビューなしで印刷をします。
Call prtReport(stDocName, cnsA4, cns縦, 1)
2-4.ポイント解説 4 について
Err=2501は印刷データなしのエラーステータスです。
印刷でメッセージが出たあとに再度Accessのエラーが
出るための制御をしてます。
印刷時にデータがない場合デザインビューになります。
それを防ぐための処理が
DoCmd.Close acReport, stDocName, acSaveNo
画面が戻ってこないためにする処理です。
Application.Echo True
実験してみてください。
DoCmd.Close acReport, stDocName, acSaveNo
Application.Echo True
がない状態ではどのように動くのか?
この処理があるなしでは大違いです。
3.プレビューボタンについて
1-2.btnプレビュー_Click()
If intpurebyu = 1 Then 'プレビュー確認(有り)
If MsgBox("プレビューを開始しますか", (vbYesNo + vbDefaultButton2
+ _
vbInformation), "プレビュー") = vbYes Then
Else
[名称区分コード].SetFocus
Exit Sub
End If
End If
intRet = 印刷処理(1)
プレビューボタンの処理は印刷処理とほとんど同じです。
印刷処理(1)になり、MsgBoxのメッセージが違うくらいです。
どうでしたか? 参考になったでしょうか?
”次回も名称マスタリストです、レポー内のVBAを解説します。”
===================================================================
◆
実践テクニック、Accessで作るクラサバシステム ◆
Accessでシステムを作るならパソコンを同時接続してクラサバでなければ意味が
ありません。
編集・構成:高橋浩
提供・発行:ティウェア
http://www.1tware.com/index.html
Access2000+MSDE2000、Access2002+MSDE2000、Access2003+MSDE2000で
作る販売管理ソフト、クライアントサーバーシステムを構築
※当メールマガジンに掲載された記事を許可なく転載することを禁じます。
===================================================================
実践テクニック、Accessで作るクラサバシステム(隔週 火曜日発行中)
SEが10年以上の開発ノウハウを惜しみなく完全公開!
|