プロが教えるわが家の防犯対策術!

ACCESSで日付ごとに自動連番(日付+連番)する方法

ACCESSとvba、共に初心者です。

ACCESS2003を使用しています。日付ごとに自動連番する方法が知りたくいろいろ調べていたところ過去ログ(http://oshiete.goo.ne.jp/qa/726921.html)のベストアンサーさんの回答にたどりつきました。
とりあえず勉強と思い紹介されている通りにテーブル作成からフォームのレコード移動時へのコード貼り付けまで一通り行ってみましたが、自動連番とならず同じ番号のままとなってしまいます。(日付はパソコンの日付更新時にちゃんと反映されています。)
自動連番されないのは何が原因なのでしょうか。どなたかご教授の程よろしくお願いします。


例)DATEが5月5日の場合のIDへの記載値
 0505001
 0505001←ここが001のまま0505002にしたい。
 0506001←日付が変われば0506(5月6日)に変わる。

以上、よろしくお願いいたします。

A 回答 (6件)

No4 です。



すみません。もう1カ所、テキスト型の書き方に変えなければいけないところがありました。

> If IsNull(MaxID) Then
>   Me.ID.DefaultValue = AutoID & "001"
> Else
>   Me.ID.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
> End If

If IsNull(MaxID) Then
  Me.ID.DefaultValue = "'" & AutoID & "001" & "'"
Else
  Me.ID.DefaultValue = "'" & AutoID & Format(Right(MaxID, 3) + 1, "000") & "'"
End If

既定値に数値型で書き込んでいますから
結局、頭のゼロが失われています。

なお、No2 さんへの補足で

> 6.[自動採番月日TBLF]の[ID]プロパティの書式に0000000を記入(一桁月の場合、頭の0が消えて6桁表示となるため。)

とありますが、
書式は、見せる形だけで、実際の値は変わりません。
書式は削除してください。
問題を分かりにくくするだけです。
    • good
    • 0
この回答へのお礼

希望通りの動作が確認できました!!ありがとうございます。これでやっと次の課題にチャレンジできそうです。いろいろとお手を煩わせたと思いますが、ご教示ありがとうございました。

お礼日時:2010/05/06 22:12

No.2です。


>3.[自動採番月日TBL]に数値型フィールド[ID]
これが問題ですね。ここがテキスト型なら問題ないですが、数値型ならコードを変える必要があります。

Private Sub Form_Current()
If Me.NewRecord = False Then Exit Sub
Dim AutoID As String
Dim MaxID As Variant
AutoID = Format(Date, "mmdd")
'MaxID = DMax("ID", "自動採番月日TBL", "Left(ID,4)=" & AutoID) 変更前
MaxID = DMax("ID", "自動採番月日TBL", "Left(Format(ID,"0000000"),4)=" & AutoID) '変更後
If IsNull(MaxID) Then
  Me.ID.DefaultValue = AutoID & "001"
Else
  Me.ID.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
End If
End Sub
    • good
    • 0
この回答へのお礼

[ID]数値型にて記載いただいたコードで実施してみましたが、「コンパイルエラー 構文エラー」となってしまいました。
NO.4さんから教えていただいたテキスト型の方法にて希望していた動作が確認できましたので、とりあえず今回はテキスト型にて実施してみようと思います。
いろいろとご教示ありがとうございました。

お礼日時:2010/05/06 22:07

> 自動連番されないのは何が原因なのでしょうか。



過去ログ(http://okwave.jp/qa/q726921.html)のベストアンサーさんの回答に不備があります。

ID フィールドは「テキスト型」でなければいけません。
たまたま、12月だったからうまくいったのですね。

リンク先では

> 例)1210001
>   1210002
>   |
>   1210100
> 日付は月と日にちで、連番は3桁です。

bicycle5000 さんのご希望

> 例)DATEが5月5日の場合のIDへの記載値
>  0505001
>  0505001←ここが001のまま0505002にしたい。
>  0506001←日付が変われば0506(5月6日)に変わる。

ところが実際には
  DATEが5月5日の場合のIDへの記載値
  505001 (数値型ですから、頭のゼロは存在しません。"0505001" ではないのです。)

