会社員プログラマー「Kaia May」のコードの備忘録サイトです〜!

AcessVBAで全銀協規定フォーマットで総合振込ファイルを作成する方法

全銀協規定フォーマットで総合振込ファイルを作成する必要があったのでメモ。

フォーマットはどこの金融機関でも一緒だけど、記載するデータは少し違ったりするので、事前に金融機関に確認が必要。

振込元(振込依頼人=あなたの会社)もテーブル(本コードでは「総振_振込元」テーブル)で必要事項をフィールドごとに入力したものを事前に作ってある。

振込データのもとになるクエリ(本コードでは「総合振込データ確認」クエリ)も作成しておく必要がある。
このクエリで、振込先データと振込件数・合計振込金額をSQLで出力するので。

固定長のデータなので、変数は「Dim 変数名 As String*桁数」で指定しておくとファイルに桁数が固定された形で代入される。
あと数値とかはFormat関数とかでうまく調整して正しく出力されるようにすること。

クエリ名とかテーブル名は英語のほうがいいんだと思うけど、日本語です。

 

Private Sub btn1_Click()
'■総合振込ファイル作成
On Error GoTo Err_bn1_click

Dim wFilePass As String '出力ファイル名(フルパス)
Dim intFF As Integer 'FreeFile値
Dim wvarOutput As Variant '出力文字列

▼デスクトップにファイルを出力するフルパスを指定

'ファイルフルパス
wFilePass = CreateObject("WScript.Shell").Specialfolders("Desktop") & "\" & "総振DATA" & Format(Date, "yyyymmdd") & ".DAT" '>>>>>// データ確認(同じファイル名があったら削除) //<<<<<
If Dir(wFilePass, vbNormal) <> "" Then
Kill (wFilePass)
End If

'データ出力
' FreeFile値の取得(以降この値で入出力する)
intFF = FreeFile

' 指定ファイルをOPEN(出力モード)
Open wFilePass For Output As #intFF」

▼ヘッダーレコードを書き込み
総振_振込元テーブルを作ってあるので、そこからレコードセットでデータを引っ張ってきて、変数に代入。
一行目をファイルに書き込む。

'①ヘッダーレコード部分■■■■■■
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("総振_振込元", dbOpenDynaset)

Dim HeaderRecord, CharType, Shumoku As String * 1
Dim Shubetu As String * 2
Dim BranchCode As String * 3
Dim Furikomibi, bankcode As String * 4
Dim AccoutNum As String * 7
Dim IraininCode As String * 10
Dim bankname As String * 15
Dim BranchName As String * 15
Dim Dummy17 As String * 17
Dim IraininName As String * 40

HeaderRecord = "1" '(データ区分)ヘッダーレコード
Shubetu = "21" '(種別コード)21は総合振込を意味する
CharType = "0" '(コード区分)(0は文字コードのJISを意味する)
IraininCode = rs!振込依頼人コード
IraininName = rs!振込依頼人名
Furikomibi = Format(Me.振込指定日, "mmdd") '振込指定日
bankcode = Format(rs!振込元銀行コード, "0000") '金融機関コード
bankname = rs!振込元銀行名
BranchCode = rs!振込元支店コード '支店コード
BranchName = rs!振込元支店名
Shumoku = Format(rs!振込元預金種目, "0")
AccoutNum = Format(rs!振込元口座番号, "0000000") '口座番号

wvarOutput = HeaderRecord & Shubetu & CharType & IraininCode & IraininName & Furikomibi & bankcode & bankname & BranchCode & BranchName & Shumoku & AccoutNum & Dummy17

Print #intFF, wvarOutput

Set rs = Nothing

▼データレコードを出力
振込データを出力して2行目以降を書き込む。
元となるデータは「総合振込データ確認」クエリで作っておき、出金日(=振込指定日)で絞り込んで、レコードセットで取り出し、変数に代入して、つなげて書き込んでいく。

'②データレコード部分■■■■■■
Dim DataRecord, Cust_Shumoku, NewCode, FurikomiShitei As String * 1
Dim Shikibetu As String * 1
Dim Cust_BranchCode As String * 3
Dim Cust_BankCode As String * 4
Dim Tegata As String * 4
Dim Cust_AccountNum As String * 7
Dim Yobi7 As String * 7
Dim TransferAmount As String * 10
Dim CustCode1 As String * 10
Dim CustCode2 As String * 10
Dim Cust_BankName As String * 15
Dim Cust_BranchName As String * 15
Dim CustName As String * 30

