Microsoft Access 掲示板

ランダムな数値を作る方法

5 コメント
views
4 フォロー

新規レコードをつくったときに、ランダムな0000-0000-ランダムな英数4桁
とうものをつくり、伝票番号にしたいです
どのようにしたらよいでしょうか?

はな
作成: 2023/10/21 (土) 19:35:08
通報 ...
1
りんご 2023/10/21 (土) 22:23:04 935bc@0e907

伝票番号のために、わざわざそんなものを作らないといけないの?

2
はな 2023/10/21 (土) 23:09:34 0237b@03826

連番ですと、相手に売上規模を知られるので
完全にランダムにしたいです
Excelでは
=BASE(RANDBETWEEN (0,9999),10,4)&"- "&BASE (RANDBETWEEN (0,9999),10,4)&"- "&BASE (RANDBETWEEN (0,1679615),36,4)
としていました

3
りんご 2023/10/22 (日) 14:15:50 935bc@0e907

連番ですと、相手に売上規模を知られるので
 
 売上規模を知られると何か不味いのでしょうか?優良誤認を期待しているのでしょうか?
 連番だろうがランダムだろうが、売上規模なんてものは、取引相手に自然に伝わります。

4

Excelでは
=BASE(RANDBETWEEN (0,9999),10,4)&"- "&BASE (RANDBETWEEN (0,9999),10,4)&"- "&BASE (RANDBETWEEN (0,1679615),36,4)
としていました

それだと伝票番号が重複する可能性がないとは言えませんよね。
セルに設定した式なら、更新するたびに変化するし。
VBAで値に変換して重複チェックしているのでしょうか。


Accessでするなら、
オートナンバー型のフィールドで、新規レコードの値を「ランダム」に設定しておけば、重複しないランダムな値を発番してくれます。
それをつかって、加工すればどうでしょうか。

5

オートナンバー型を0000-0000-ランダムな英数4桁に加工するのは面倒そうなので、
エクセルと同様の方法で生成して重複チェックをして発番する方法を考えてみました。

まずは、BASE関数に相当するものがAccessにはないので、それを自作します。
標準モジュールに下記の関数を作成します。

Function MyBase(数値 As Long, 基数 As Long, 桁数 As Long) As String
    Const num = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Dim q As Long   '商
    Dim r As Long   '余り

    If 基数 <= 1 Or 基数 > 36 Or 数値 < 0 Then
         Exit Function
    End If

    q = 数値
    Do
        r = q Mod 基数
        q = q \ 基数
        MyBase = Mid(num, r + 1, 1) & MyBase
    Loop While q > 0

    MyBase = Right(String(桁数, "0") & MyBase, 桁数) 
End Function

入力フォームの挿入前処理に下記のコードを設定する。

Private Sub Form_BeforeInsert(Cancel As Integer)
    Randomize
    Dim DNum As String    
    Do
        DNum = Format(Int(Rnd * 99999999), "0000-0000-") & MyBase(Rnd * 1679615, 36, 4)
    Loop Until IsNull(DLookup("伝票番号", "テーブル1", "伝票番号='" & DNum & "'"))
    Me.伝票番号 = DNum
End Sub

これで新規レコード入力時に、重複しない伝票番号が発行されます。