リンク先で、 当日で 最大の ID を求めるロジック
  AutoID = Format(Date, "mmdd")
  MaxID = DMax("ID", "自動採番月日TBL", "Left(ID,4)=" & AutoID)

5月5日の場合
  AutoID : "0505"
  これを元に MaxID を求めています。
  「ID の 左4文字が、 AutoID の値と等しい」 という条件で。

  これで、なぜ MaxID が Null になるかお分かりいただけたでしょうか?

  ID の 左4文字:"5050"
  AutoID :"0505"
  これが等しい最大のID は存在しないのです。

12月15日なら
  ID の 左4文字:"1215"
  AutoID :"1215"
  これならうまくいきますね。

長々と書きましたが、修正は2点。

・ID をテキスト型にする

・MaxID = DMax("ID", "自動採番月日TBL", "Left(ID,4)=" & AutoID)
 の抽出条件を テキスト型用に書き換える。

サービス、答えも書いちゃいますね。
 MaxID = DMax("ID", "自動採番月日TBL", "Left(ID,4)='" & AutoID & "'")

この回答への補足

回答ありがとうございます。おかげさまで連番をつくるコードの仕組みは以前より理解が深まりました。
それで早速ためさせて頂いたのですが、なぜか以前と変わらず連番になりませんでした。
AutoIDでは0505という値が入っていることを確認できたのですが、フォームビューのID欄には505001と頭の0がなくなっています。Left(ID,4)で先頭の0が認識されていないのでしょうか?

補足日時:2010/05/06 01:26
    • good
    • 2

No.2です。


>ご教示頂いたMuxIDの部分が001であることを確認する手段はどのように行えばよろしいのでしょうか?
使用しているフォームのコードを開いて該当の場所でF9キーを押してブレークポイントを作成して
フォームの新規入力を実行するとブレークポイントを指定した行でコードが停止します。
その際に変数にカーソルを合わせると変数に入力された値が表示されます。
※詳細は参照URLをご覧ください。

後、もうひとつ気付いたことがあります。
このコードはフォームから新規入力を実行しないと"ID"の既定値は変更されません。
テーブルを直接開いて、新規入力の場合は直前の既定値の値が入力されます。
この場合既定値を確認するには、テーブルをデザインモードで開きフィールド"ID"を選択した状態で
下方に表示されるプロパティの既定値を確認してください。

参考URL:http://hamachan4.exblog.jp/7955925/

この回答への補足

ブレークポイントやってみました。やはりMaxID=nullと表示されました。でもどうしてMaxIDに値が代入されないのかがまったく検討がつきません。基本的なことが抜けているのでしょうか。確認可能であれば、以下に私の作成手順および確認手順を記載しましたので、過不足等をご教示頂きたくお願いいたします。

■作成手順
1.空のデータボックスを作成。
2.テーブル[自動採番月日TBL]を作成。
3.[自動採番月日TBL]に数値型フィールド[ID]と適当なテキスト型フィールド[etc]を作成。
4.[自動採番月日TBL]を元にオートフォーム:表形式で[自動採番月日TBLF]を作成。
5.[自動採番月日TBLF]のフォーム-プロパティ-レコード移動時からコードビルダを選択しコードを貼り付け。
6.[自動採番月日TBLF]の[ID]プロパティの書式に0000000を記入(一桁月の場合、頭の0が消えて6桁表示となるため。)

■確認内容
1.[自動採番月日TBLF]をフォームビューで開き1つめの新規レコードをenterキーを押し[ID]から[etc]に移動し[etc]に適当な値を入力しenterキーを押す。
2.2行目の新規レコードに自動的に0505001が代入される。enterキーを押し[ID]から[etc]に移動し[etc]に適当な値を入力しenterキーを押す。
3.3行目の新規レコードに2行目のレコードと同じ[ID]0505001が代入されてしまう。

以上

補足日時:2010/05/05 23:03
    • good
    • 0

話の内容から下記の部分が正常に機能してないようです


If IsNull(MaxID) Then
  Me.ID.DefaultValue = AutoID & "001"
Else
  Me.ID.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
End If

上記のELse以下でカウントアップさせるのですが、MaxIDがNull判定されるため001のままになってます。
となると原因は
MaxID = DMax("ID", "自動採番月日TBL", "Left(ID,4)=" & AutoID)
になります。