DataRecord = "2" '(データ区分)データレコード
NewCode = "1" '(新規コード)0はその他であることを意味する

Dim Str As String
Str = "SELECT * FROM 総合振込データ確認 WHERE 出金日 = #" & Format(Me!振込指定日, "yyyy/mm/dd") & "#"

Set rs = db.OpenRecordset(Str, dbOpenDynaset)

If Not rs.EOF Then
rs.MoveFirst

Do Until rs.EOF
Cust_BankCode = rs!金融コード
Cust_BankName = rs!金融機関名
Cust_BranchCode = rs!支店コード
Cust_BranchName = rs!支店名称
Cust_Shumoku = rs!預金種目
Cust_AccountNum = Format(rs!口座, "0000000")
CustName = rs!口座名義
TransferAmount = Format(rs!支給額, "0000000000")
CustCode1 = " "
CustCode2 = " " & Format(rs!事業所, "000000")
Shikibetu = " "

wvarOutput = DataRecord & Cust_BankCode & Cust_BankName & Cust_BranchCode & Cust_BranchName & Tegata & Cust_Shumoku & Cust_AccountNum & CustName & TransferAmount & NewCode & CustCode1 & CustCode2 & FurikomiShitei & Shikibetu & Yobi7

Print #intFF, wvarOutput

rs.MoveNext
Loop
Else
MsgBox "指定された振込データはありません。", vbCritical + vbOKOnly, "振込データ無し"
Exit Sub
End If

Set rs = Nothing

▼トレーラーレコードを出力
振込件数や合計振込金額などを書き込む部分。
元となる「総合振込データ確認」クエリより出金日(=振込指定日)で絞り込み振込件数と合計振込金額をSQLで取り出して、変数に代入して、つなげて、書き込む。

'③トレーラーレコード部分■■■■■■
Dim TrailerRecord As String * 1
Dim FurikomiKensu As String * 6
Dim FurikomiGokei As String * 12
Dim Dummy101 As String * 101

TrailerRecord = "8"

'振込件数取得
Str = "SELECT COUNT(*) AS 振込件数 FROM 総合振込データ確認 WHERE 出金日 = #" & Format(Me!振込指定日, "yyyy/mm/dd") & "#"

Set rs = db.OpenRecordset(Str, dbOpenDynaset)

FurikomiKensu = Format(rs!振込件数, "000000")

Set rs = Nothing

'振込金額取得
Str = "SELECT SUM(支給額) AS 合計振込金額 FROM 総合振込データ確認 WHERE 出金日 = #" & Format(Me!振込指定日, "yyyy/mm/dd") & "#"

Set rs = db.OpenRecordset(Str, dbOpenDynaset)

FurikomiGokei = Format(rs!合計振込金額, "000000000000")

wvarOutput = TrailerRecord & FurikomiKensu & FurikomiGokei & Dummy101
Print #intFF, wvarOutput

▼エンドレコードを出力
最後のレコードを書き込む。

'④エンドレコード部分■■■■■■
Dim EndRecord As String * 1
Dim Dummy119 As String * 119

EndRecord = "9"

wvarOutput = EndRecord & Dummy119
Print #intFF, wvarOutput

' 指定ファイルをCLOSE■■■■■■
Close #intFF

rs.Close
Set rs = Nothing
db.Close
Set db = Nothing

MsgBox "デスクトップに「総振DATA" & Format(Date, "yyyymmdd") & ".DAT」が作成されました。", vbInformation, "総合振込ファイル作成完了"

Exit_bn1_Click:
DoCmd.SetWarnings True
DoCmd.Hourglass False
std = SysCmd(acSysCmdSetStatus, " ")
Exit Sub
Err_bn1_click:
MsgBox Err.Description
Resume Exit_bn1_Click

End Sub

>bokucode

bokucode

遅ればせながらプログラミングを始めた静岡在住の30代の会社員プログラマー「Kaia May」です!
いろんな言語のコードに挑戦していきたいと思っていて、その中でメモしておきたいコードや今後も使えるコードやその説明などを記録していきます。
他にも参考になったおすすめサイトや書籍なども紹介していきます。

CTR IMG