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 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」とでも検索すれば出てくる。

Access 複数レコード更新 抽出テクニック

Private Sub btn_完納確認_Click()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String

If IsNull(call_外注手配番号) Then
MsgBox (“データが選択されていません。”)
Exit Sub
End If

Dim EndString As Integer
Dim GaityuNumber As String
Dim Samplestring As String

#######201703231903-50362-3の201703231903-50362-までを抽出して更新したい。###
#######50362の部分は桁が変動するので、どうしたらいいのか?困った。###

Samplestring = Me!call_外注手配番号.Value ‘①テキストボックスの値を格納

EndString = InStr(14, Samplestring, “-“) ‘②二個目のハイフンの文字位置を取得

#######最初のハイフンの後ろ14行目から(201703231903-以降からハイフンまで)19行目がハイフン。

GaityuNumber = Mid(Samplestring, 1, EndString) ‘①の値の先頭から、②の位置までの文字列を取得

#######Mid関数で先頭から19行(201703231903-50362-)を抽出された。###

SQL = “SELECT * FROM dbo_outsourcing_running WHERE 外注手配番号 like ‘” & GaityuNumber & “%'”

#######201703231903-50362-以降の複数あるレコードが抽出される。###

###今回使ってない###
‘SQL = “SELECT * FROM dbo_outsourcing_running WHERE 外注手配番号='” & Me!call_外注手配番号 & “‘”
※フォームのテキストボックスにある完全一致のレコードだけを抽出

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

If MsgBox(“実行しますか? yes/no”, vbYesNo, “完納処理確認”) = vbYes Then
If call_完納確認 = “完 納” Then
If MsgBox(“完納取消実行しますか? yes/no”, vbYesNo, “完納取消処理確認”) = vbYes Then

While Not rs.EOF
rs!完納確認 = “取 消”
rs.Update

‘次の行へ
rs.MoveNext
Wend

Me!call_完納確認 = “取 消” ※取消しをクリックしたとき、フォームの場所に取消しをリアルタイムで表示させた。

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
DoCmd.ShowAllRecords
Exit Sub

End If

Else

While Not rs.EOF
rs!完納確認 = “完 納”
rs.Update
‘次の行へ
rs.MoveNext
Wend

Me!call_完納確認 = “完 納” ※完納をクリックしたとき、フォームの完納確認の場所に完納をリアルタイムで表示させた。

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
DoCmd.ShowAllRecords
End If
End If

End Sub

Access VBAでバッチファイル実行

一応、処理前にやるかやらないかの選択実行を設置

Dim objWSH As Object
If MsgBox(“繰越処理を実行しますか? yes/no”, vbYesNo, “繰越処理最終確認”) = vbYes Then

Set objWSH = CreateObject(“WScript.Shell”)
objWSH.Run “d:\LIFE\LIFE繰越データバックアップ.bat”
Set objWSH = Nothing

End If

Access パラメータをVBAで渡してクエリを実行

CSVファイルを出力するのに、クエリにパラメータを設定すると、入力を求められる。
めんどくさいので自動化したい。その時の物です。
エクスポートの定義は手動でやらないとダメですね。

Private Sub web_output_Click()

Const TBL_NAME = “web_pdf_output”
Const RPT_NAME = “repo_web_pdf_output”
Const TBL_NAME0 = “web_pdf_output0”
Const RPT_NAME0 = “repo_web_pdf_output0”
Const PDF_PATH = “D:\NTT\”

Dim Rs As ADODB.Recordset
Set Rs = New ADODB.Recordset

Dim rs0 As ADODB.Recordset
Set rs0 = New ADODB.Recordset

Dim dbs As Database
Dim qdf As QueryDef

Dim myStr As String

DoCmd.SetWarnings False
DoCmd.OpenQuery “repo_all_chage_pdf”, acViewNormal
DoCmd.OpenQuery “repo_all_chage_pdf0”, acViewNormal

Do While True
myStr = InputBox(“yyyymmの形式を入力してください。”)

‘—(1)キャンセルしたとき
If StrPtr(myStr) = 0 Then
MsgBox “キャンセルします”
Exit Sub

‘—(2)空欄のまま[OK]したとき
ElseIf myStr = “” Then
MsgBox “未入力です”, vbExclamation

‘—(3)入力文字が6文字より長いとき
ElseIf Len(myStr) > 6 Then
MsgBox “文字が長すぎます”, vbExclamation

Else
‘—(4)入力文字が6文字以内のとき
MsgBox “入力された文字列は「” & myStr & “」です”
GoTo Nextjob
End If
Loop

Nextjob:

Rs.Open “SELECT DISTINCT FID FROM web_pdf_output”, CurrentProject.Connection, adOpenStatic, adLockReadOnly