テーブル名は"自動採番月日TBL"で間違いありませんか?※TBLの半角・全角が違ってませんか?
違ってるようであれば、上記のコード内の"自動採番月日TBL"を使用してるテーブル名に変更して確認してください。

この回答への補足

早速のご回答ありがとうございます。
>テーブル名は"自動採番月日TBL"で間違いありませんか?※TBLの半角・全角が違ってませんか?

コード内のテーブル名の記述と実際のテーブルの名前を確認しましたが、ファイル名は同じで、どちらもTBL部分は英大文字の半角表示でした。

ご教示頂いたMuxIDの部分が001であることを確認する手段はどのように行えばよろしいのでしょうか?

補足日時:2010/05/05 16:19
    • good
    • 0

一件目の書き込み成功時に、[自動採番月日TBL]![ID]を確認しましたか?


001になってますか?これがうまく行ってないと思いますよ。(レコードが無いor000のまま)

この回答への補足

早速のご回答ありがとうございます。
>一件目の書き込み成功時に、[自動採番月日TBL]![ID]を確認しましたか?001になってますか?
[自動採番月日TBL]を開いて[ID]を確認すると001ではなく0505001という値が入っています。
確認箇所は正しいでしょうか。ここが問題ない場合は次にどこを確認すればよろしいでしょうか。ご教示お願いします。

補足日時:2010/05/05 16:07
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESSの自動連番について

ACCESS2000を使っています。
自動連番を通常すると1・2・3・・・と自動で連番を作成してくれますが、それを日付+連番というものに出来ますでしょうか?
例)1210001
  1210002
  |
  1210100
日付は月と日にちで、連番は3桁です。
数字の連番の方は、日付が変わるとまた1に戻るようにしたいです。
何か良い方法があったら教えてください。

Aベストアンサー

入力フォームのデザインで、メニューら[表示]-->[プロパティ]で「レコード移動時」欄を
クリックし、右端の ... をクリックして、「コードビルダ」で開いたウィンドウに下記
コードを貼り付けます。

レコードソースになっているテーブル名を「自動採番月日TBL」とし、自動採番する
フィールドは、数値型で名前を「ID」とした場合です。

これで、ご希望通りの動作になると思いますが、年が入っていないのが気になります。
このままでは、1年以上使っていると、昨年の番号の連番を取得します。
年を考慮することをお勧めします。

Private Sub Form_Current()
If Me.NewRecord = False Then Exit Sub
Dim AutoID As String
Dim MaxID As Variant
AutoID = Format(Date, "mmdd")
MaxID = DMax("ID", "自動採番月日TBL", "Left(ID,4)=" & AutoID)
If IsNull(MaxID) Then
  Me.ID.DefaultValue = AutoID & "001"
Else
  Me.ID.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
End If
End Sub

入力フォームのデザインで、メニューら[表示]-->[プロパティ]で「レコード移動時」欄を
クリックし、右端の ... をクリックして、「コードビルダ」で開いたウィンドウに下記
コードを貼り付けます。

レコードソースになっているテーブル名を「自動採番月日TBL」とし、自動採番する
フィールドは、数値型で名前を「ID」とした場合です。

これで、ご希望通りの動作になると思いますが、年が入っていないのが気になります。
このままでは、1年以上使っていると、昨年の番号の連番を取得します。
年を考慮...続きを読む

Qaccess 自動採番 年が変わるごとに0001に戻る仕組み。

宜しくお願いします。

使用環境:access(2002-2007)

前回の続きでもありますが、自動で番号を採番する仕組みを作りました。
(一応、前回分も・・)http://oshiete1.goo.ne.jp/qa5742518.html
「10AA0001」から始まり、あとは後ろの数字が0002,0003~と増えていく仕様で出来ました。
最初の「10」というのは2010年のうしろ二桁の「10」です。(date関数)

(相談)
これを2011年になったら、後ろの数字を0001に自動的にセットし直す仕様にしたいのです、
そこから0002,0003~と増えるようにして、また年が変わるごとに0001にセットされるような仕組みにしたいです。

