• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:AccessのVBAはコピーではだめなのでしょうか)

VBAでAccessの連番を振る方法について

このQ&Aのポイント
  • AccessのVBAを使用して連番を振る方法について質問があります。
  • 現在、同じAccess内の複数のフォームで連番を振ろうとしていますが、最後のアルファベット部分が順番にならず、ずーっと同じになってしまいます。
  • 質問の内容を要約すると、Eから始まり日付とアルファベットの連番を振りたいが、同じ日付であればアルファベットを1つずつ増やしていき、日が変わると再度アルファベットをAから始めたいということです。

質問者が選んだベストアンサー

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.1

コピペしたものを元にしても、変更内容が正しければ動きます。ただ、理解してる感じがしない意味で、コピーではダメ・・・ですね(--; ぱっと見その変更でよさそう。なぜAになるかな?  1.If文が必ずElseルートに入っちゃうのか  2.前の関数をコールしちゃってるのか 1ならたぶん修正漏れ。2だとしたら、getNewSeqを標準モジュールに定義していて、新しい関数は別名で作ったのにMe!管理番号=getNewSeqの部分変えてないとか・・・でしょうか。 MsgBoxでメッセージや値を簡単に表示できます。こんなの↓を要所に入れて確認に使ってください。  MsgBox "○○の処理中"  MsgBox DMax("管理番号", "連絡文書E") また、VBE(VBAのエディタ)には、ブレイクポイントやステップ実行やローカルウィンドウなど便利な機能があります@「VBA デバッグ」とかで検索。 あんま頼りきりだと怒られちゃうよ。少しずつお勉強を。

noname#151509
質問者

お礼

ありがとうございます ご指摘の1、2、ともに該当していたようです 順を折って修正したところ動きました 理解がまだまだたりないので勉強させていただきます

その他の回答 (1)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

> 先日よりAccessの連番の振り方をご教示いただき何とか振れるようになりました > そこで、同じAccess内に新たなフォームを作成し、同じように連番を振ろうとしました > しかし、最後のアルファベット部分が順番にならず、ずーっと同じになってしまいます > ≪現状≫ > ずーっと”A” > ”管理番号”を”発行番号” > ”連絡文書E”を”一般文書D” > ”E”を”D” > としてみました > 新規レコードに移る度に”D111107(yymmdd)A”となります という事のようですが、 実際に記述したものを見ないで「何故」は誰もわからないと思います。 参考にしたものの記述ではなく、現象が起きた記述を提示すべきだと思いますが。 何をされているVBA記述であるか理解されていますか。 やりたいことは、VBA等でないとできないものと思います。 やっていることはほとんど同じですが、私だったらというものを以下に書いてみます。 標準モジュールに記述します。 (同じ関数名もあるので別のテスト環境でやってみてください) Private Function GetNewSeq(dt As Date _         , sHead As String, sField As String, sTable As String) As String   Dim sS As String   Dim sW As String, s1 As String, s2 As String   Const sDEF As String = " @"   Const sLMT As String = "Z"   sS = sHead & Format(dt, "yymmdd")   sW = sField & " Like '" & sS & "*'"   sW = Nz(DMax("Right(" & sField & ",2)", sTable, sW), sDEF) '☆1 '  sW = Nz(DMax(sField, sTable, sW), sDEF) '★1 '  sW = Right(sW, 2) '★1   s1 = Left(sW, 1)   s2 = Right(sW, 1)   If (s2 = sLMT) Then     If (s1 = Left(sDEF, 1)) Then '☆2       s1 = Right(sDEF, 1) '☆2     End If '☆2     s1 = Chr(Asc(s1) + 1) '☆2     s2 = Right(sDEF, 1) '☆2   End If   GetNewSeq = sS & s1 & Chr(Asc(s2) + 1) End Function Public Function EgetNewSeq(Optional dt As Date) As String   EgetNewSeq = GetNewSeq(IIf(dt = 0, Date, dt) _               , "E", "[管理番号]", "[連絡文書E]") End Function Public Function DgetNewSeq(Optional dt As Date) As String   DgetNewSeq = GetNewSeq(IIf(dt = 0, Date, dt) _               , "D", "[発行番号]", "[一般文書D]") End Function 採番の処理は同じなので、関数を1つにします。 違う部分を引数で渡すようにします。 いつのデータに、頭の文字は、採番するフィールド名は、対象のテーブル名は。 ☆1 部分が嫌なら ☆1 をコメントにして ★1 を有効にしてください。 また、"Z" を越えようとした場合、 "E111107 Z" の次は "E111107AA" になるようにしています。(☆2 部分) 従来の処理がよければ、☆2 部分を変更してください。 指定された、頭の文字と日付から sS = "E111107" の基本部分を作成します。 DMax("Right([管理番号],2)", "[連絡文書E]", "[管理番号] Like 'E111107*'") で最大の右2文字分を入手します。 ない場合は、初期文字列 " @" を設定しておきます。 ("A" の1つ前の文字は "@" なので) s1 が1つ前の文字、s2 が最後の文字、s2 が "Z" なら、s1 を作り直して・・・・ 最終的に s2 の文字を1つ進めて・・・・ってな処理・記述内容になります。 "A" を "B" にするには、Chr(Asc("A") + 1) とすればできます。 フォームへの記述は、従来のように新規レコードに移動した時に行っても良いですし、 以下のように挿入前処理で採番しても良いと思います。 また、タイミングをずらして更新前処理で新規レコードだったら・・・でも良いと思います。 採番のタイミングは、どのような操作をさせたいか、で変わってくると思います。 Private Sub Form_BeforeInsert(Cancel As Integer)   Me.管理番号 = EgetNewSeq End Sub とか Private Sub Form_BeforeInsert(Cancel As Integer)   Me.発行番号 = DgetNewSeq End Sub 上記では、今日の日付で採番します。 昨日のデータとして採番したい時には、以下のような感じで日付を指定します。 Private Sub Form_BeforeInsert(Cancel As Integer)   Me.管理番号 = EgetNewSeq(Date - 1) End Sub

noname#151509
質問者

お礼

ありがとうございます ご教授いただいたVBAも新規作成でやってみようと思っています 理解がまだまだ足りないので勉強させていただきます

関連するQ&A