バイナリモードでの読み書き (自動発番管理サンプル)

「バイナルモード」とは「改行」や「セパレータ文字」に関係なく、ファイル内の指定位置(バイト数換算)を読み出したり、書き込んだりするモードです。動作から説明します。「バイナルモード」と言いますが、このサンプルは「ランダムレコード」処理です。
採番ファイルより一連番号を受け取る
(画像をクリックすると、このサンプルがダウンロードできます)
「採番ファイルより一連番号を受け取る」のボタンをクリックする都度、一連番号が1ずつカウントアップされてメッセージで表示されるサンプルです。テキストファイルを登録させる処理をよく作成するのですが、ネットワーク上の複数箇所で運用することがほとんどなので、ファイル名に一連番号を付加して重複した名前にならないようにしています。そのため、このような採番ファイル管理を良く使います。
採番ファイルより一連番号を受け取る
ワークシート上に隠した項目を用意しておいて、そこでカウントするなどは簡単ですが、このサンプルでは、保存せずに終了して、また開いてボタンをクリックしても正しくカウントアップされます。Windows再起動後でも同じです。
今回は「サンプル」なので、採番ファイルをローカルディスクに置きますが、ネットワーク上に置いて動作するようにすれば、複数のPCから同じワークブックを開いてボタンをクリックしても正しく採番されるのが判るはずです。
採番ファイルより一連番号を受け取る
採番ファイルは「C:\TEST_NUMBER.txt」として作成されます。レコードはこのメモ帳の表示のようにセットされます。採番ファイルを削除すると、採番値は「1」に戻ります。

この処理のソースコード記述は以下の通りです。


'***************************************************************************************************
'   バイナリモードでの読み書きサンプル                              Module1(Module)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'03/07/25(1.00)新規作成
'12/01/28(1.01)初回修正
'20/02/27(1.10)*.xlsm化、他
'***************************************************************************************************
Option Explicit
Option Private Module
'===================================================================================================
Private Const g_cnsTitle As String = "採番ファイル更新処理"
Private Const g_cnsFilename As String = "C:\TEMP\TEST_NUMBER.txt"   ' ←①環境に応じて変更して下さい
Private Const g_cnsPrefix As String = "NUMBER="
Private Const g_cnsFormat As String = "0000"

'***************************************************************************************************
'   ■■■ ワークシート側からの呼び出し処理 ■■■
'***************************************************************************************************
'* 処理名 :UpdateBinaryFile1
'* 機能  :バイナリモードでの読み書きサンプル
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年07月25日
'* 作成者 :井上 治
'* 更新日 :2020年02月27日
'* 更新者 :井上 治
'* 機能説明:採番ファイルから新しい一連番号を受け取るサンプル
'* 注意事項:サンプルなのでエラー処理は行なっていません
'***************************************************************************************************
Sub UpdateBinaryFile1()
    '-----------------------------------------------------------------------------------------------
    Dim intFF As Integer                                            ' FreeFile値
    Dim intNumber As Integer                                        ' 一連番号
    Dim intLen As Integer                                           ' 文字列長
    Dim strRec As String * 11                                       ' レコード内容
    intLen = Len(g_cnsPrefix)
    ' FreeFile値の取得(以降この値で入出力する)
    intFF = FreeFile
    ' ②指定ファイルをOPEN(バイナリモード:排他OPEN)
    Open g_cnsFilename For Binary Lock Read Write As #intFF
    ' ③レコードの受取り
    Get #intFF, 1, strRec
    ' ④初回のファイル処理か判断
    If Left$(strRec, intLen) = g_cnsPrefix Then
        ' ⑤初回でなければ前回の値を取得して1を加える
        intNumber = CInt(Mid$(strRec, intLen + 1))
        ' ⑥このサンプルでは採番は4桁で繰返す
        If intNumber >= 9999 Then
            intNumber = 1
        Else
            intNumber = intNumber + 1
        End If
    Else
        ' 初回は初期値をセット
        intNumber = 1
    End If
    ' ⑦書き戻すレコードを編集
    strRec = g_cnsPrefix & Format$(intNumber, g_cnsFormat)
    ' ⑧レコードの出力(同位置で置き換える)
    Put #intFF, 1, strRec & vbCrLf
    ' 指定ファイルをCLOSE
    Close #intFF
    ' 番号の表示
    MsgBox "今回の一連番号は、" & intNumber & "番です。", vbInformation, g_cnsTitle
End Sub

'----------------------------------------<< End of Source >>----------------------------------------
ソースコード中のコメントに丸数字がある部分の説明をいたします。
機能概要説明
「採番ファイル」のフルパスファイル名を指定します。
フォルダは実在している必要がありますが、ファイルは初回は自動的に作成されるので事前作成は不要です。 このソースコードのままで利用される場合はCドライブに「TEMP」というフォルダが必要です。(大文字、小文字は問いません)
※必要に応じて変更して下さい。
バイナリモードでのファイルOPENです。
For Binary」がバイナリモードの指定で「Lock Read Write」なのでCloseまでの間、読み書きともにロックされますが一瞬のことです。 本サンプルではエラー処理を行なっていないので、同時アクセスの場合は不成功側は実行時エラーになります。
排他制御(不成功時再試行)を含めたものは「自動採番機能(ダウンロード)をご覧下さい。
ファイルの先頭から11バイトを読み込みます。
読み込んだ内容は変数「strRec」に格納されます。
本処理で書き出された場合はファイルの先頭に「NUMBER=」が書き出されるので、それがあるか確認しています。
NUMBER=」がある場合は⑤に進み、なければ初期採番値は「1」として処理されます。
NUMBER=」の右4桁を取り出し、数値に変換しています。
前回の採番値に「1」を加えるのですが、このサンプルでは採番値の上限は4桁なので「9999」としており、 これを超える場合は「1」に戻ります。
プレフィックスの「NUMBER=」に採番した値(前ゼロを付けて4桁編集)を付加した書き出しレコードを編集します。
編集したレコードをファイルの先頭から書き出します。念のため改行コードを付加しています。
この後、ファイルをCLOSEし、メッセージボックスで採番値を表示させています。



このような機能を関数化したものを「ダウンロード」「自動採番機能(オートナンバー)に用意しています。
こちらは複数箇所から同時に採番動作が起こっても排他を掛けてランダム値の時間数ウェイトさせてから再試行する仕組みになっています。

値をセルに格納しておいて1を加えれば...   値をセルに格納しておいて1を加えれば良いのでは、と思っていませんか?
それで済むケースもあるかも知れませんが、以下の問題があります。
○ワークブックを保存しないと二重採番が発生してしまう。
○複数の人が操作することが考慮されていない。
ここでのサンプルならこれらについてもある程度対応できるものだと思います。