質問 |
||
| 質問者:555f | アクセス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 こんな感じでいれたのですが、さっぱり動きません。 きっと見てる方は笑ってると思いますが、私の実力じゃ こんなのしか出来ません。 同じような質問もあったのですが、理解不能でした。 詳しい方、教えてください。 |
|
質問投稿日時:08/07/02 17:06 質問番号:4146065 |
||
回答良回答20pt |
|
| 回答者:DexMachina | とりあえず、「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 ・・・以上です。 |
|---|---|
| 種類:回答 どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/07/05 23:03 回答番号:No.2 |
|
| この回答へのお礼 | ご回答ありがとうございます。 すごく丁寧な説明で、わかりやすかったです。 作っていただいたプログラムを、もう2行ほど 自分の考えた文を付け足してみたら、うまく動いて とっても良い感じになりました。 貴重な時間をさいて回答していただいて、感謝します。 |
回答良回答10pt |
|
| 回答者:Husky2007 | まず、[連番]の考え方ですが・・・。 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にどう戻すか? |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/07/02 17:42 回答番号:No.1 |
|
| この回答への補足 | 遅くなって、ごめんなさい。 私みたいな超初心者には難しいですね。課題まで出されちゃったし…(>_<) コマンドボタンを押さない方法ですが、たぶんテキストボックスの プロパティでイベントのどれかに式を入れればいいのかなって 思っていますが、どうですか? 年度替りのは、考え方としては今の年度と連番の番号の左から4桁が 違っていたら連番に1000を足してあげるのかなと思いました。 とにかく、ありがとうございます。 |
| この回答へのお礼 | なんとかうまくいきました。 ありがとうございました。 |