- ベストアンサー
アクセスで特別な32進数
こんにちは。ご教授願います。 桁数を減らそうと特殊な32進数を使いたいと思います。 0~9,A,B,C...Zなのですが、紛らわしい英字を省きます。 省く物は[D,I,O,Q]です。 よって10(数字)+22(英字)=32にしたいのですが、 更にこれを「自動採番」にする事と「入力ミス判断」をしたいのです。 自動採番では、子ウインドウが現れた時に次の採番を行い、 入力ミス判断では、間違って手で入力した際は、自動的に次の文字へジャンプか、 エラーメッセージ処理をしたいのです。 今回、質問の中に3点の質問が書かれていますので、 もし不都合が有る場合は3項目に分けますのでどうぞご指示願います。 どうぞ宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
取り急ぎの解答ですので、テストが十分ではないことをお詫びしておきます。 (1)最終採番済みの番号をIとし、ディスクのエリアに 記録しておきます。 (2)採番リクエストがあると、上記ディスクのエリアに 記録された番号を読み、+1します(それをiとす る。 ) (3)その番号を持って(引数をiとして)、サブルーチンに 飛びます。 (4)iから番号記号を作るルーチンは下記が一例です。 (5)エクセルでテストしました。番号記号をじっくり (正しいか)吟味してください。 (エクセルシートの行番号と番号記号を見比べてチ ェ ックしてください。それがエクセルVBAで書い た ねらいです。) (6)サブルーチンの例 Sub test01() tbl = "0123456789abcefghjklmnprstuvwxyz" For i = 1 To 65300 n = i x = "" '------ p01: a = n Mod 32 c = Mid(tbl, a + 1, 1) x = c & x b = Int(n / 32) If b = 0 Then GoTo p02 n = b GoTo p01 '------ p02: Cells(i, 1) = x Next i End Sub
その他の回答 (3)
- maruru01
- ベストアンサー率51% (1179/2272)
再びmaruru01です。 すでにimogasiさんが変換プログラムを出しているのでなんですが、補足要求した手前、載せます。 なお、Access2000で作りました。 Public Function ChangeFromD(Num As Long, n As Long) As String Dim temp() As Long Dim a As Long Dim i As Long Dim str As String ReDim temp(n - 1) a = Num str = "" For i = 0 To n - 1 temp(i) = a Mod 32 a = Int(a / 32) str = Change32(temp(i)) & str Next i ChangeFromD = str End Function Public Function Change32(Num As Long) As String Const ChangeStrings As String = "123456789ABCEFGHJKLMNPRSTUVWXYZ0" If Num = 0 Then Change32 = Mid(ChangeStrings, 32, 1) Else Change32 = Mid(ChangeStrings, Num, 1) End If End Function ChangeFromD関数の第1引数に10進数を、第2引数に32進数の桁数(今回は4)を入れて使用します。 それから、Accessでのやり方ですが、テーブルに例えば[10進数シリアル]という数値型のフィールドを作成して、ここで10進数のシリアルをユニークで管理するという方法が簡単だと思います。 フォームには10進数シリアルに対応するコントロールを置いておきますが、非表示にしておきます(入力ユーザーには必要ない情報なので)。 新規レコードの場合は、DMax関数で最大値を取得してそれに+1した値を、上記のChangeFromD関数に入れて32進数文字列に変換し、それをフォームに表示すればいいでしょう。 ちなみにDMax関数は、 MaxVal = DMax("10進数シリアル", "テーブル名") という風に使用します。 したがって、新しい32進数文字列は、 Serial32 = ChangeFromD(MaxVal + 1, 4) となります。 もちろん、非表示にした10進数シリアルのコントロールには、MaxVal+1に値をセットします。 ところで、自動採番は最大値+1でいいのですか。 例えば、あるレコードを削除して欠番になったシリアルを新しいレコードに使いまわすということはないのでしょうか。 これがあると、採番方法がちょっと面倒になりますが。
お礼
回答有難う御座います。 誠に残念では有りますが、私のスキルではAccessでの作成は困難と判断し、 今回はタイムアップの為、自動採番を見送らせて頂きました。 (今日中に作らなくてはならないので) よって、実際の使用ファイルとは別に、引き続き勉強したいと思います。 大切なご回答はメモを取り、次回に生かしたいと思います。 本当に有難う御座いました。
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。maruru01です。 No.1の方と似たようなこと聞きますが。 1."自動採番"というのは、ひょっとして、オートナンバーを自作の32進数でやりたいということでしょうか。 2."入力ミス判断"というのは"自動採番"や"32進数"とはまったく別の話ということでしょうか("自動"で採番なのに"手で入力"というのは矛盾してるから)。 3.それで、"次の文字"ってどこですか。 4."3点の質問"ってどれとどれとどれ? 1.についてですが、これはかなり面倒です。(多分) 桁数を減らしたいということですが、そういう面倒をしてまでメリットはあるのでしょうか。 Access自体せいぜい数十万件程度しか扱えない(というか扱わない方が無難)ので、多くても10進数で6桁です。 32進数作る面倒に比べたら、6桁使用した方がいいのでは? それから、2.のとおりなら、やはり別の質問にすべきでしょうね。
補足
有難う御座います。 1,2,3,4についてはNo.1の方の補足を参照願います。 桁数を減らすメリットですが、メリットが有る為に苦労しています。 無理言いますが、どうぞ宜しくお願い致します。
- imogasi
- ベストアンサー率27% (4737/17069)
ふとご質問に目が止まり、考えました。知りたい気持ちが先行して、答えてもらう人への説明が必要な点があるのでは。 (1)32進数は品物か何かに振る番号(またはコード)と 推定しますが、何桁設定するのですか。 (2)自動採番と入力ミスチェックは局面が違うでしょう。 本件の質問は自動採番時のプログラムのことか、 後日番号を見て、人手で(バーコードなどでなく)読み 取り打ちこむ時のインプットチェックのプログラムの こことか。チェックデジットは付けるのか。多分付けな い。 (3)「自動採番では、子ウインドウが現れた時に次の採番を 行い」どう言う事態か不明。またこのやり方を聞いてお られるのか。 (4)「自動的に次の文字へジャンプか、」とは、その 1件の処理を飛ばして、次の番号処理に移るのか。 (オンライン処理かバッチ処理か?バッチ処理らしい。 ) (5)「エラーメッセージ処理をしたいのです。」これの やり方を質問しているのですか。多分していない。-- >ここへ書く必要はないのでは。 (6)「質問の中に3点の質問が書かれていますので」と自分 では締めくくっているが、3点はハッキリしない。 (7)多分プログラム技術に関する質問と思うが、どの点に 自分として難しさを感じているのか記すべきでは。 プログラムロジックかもっと言うなら関数レベルなんか のことか。
補足
有難う御座います。 同時に内容に多々不足があり申し訳有りませんでした。 (1)製品に割り当てるシリアルNo.です。現在は最大4桁としています。 32^4=1048576まで付けれそうなので。 (2)そうですね。自動採番が出来れば入力チェックは不要ですね。 失礼しました。 (3)書き方に不備が有りました。入力ミスの際の事でしたので、 (2)がクリアしたら不要となります。 (4)A→B→C→E...の様にDや先に書いた文字列を自動採番の時に飛ばしたいのです。 (5)失礼致しました。不要ですね。 (6)失礼致しました。 (1)32進数 (2)自動採番 (3)不要な文字列を飛ばす の3項目のつもりでした。 (7)上記(6)の3項目全てにおいて難しさを感じております。 VBAで組む物か、関数なのか、他にその様な機能が有るのか、すら分かりません。 本来はもっと勉強してから質問すべきなのでしょうが、 この項目を除き大まかには出来てしまった為、質問させて頂きました。 どうぞ宜しくお願い致します。
お礼
回答有難う御座います。 誠に残念では有りますが、私のスキルではAccessでの作成は困難と判断し、 今回はタイムアップの為、自動採番を見送らせて頂きました。 (今日中に作らなくてはならないので) よって、実際の使用ファイルとは別に、引き続き勉強したいと思います。 大切なご回答はメモを取り、次回に生かしたいと思います。 本当に有難う御座いました。
補足
有難う御座います。 早速エクセルで試したら1~65300セルまでびっしりと希望の32進数が並びました! 後は現在の行番号を読み取り、前のシリアルに+1するような加工が必要ですね。 今日はタイムアップなので明日再度挑戦したいと思います。 何か嬉しくなってきました。 もしかしたら明日再度質問するかも知れませんがどうぞ宜しくお願い致します。