簡単なことかも知れませんが…
クエリーで抽出した結果にオートナンバーをつけたいのですが、方法はありますか?

A 回答 (4件)

先に回答している方の言うとおり、クエリーで連番はつけれません。


が、テーブル作成クエリーでクエリー結果を抽出した後にそのテーブルにもう一つオートナンバー型のフィールドを追加すると自動的に連番がふられますよ。
    • good
    • 0
この回答へのお礼

ありがとうございました。さっそくやってみます。

お礼日時:2000/12/15 19:42

クエリに自動で連番を付加する機能はありません。

(断言)

テーブルに[連番]フィールドを作って、VBAを使って連番を入力する以外には、有効な方法がないものと思います。

'以下のコードをモジュールにコピーし、
マクロの「プロシージャの実行」で、

=Renban("クエリ名", "[連番]フィールドの名前", 開始値, 間隔)

のようにして使ってください。
開始値、間隔は数字で指定すること。省略してもいいです。(省略時は1が指定されたものとみなす)


Public Function Renban(QueryName As Variant, FieldName As String, Optional Start As Long = 1, Optional Step As Long = 1) As Long
 Dim SrcRS As Recordset
 Dim Ct As Long
On Error GoTo HandleErr
 On Error Resume Next
 Set SrcRS = CurrentDb.OpenRecordset(QueryName, dbOpenDynaset)
 Ct = Start
 With SrcRS
  Do Until .EOF
   .Edit
   .Fields(FieldName) = Ct
   .Update
   .MoveNext
   Ct = Ct + Step
  Loop
 End With
  
ExitHere:
 Exit Function

HandleErr:
 Select Case Err.Number
  Case Else
   MsgBox "エラー " & Err.Number & ": " & Err.Description, vbCritical
 End Select
End Function


なんかあったら、補足をお願いします。
    • good
    • 0
この回答へのお礼

詳細にありがとうございます。なんか見てるだけでむずがゆくなってしまいそうです。まだまだこのレベルは難しいかな。

お礼日時:2000/12/15 19:44

クエリーではなく、レコードセットではダメでしょうか?



例えば以下のような感じで・・・

Dim myRS 'テーブルのレコードセット
Dim myCt 'カウンター

  'テーブルのレコードセットを開く
Set myRS = CurrentDb.OpenRecordset("テーブル1")

  '最初のレコードに移動する
myRS.MoveFirst

  '最後のレコードまで繰り返し、カウンターをひとつずつUP
Do Until myRS.EOF
myCt = myCt + 1
MsgBox myCt & myRS!項目1
myRS.MoveNext
Loop

myRS.Close

これで一応は抽出した項目にナンバーをつけて表示できます。
どうしてもクエリーで・・・となると分かりません。
どなたか分かる方よろしくお願いします!
    • good
    • 0

回答らしい回答ではないのですが、私も以前クエリーで抽出結果にオートナンバーを付した処理をやりたかったのですが、Access単体ではうまくいかないようです。


実現するには、VBで作成しないといけないようです。
(その時は、オートナンバーの機能はあきらめました。)
    • good
    • 0

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

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

Qオートフィルタの抽出結果をマクロで表示するには?

A 1000 
D 200
A 500
A 1000
B 2000

上表をオートフィルタでA及び1000で絞ると左下に『4レコードで2個です。』と抽出個数が表示されると思いますが、その個数(2個)をマクロを使って表示させるにはどうすればいいでしょうか?
マクロの記録でオートフィルタをかけるところまではできるのですが、個数表示で壁にぶち当たっています。

ちなみに1000を検索させて個数を出すという方法もありますが、2行目のデータが他の行にもあるため、データを検索させて個数を導くマクロは作られないので、オートフィルタからのマクロを作成しています。
マクロ初心者のため、分かる方いらっしゃいましたらご教授をお願いします。

Aベストアンサー

こんばんは。

>2行目のデータが他の行にもあるため、データを検索させて個数を導くマクロは作られないので、
2行目のデータというのは、2列目のデータという意味だと思いますが、検索といっても、ループ型とか、関数型になるのですが、考えるよりもややこしいです。

以下は、あくまでも、AutoFilter の範囲のみであって、AutoFilter が出ていない限りは、値が出てきません。
Columns(2) は、Columns(1) でも構わないのですが、その代わり、Subtotal の第1引数を、3にしました。

 If ActiveSheet.AutoFilterMode Then
   MsgBox WorksheetFunction.Subtotal(3, Me.AutoFilter.Range.Columns(2)) - 1
 End If

Qオートフィルタ抽出データに連番をつけるマクロ

オートフィルタで抽出したデータに連番をふりたいと思っています。このサイトで調べた結果、オートフィルタをかけてのオートフィルでの連番入力はできないと知りました。
現在しようとしているのは
  A  B  C