Do Until Rs.EOF

DoCmd.OpenReport RPT_NAME, acViewPreview, , “FID=” & Rs!FID, acWindowNormal
DoCmd.OutputTo acOutputReport, RPT_NAME, acFormatPDF, PDF_PATH & Rs!FID & “0000” & myStr & “.PDF”
DoCmd.Close
Rs.MoveNext
Loop

rs0.Open “SELECT DISTINCT ID FROM web_pdf_output0”, CurrentProject.Connection, adOpenStatic, adLockReadOnly

Do Until rs0.EOF

DoCmd.OpenReport RPT_NAME0, acViewPreview, , “ID=” & rs0!ID, acWindowNormal
DoCmd.OutputTo acOutputReport, RPT_NAME0, acFormatPDF, PDF_PATH & rs0!ID & myStr & “.PDF”
DoCmd.Close
rs0.MoveNext
Loop
rs0.Close

DoCmd.SetWarnings False
DoCmd.DeleteObject acTable, “web_renkei_csv”
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs(“output_web_data”)
With qdf
.Parameters(“tsuki”) = myStr
.Execute
End With

DoCmd.TransferText _
TransferType:=acExportDelim, _
specificationname:=”Web_renkei_csv エクスポート定義”, _
TableName:=”web_renkei_csv”, _
FileName:=”D:\NTT\webdatajoy_” & Format(Date, “yyyymmdd”) & “.txt”

End Sub

Access VBAの中でクエリーの実行

更新クエリの場合

DoCmd.SetWarnings False ’メッセージを表示させないようにしている。
DoCmd.OpenQuery “repo_all_chage_pdf”, acViewNormal
DoCmd.OpenQuery “repo_all_chage_pdf0”, acViewNormal

選択クエリの場合

DoCmd.OpenQuery “クエリSELECT”, acViewNormal, acEdit

でも、選択クエリをVBAで使う事ってあるかな!?

Access フォームからレコードをコピー

フォームで新規レコードにするときに、前のレコードをコピーできたらなーって思う事がある。その方法を記す。

フォームにボタンを設置してVBAで処理すればOK

Private Sub コマンド46_Click()
Dim F1, F2, F3, F4, F5

F1 = Me.システム番号
F2 = Me.日付
F3 = Me.受注番号
F4 = Me.得意先メーカー番号
F5 = Me.得意先メーカー名

DoCmd.GoToRecord , , acNewRec

Me.システム番号 = F1 + 1
Me.日付 = F2
Me.受注番号 = F3 + 1
Me.得意先メーカー番号 = F4
Me.得意先メーカー名 = F5
Me.受注製品コード = “JOY”  JOYを強制的に入力
Me.受注製品名 = “運賃”   運賃を強制的に入力

End Sub

Access 表の上(非連結テキストボックス)で入力したデータ追加

アクセスの表表示では、一番下から新規追加になっていくので、データが増えていくとスクロールして、一番下までいってから登録したりするようになり、大変不便です。

そこで、一番上に、非連結入力テキストボックスを設置して、追加ボタンで追加する方法を記す。

(1)帳票フォームの各項目をコピーして、フォームヘッダーにコピーする。
(2)次に必要項目だけ残して非連結にする。※コントロールを消す。
(3)その非連結の名前の前に、nを付ける。
(4)下記のVBAをボタンにすればOK。※ボタン名はcmdAddNewにした。

Private Sub cmdAddNew_Click()
Dim fld As DAO.Field
With Me.RecordsetClone
.AddNew
!ID = Forms![data_id]![ID] ‘フォームのIDをそのまま代入
!登録日 = n登録日
!カテゴリ = nカテゴリ
!サービス名 = nサービス名
!料金 = n料金
!支払種別 = n支払種別
!担当者 = n担当者
!備考 = n備考

For Each fld In .Fields  ’このエリアは、データ追加後、非連結ボックス内を消している。
Me(“n” & fld.Name) = Null
Next
.Update
End With
Me.Requery
End Sub

下記は参考サイト

http://tsware.jp/study/vol16/vbabegin_40.htm

Access 標準モジュールについて

アクセスのメニューを見ると、標準モジュール、クラスモジュール、VisualBasicとある。
この違いはなんだ?

結果は、よくわからない・・・困った。しかし、標準をモジュールを使っていれば間違いないようだ。
sub functionの違いは・・・困った。
・Subプロシージャ 戻り値を返さない
・Functionプロシージャ 戻り値を返す

結局は、私レベルの人間は、標準プロシージャを作成して、その内容は、Public Functionで作成して、マクロから、プロシージャの実行を選択して、test()っていれれば、マクロから実行してくれる。

Public Function test()
実行プログラム
End Function

こんな感じだね。