
アクセス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
こんな感じでいれたのですが、さっぱり動きません。
きっと見てる方は笑ってると思いますが、私の実力じゃ
こんなのしか出来ません。
同じような質問もあったのですが、理解不能でした。
詳しい方、教えてください。
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
・・・以上です。
ご回答ありがとうございます。
すごく丁寧な説明で、わかりやすかったです。
作っていただいたプログラムを、もう2行ほど
自分の考えた文を付け足してみたら、うまく動いて
とっても良い感じになりました。
貴重な時間をさいて回答していただいて、感謝します。
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にどう戻すか?
この回答への補足
遅くなって、ごめんなさい。
私みたいな超初心者には難しいですね。課題まで出されちゃったし…(>_<)
コマンドボタンを押さない方法ですが、たぶんテキストボックスの
プロパティでイベントのどれかに式を入れればいいのかなって
思っていますが、どうですか?
年度替りのは、考え方としては今の年度と連番の番号の左から4桁が
違っていたら連番に1000を足してあげるのかなと思いました。
とにかく、ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESSのテーブルで、昇順並び...
-
ACCESSでの文字と数字の結合に...
-
Excelでfilterによる非表示行が...
-
wordのフィールドコードで[1]や...
-
新札で連番の価値
-
Exselの自動連番
-
以下の表から10行目を探す方法...
-
エクセルで連番印刷したいので...
-
お祭りのくじの当て方(数字合...
-
ロトの八百長
-
海外赴任者が一時帰国時に宝く...
-
ロト6購入すること13年です。13...
-
六星占術で宝くじ購入に適して...
-
エクセルで三角くじを(正方形...
-
「ミニロト」「ロト6」を毎回同...
-
宝くじは何故イカサマがバレな...
-
Officeで三角くじを作成する方法
-
宝くじ売り場で高額当選すると...
-
用語の使い分け
-
年末ジャンボは高校生でも買え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSのテーブルで、昇順並び...
-
ACCESSでの文字と数字の結合に...
-
wordのフィールドコードで[1]や...
-
【上場企業の会社決算発表】連2...
-
連番機能
-
宝くじ、バラのメリットは?
-
Excelでfilterによる非表示行が...
-
宝くじって誰がバラを作ってい...
-
新札で連番の価値
-
世の中不公平だと思いませんか?
-
年末ジャンボ宝くじは買いまし...
-
宝くじ当選者は本当に存在するの?
-
宝くじが10億当たっても、続け...
-
仮に宝くじが10億当たっても、...
-
ロトの八百長
-
海外赴任者が一時帰国時に宝く...
-
宝くじの高額当選
-
町内会の持ち回りで民生委員と...
-
宝くじは何故イカサマがバレな...
-
2本の当たりくじを含む10本のく...
おすすめ情報