検索サイトで調べるとやり方が出てくるのですが、
まだVBAの理解力がないので、まったくもってわかりません。
たぶんIfで示されるDcount関数に関係があるのかなー、という気はします。
(前置きの部分なので)
僕にはちょっとレベルが高いかも知れませんが、理解できるよう努力します。

以下に、構文を書きます。
また来年になるまで「実際、変わるか検証ができない」というのもアレなので、
テスト環境ではnow関数を使い「hhnn」でやってます。
「分」が変わるごとに0001に戻れば自分なりにOKだと思っています。
(now関数で連番動作することは確認できました)


・・・・・・・・・

'------------------------------------------------------------
' Form_BeforeInsert
'
'------------------------------------------------------------
Private Sub Form_BeforeInsert(Cancel As Integer)
On Error GoTo Form_BeforeInsert_Err

If (DCount("見積り番号", "案件") = 0) Then
見積り番号 = "00AA0001"
Exit Sub
End If
見積り番号 = Right(Format(Date, "yyyy", 2), 2) & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA" & "0000")


Form_BeforeInsert_Exit:
Exit Sub

Form_BeforeInsert_Err:
MsgBox Error$
Resume Form_BeforeInsert_Exit

End Sub

・・・・・・・・・


○ now関数の場合 ※一文のみ抜粋
・・・・・
見積り番号 = Right(Format(Now, "hhnn", 2), 2) & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA" & "0000")
・・・・・

教えてください、宜しくお願いします。

宜しくお願いします。

使用環境:access(2002-2007)

前回の続きでもありますが、自動で番号を採番する仕組みを作りました。
(一応、前回分も・・)http://oshiete1.goo.ne.jp/qa5742518.html
「10AA0001」から始まり、あとは後ろの数字が0002,0003~と増えていく仕様で出来ました。
最初の「10」というのは2010年のうしろ二桁の「10」です。(date関数)

(相談)
これを2011年になったら、後ろの数字を0001に自動的にセットし直す仕様にしたいのです、
そこから0002,0003~と増えるようにして、...続きを読む

Aベストアンサー

年が変わったというのは、操作している日付で判別して良いのでしょうか。

その条件で、
以下ではどうでしょうか。

 Dim vDt As Variant

 vDt = DMax("見積り番号", "案件", "見積り番号 Like '" & Format(Date, "yy") & "*'")
 If (IsNull(vDt)) Then
  見積り番号 = Format(Date, "yy") & "AA0001"
 Else
  見積り番号 = Left(vDt, 4) & Format(Val(Right(vDt, 4)) + 1, "0000")
 End If


※ 西暦下2桁で始まる最大を求めます。
なければ、その年の初期値を設定し、あれば、右4桁部分の数値を+1します。

この際、今日の西暦下2桁を使用します。

QAccess DCountでの連番について

DCountで連番を追加したいのですが演算対象条件の記述方法が良く分かりません。
調査用品別販売データクエリの商品コードフィールドに対して連番を振りたいです。
商品コード、連番
00110 1
00110 2
00120 1
00120 2
上記のようにしたいのですが
式1: DCount("商品コード","調査用品別販売データ","商品コード=" & [調査用品別販売データ]![商品コード])
これではエラーが出てしまいます。

Aベストアンサー

商品コードと同じようにしてやればいいのです

連番:式1: DCount("*","調査用品別販売データ","商品コード='" & [商品コード] & "' and ID <='" & ID & "'")

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QAccessで日付が変わると番号がリセットされる自動採番がしたい

Microsoft Accessで下記のようなデータベースを作っています。
テーブル名:TB_受付
テーブルデザイン
受付番号:テキスト型
受付日:日付/時刻型(yyyy/mm/dd)
番号:数値型
コース種類:テキスト型
備考:テキスト型

テーブルイメージ
受付番号    受付日    番号  コース種類  備考
------------------------------------------------------------
20051201受付1   2005/12/01   1
20051201受付2   2005/12/01    2
20051201受付3   2005/12/01    3
・     ・
・                   ・
20051202受付1    2005/12/02

というように、受付日が変わると番号が1に戻るような採番をしたいのです。
上記テーブルを元に作成したフォームで、
受付日にはDate関数でその日の日付が入るようにしています。
フォームの更新前処理に下記のコードをいれています。
Private Sub Form_BeforeInsert(Cancel As Integer)
If DCount("番号", "TB_受付") = 0 Then
Me![番号] = "1"
Else
Me![番号] = Format(DMax("番号", "TB_受付") + 1)
End If
End Sub

