• ベストアンサー

アクセス2000で番号をふりたいです。

アクセス2000の質問です。よろしくお願いします。 VBAが初めてなので、本を見ながらやってるんですけど なかなか理解できずに困ってます。 今、フォームで番号をふりたいんですけど、連番で 2007001でもH19001でもいいんですが、年&3桁の番号にしたいです。 現状はテーブルが「sheet5」、フォームの番号を出すテキストボックス の所が「連番」にしてあります。ボタン式にしました。 んで自分で考えて打ち込んだのが Private Sub コマンド77_Click() If "連番" / 1000 Is Date Then Me!連番 = DMax("連番", "sheet5") + 1 Else Me!連番 = Format(Date * 1000, "yyyy" & "001") End If End Sub こんな感じでいれたのですが、さっぱり動きません。 きっと見てる方は笑ってると思いますが、私の実力じゃ こんなのしか出来ません。 同じような質問もあったのですが、理解不能でした。 詳しい方、教えてください。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

とりあえず、「2008999」の後は、素知らぬ顔で「20081000」(→それまでより1桁多くなっている)を 割り当ててしまうとすれば、以下のようなコードで対応できます。 考え方のポイントとしては、  1)「西暦年」と「数値部分」とを分けて考えることと、  2)(Mid関数などで)テキストから切り出した数字は「文字」扱いになるので、   CInt関数やCLng関数、CDbl関数などで数値に変換してやる といったところでしょうか。 なお、連番の割当が必要なのは、普通に考えれば「新規レコードの登録時」のはずですので、 フォームの挿入前処理(BeforeUpdateイベント)でよいと思います。 ※定番の処理方法としては他に、コントロールの既定値での対応というのもありますが、今回の   例ではさすがに式が複雑になりすぎるので、見送るべきかと・・・。 ◎文頭に「'」がついている行はコメントなので、実際のコードはほんの数行です◎ Private Sub Form_BeforeInsert(Cancel As Integer) 'このイベントは、新規レコードに対して何らかの編集を行おうとしたときに '発生するものなので、既存レコードへの編集に対しては発生しません。 'なので、「現在のレコードの連番が空かどうか」の判定は不要になります。   '使用する変数と、そのデータ型を宣言   Dim NewID As Integer, CurYr As String   '今年の西暦年を取得   CurYr = Format(Date, "yyyy")   '今年の内での、数値部分の最大値を取得し、「1」を加算   NewID = Nz(DMax("CInt(Mid(連番, 5))", "Sheet5", "連番 Like '" & CurYr & "*'"), 0) + 1   ' Mid(連番,5) : 「連番」の5文字目以降(=数値部分)を取得   ' CInt(Mid~) : Mid関数で取得した値は文字列扱いになるので、数値(整数型)に変換   ' DMax("Mid(~)", "Sheet5", "連番 Like ~") :   '   今年のものに限定して(→「連番 Like ~」部分で絞り込み)、数値部分の最大値を取得   '   (上のCIntで数値化していないと、「99」は「100」よりも大きいと判断されてしまいます)   ' Nz(DMax~) : DMax関数の結果がNull(=今年最初のレコード)だった場合は、「0」に変換   '上で取得した「西暦年」と「数値部分」を結合   If NewID < 100 Then     '数値部分が2桁以下なら、3桁になるように「0」を追加して、西暦年とテキスト連結     Me!連番 = CurYr & Format(NewID, "000")   Else     '数値部分が3桁以上なら、そのまま西暦年とテキスト連結     Me!連番 = CurYr & NewID   End If End Sub ・・・以上です。

555f
質問者

お礼

ご回答ありがとうございます。 すごく丁寧な説明で、わかりやすかったです。 作っていただいたプログラムを、もう2行ほど 自分の考えた文を付け足してみたら、うまく動いて とっても良い感じになりました。 貴重な時間をさいて回答していただいて、感謝します。

その他の回答 (1)

noname#140971
noname#140971
回答No.1

まず、[連番]の考え方ですが・・・。 1、[年+nnn]の最大値+1では問題がでます。 2008001,2008002・・・・2008XXX・・・・2009001,2009002・・・・ と、最大値では片付かないケースもあるかと・・・。 2、質問の不具合は以下で解決。 Private Sub コマンド2_Click()   If Len(Me.連番 & "") = 0 Then     Me.連番 = Nz(DMax("連番", "tab1"), 2007000) + 1   End If End Sub [連番]が空白であれば設定します。 ただし、[連番]を更新不可にしていないと既存のレコードも消せばカウントアップ。 3、課題。 いちいち、コマンドボタンを押させるのをなくす方法? それと、年度替りの際に001にどう戻すか?

555f
質問者

お礼

なんとかうまくいきました。 ありがとうございました。

555f
質問者

補足

遅くなって、ごめんなさい。 私みたいな超初心者には難しいですね。課題まで出されちゃったし…(>_<) コマンドボタンを押さない方法ですが、たぶんテキストボックスの プロパティでイベントのどれかに式を入れればいいのかなって 思っていますが、どうですか? 年度替りのは、考え方としては今の年度と連番の番号の左から4桁が 違っていたら連番に1000を足してあげるのかなと思いました。 とにかく、ありがとうございます。

関連するQ&A