1 クラス NO 氏名  
2 1    ○△
3 2    □×
4 1    ★♪
というデータがあり、項目にオートフィルタをかけている状態です。クラスを抽出した場合にそのクラスでの通し番号(連番)を付けたいのです。SUBTOTAL関数だと、連番が表示されるのはオートフィルタで抽出している間だけです。SUBTOTALでつけられた連番を、オートフィルタを解除しても残しておくにはどうしたらよいでしょうか。やはりコピー&ペーストしかないのでしょうか?似たような質問が多々ありますが、コピー&ペースト以外の方法をご存知の方、どうか教えて下さい。

Aベストアンサー

#01です
>したがってオートフィルタで抽出を解除すれば同じ通し番号がクラス数分あることになります。
これは最初から書いていただきたかったですが(^^;、それならこのようなマクロでもできます。なお#02さんのご指摘のようにSpecialCellsを用いる方が処理が速くなりますが、手抜きして元のマクロを修正するにとどめます。

Sub Macro4()
Dim idx, cnt As Long
Application.ScreenUpdating = False
For idx = 2 To Range("A65536").End(xlUp).Row
  If Rows(idx).Hidden = False Then
    cnt = cnt + 1
    Cells(idx, "B").Value = cnt
  End If
Next idx
Application.ScreenUpdating = True
End Sub

Qクエリーの抽出条件について

「作表条件」というフォームにテキストボックスとして「日付1」、「日付2」を設置しています。
元のテーブルには「日付」という項目があり、「日付1」から「日付2」までのデータを抽出するため、
クエリの条件式に

Between Nz([Forms]![作表条件]![日付1],#1800/01/01#) And Nz([Forms]![作表条件]![日付2],#9999/12/31#)

と記述しています。

ただ、元のテーブルの日付がNULL値の場合があり、その場合「日付1」および「日付2」が空欄だとNULL値のレコードが抽出されません。

「日付」がNULLの場合でも抽出できるようにするには、どのようにすればよいでしょうか?

どなたか教えてください。

Aベストアンサー

No.5です。

> 少なくとも一方が空白以外なら指定範囲のものを抽出
> 双方が空白なら『日付』がNullを含むすべてのものを抽出

了解しました。
とりあえず、フォームのヘッダ(またはフッタ)に『日付1』『日付2』の
テキストボックス、及び、抽出を実行させるための『実行』コマンド
ボタンが設置されている場合は以下のようになります。

'『実行』コマンドボタンのクリック時イベント
Private Sub 実行_Click()
On Error Goto エラー処理

  '日付1・日付2の評価結果などを記録するための変数を用意
  Dim sDate1 As String, sDate2 As String, sRS As String
  'レコードソースに使用するテーブル/クエリの名前を定数として用意
  Const conTableName As String = "テーブル1"
  Const conQueryName As String = "クエリ1"

  '日付1・日付2の入力状況を確認
  '(後で使用するLen関数は、引数がNullだと演算結果も0では
  ' なくNullになってしまうため、Nullを予め空文字に変換)
  sDate1 = Nz(Me!日付1, "")
  sDate2 = Nz(Me!日付2, "")

  '入力状況で場合分け
  Select Case True
    Case Len(sDate1), Len(sDate2)
      '少なくとも一方が空白以外
      '(Len関数の結果が0以外なら、Trueとみなされます)
      sRS = conQueryName
    Case Else
      '双方が空白の場合
      sRS = conTableName
  End Select

  'レコードソースを切替
  Me.RecordSource = sRS

終了処理:
  Exit Sub

エラー処理:
  'エラー発生時は、エラー内容を表示の上、処理を中止
  MsgBox Err.Number & ":" & Err.Description, , Me.Name & " 実行"
  Resume 終了処理

End Sub


・・・以上です。

なお、変数や定数を設置せず、いっぺんに処理を行ってしまうなら、
以下のようにも書けます(更にエラー処理も省略)。
『日付1』の値などを繰り返し使う場合(→例えばクエリを用意する
代わりに、VBAでレコードソースに直接SQL文を適用する、等)は
上記のようにした方が効率的ですが、今回はこちらでもOkかと・・・
※こちらではLen関数を使用せず、「&」での結果が「""」(空文字)
  かどうかで判定しているため、テーブル/クエリの出てくる順序が
 逆になっているので注意してください(汗)

Private Sub 実行_Click()

  If (Me!日付1 & Me!日付2 & "") = "" Then
    '双方が空白
    '※最後の「 & ""」がないと、「""」ではなくNullになり、
    '  正しく判断されなくなるので注意
    Me.RecordSource = "テーブル1"
  Else
    '少なくとも一方が空白以外
    Me.RecordSource = "クエリ1"
  End Select

End Sub

No.5です。

> 少なくとも一方が空白以外なら指定範囲のものを抽出
> 双方が空白なら『日付』がNullを含むすべてのものを抽出

了解しました。
とりあえず、フォームのヘッダ(またはフッタ)に『日付1』『日付2』の
テキストボックス、及び、抽出を実行させるための『実行』コマンド
ボタンが設置されている場合は以下のようになります。

'『実行』コマンドボタンのクリック時イベント
Private Sub 実行_Click()
On Error Goto エラー処理

  '日付1・日付2の評価結果などを記録するための変数を用意
  Dim sD...続きを読む

QACCESSクエリーの抽出条件について

OS WIN7
ACCESS 2007使用です。

クエリーの抽出条件について何ですが、テーブルにコードというフィールドがありまして、そこには数値が入力されています。

コード








このテーブルを元に選択クエリーを作りたいのですが、条件としてコードの値に2と3両方がある場合、2のレコードだけを表示せず、どちらか一方の数値だけの場合またはどちらもない場合は、全てのレコードを表示するようにしたいのです。

抽出条件はどのように書けばよいのでしょうか?

いろいろ試したのですが、うまくいきません。

どなたかお助け下さい。

Aベストアンサー

条件がいろいろ書かれていますが、
要は
・コード 3 が存在すれば 2以外を抽出
・コード 3 が存在しなけば すべてを抽出
この2つのみですね。

クエリデザインでフィールドを2個追加。

フィールド:コード  |DLookUp("コード","テーブル名","コード=3")
 テーブル:テーブル名|
   表示:オフ   |オフ
 抽出条件:<>2    |Is Not Null
  または:     |Is Null

QACCESSのクエリー抽出条件にIIFを使用して

コンボボックスの値を抽出条件にしたクエリーを作成しています。
コンボボックスにて"ALL"を選択したときに、全レコードを表示したく、
以下の式を入れたのですが全表示がされません。

IIf([Forms]![テーブル名]![コンボ値]="ALL",Like "*",[Forms]![テーブル名]![コンボ値])

Like "*" の部分がいけないのでしょうか?
(偽の場合は選択した値のレコードが抽出されます)

どなたか教えてください、よろしくお願いいたします。

Aベストアンサー

>IIf([Forms]![テーブル名]![コンボ値]="ALL",Like "*",[Forms]![テーブル名]![コンボ値])
この条件は、抽出したいフィールドの「抽出条件」の所に入力しているんですよね?

ちょっと内容を変えまして・・・
(1)「抽出条件」ではなく、「フィールド」の行に入力してください。
 (つまり、抽出用の新しいフィールドを作成するということです。)
(2)式は
式1: IIf([Forms]![テーブル名]![コンボボックス名]="ALL",True,[テーブル名]![コンボボックス名]=[Forms]![テーブル名]![コンボボックス名])
にしてください。
(3)IIfを入力したフィールドの「抽出条件」に True と入力します。
 (Trueの囲い文字はいりません。)

どうでしょう?ちゃんと出ますよね・・・?
ただし、フィールドを作ったわけですから、
クエリのデータシートビューには必要のない、-1などが表示されたフィールドが表示されますよね。
これは、デザインビューに戻って、表示のチェックボックスをオフにすれば解決します。

IIFというのは、ExcelのIF関数とはちょっとイメージが違います。
以下解説↓

今回の条件式の部分には、[コンボ]="ALL"という評価式(←ポイント!)が入力されています。
Excelでは条件式というイメージが強いですが、
IIFは評価式という意味です。
つまり、この評価式自体がTrueとFalseを持つということです。
IIf([Forms]![テーブル名]![コンボボックス名]="ALL",・・・・)という式で、
条件をALLとしたら・・・
評価結果=True となります。
そして真の場合の処理にTrueを指定することで、IIFの戻り値がTrueになります。
条件にALL以外を入力すると・・・
評価結果=False となります。
そして偽の場合の処理の戻り値が、ALL以外の条件になります。
抽出条件にもTrueを入力したのは、無条件に全件が表示されるのを防ぐためです。

これは、表示をオンにして動作確認すると分かりやすいかも知れませんね。
または、とりあえず現象を直して、理解は後々・・・でもよいかも知れません。
健闘を祈ります!

>IIf([Forms]![テーブル名]![コンボ値]="ALL",Like "*",[Forms]![テーブル名]![コンボ値])
この条件は、抽出したいフィールドの「抽出条件」の所に入力しているんですよね?

ちょっと内容を変えまして・・・
(1)「抽出条件」ではなく、「フィールド」の行に入力してください。
 (つまり、抽出用の新しいフィールドを作成するということです。)
(2)式は
式1: IIf([Forms]![テーブル名]![コンボボックス名]="ALL",True,[テーブル名]![コンボボックス名]=[Forms]![テーブル名]![コンボボックス名])
にして...続きを読む


人気Q&Aランキング

おすすめ情報