重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

アクセス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

こんな感じでいれたのですが、さっぱり動きません。
きっと見てる方は笑ってると思いますが、私の実力じゃ
こんなのしか出来ません。

同じような質問もあったのですが、理解不能でした。
詳しい方、教えてください。

A 回答 (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

・・・以上です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

貴重な時間をさいて回答していただいて、感謝します。

お礼日時:2008/07/07 10:49

まず、[連番]の考え方ですが・・・。



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にどう戻すか?

この回答への補足

遅くなって、ごめんなさい。
私みたいな超初心者には難しいですね。課題まで出されちゃったし…(>_<)

コマンドボタンを押さない方法ですが、たぶんテキストボックスの
プロパティでイベントのどれかに式を入れればいいのかなって
思っていますが、どうですか?
年度替りのは、考え方としては今の年度と連番の番号の左から4桁が
違っていたら連番に1000を足してあげるのかなと思いました。

とにかく、ありがとうございます。

補足日時:2008/07/04 17:37
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/07 10:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!