さらにコース種類の更新後処理に
Me![受付番号]=Format("受付日,"TB_受付")&"受付"&Format("番号","TB_受付")
というコードを書いて日付&番号が、[受付番号]のところに表示されるようにいろいろやっているのですが、日付が変わると番号をリセットさせることがなかなかできません。

VBAはあまり理解できている方ではないのですが、いろいろ検索をしたり調べたりしてたどり着いたのが上記です。
日付でリセットされる採番をするにはあと何をすればよいか、もしくは根本からこうしたほうがいいというのがあれば、とも思うのですが
詳しい方に教えていただけないでしょうか?

Microsoft Accessで下記のようなデータベースを作っています。
テーブル名:TB_受付
テーブルデザイン
受付番号:テキスト型
受付日:日付/時刻型(yyyy/mm/dd)
番号:数値型
コース種類:テキスト型
備考:テキスト型

テーブルイメージ
受付番号    受付日    番号  コース種類  備考
------------------------------------------------------------
20051201受付1   2005/12/01   1
20051201受付2   2005/12/01    2
20051201受付3   2005/12/01 ...続きを読む

Aベストアンサー

フォームの名前を”受付フォーム”、フォーム上のコントロールを”日付”として説明します。
下記DCountの値は、テーブル"TB_受付”の受付日と”日付”の値とが等しいレコード数+1になります。

Me![番号] = DCount("[番号]", "[TB_受付]", "[受付日]=Forms![受付フォーム]![日付]") + 1

フォーム上のコントロールやどのイベントで処理するかなどは、これの応用で考えてください。
(なお、上記プログラムは、ACCESS97で確認しました。)

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QAccessで自前の自動採番処理で採番テーブルを

Accessで自前の自動採番処理で採番テーブルを作り、その採番テーブルに格納してある最後の主キーのNO.を取得して、それに1加算したものを、新規レコードの主キーの自動採番処理結果として設定するやり方を考えていますが、その場合に

1) 複数レコードにエクセルなどから複数行データをコピーして貼り付けた場合には、採番がうまくいくのでしょうか?行かない場合には、その対処策はありますでしょうか。

2) 一行、または、複数行を削除した場合には、採番は既に登録済みの最後のNo.から自動採番するようになると思いますが、通常のアクセスのシステムでは、このような挙動で宜しいのでしょうか?

ご回答のほうよろしくお願いします。

Aベストアンサー

#1 の回答は番号フィールドにNull がある複数のレコードが存在する場合の
サンプルです。
※最後に採番テーブルの番号の値を変更するのが抜けてました。
rs.close:set rs =nothing の前に
currentdb.execute("update 採番テーブル set 番号 =" & maxnum)
を追加してください。

1レコードずつ手入力で行っている場合はまた別の話になります。
フォームのレコード移動時イベントに
if me.newrecord then
me!フォームの番号コントロール名 = Nz(DMax("番号", "採番テーブル"), 0) +1
・・・とかになりますが
採番テーブルの方の番号を更新するタイミングは更新前処理に行えば
良いでしょう。

が、もしかしてマルチユーザー環境で・・・と考えているのなら
全部忘れてください。ハードルがぐっと上がりますので確かな回答は出来ません。
こちらが参考になるかと思いますけど。。。
[VB] DAO でユーザー定義カウンターを実装する方法
http://support2.microsoft.com/default.aspx?scid=kb;ja;191253

私からは以上です。

#1 の回答は番号フィールドにNull がある複数のレコードが存在する場合の
サンプルです。
※最後に採番テーブルの番号の値を変更するのが抜けてました。
rs.close:set rs =nothing の前に
currentdb.execute("update 採番テーブル set 番号 =" & maxnum)
を追加してください。

1レコードずつ手入力で行っている場合はまた別の話になります。
フォームのレコード移動時イベントに
if me.newrecord then
me!フォームの番号コントロール名 = Nz(DMax("番号", "採番テーブル"), 0) +1
・・・とかになりますが
採番テ...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング