ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

Access2002でクエリをExcel2002へエクスポートしたのですが、エラーではないのですが、気になることがあります。
なぜか、データの並びが違うのです。なぜクエリの時とExcelシートにした時で勝手にデータが並べ変わっているのか気になって。
一応、過去の質問を調べましたが似た質問を見つけることができなかったので、自分で質問してみます。
ご存知の方がいたら、教えてください。
もし、過去に出ているなら申し訳ないですが、どの質問か教えてください。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

Accsess のテーブルは(Excel とは異なり)レコードの並び順のデータを持っていません。


したがって、積極的に主キーなどで(例えば #1 の Ribenrenさんがおっしゃっているような方法で)並べ替えをしてやらなければ、どのような順番になるかはまったく保証されません。

Access のテーブル(クエリーも?)をデータシートビューで開いた場合、テーブルに主キーが設定されていればレコードはこの順番で表示されますが、これは単にフィルターがかかっているだけのことで、実際にデータの順番が入れ替わっているのではありません。
ちなみに、主キーがない場合は(フィールドにインデックスを使っていればこの順になりますが)通常は(多分?)入力順で表示されると思います。

ということで、ご質問のエクスポートの際の順番ですが、これはデータが保存されているハードディスク(やMOなどの記録媒体)から読み込まれる順番によると思います。
(つまり、ハードディスクの外周寄りに記録されているレコードから順番にエクスポートされると言うこと。)

ですから、基本的にはデータの入力順でエクスポートされることになりますが、もし Access のデータ領域がハードディスク上で断片化(フラグメンテーション)していたりすると、順番は全く予想できないものになってしまいます。
(データのコピーやハードディスクのデフラグなどで、順番が変わってしまう可能性もありそうです。)

ちなみに、データベースを最適化すると、レコードは主キーの順番に再格納されるようです。
(ハードディスクの連続した領域に、データベースのコピーやテーブルのインポートを行った場合も?)

いずれにしても Access を使う場合には「テーブルには基本的にレコードの順番の概念が無い」ということを常に意識している必要があると思います。

再現のテストを行っていません(意識的に Access のデータに影響するようなフラグメンテーションを作るのって、えらく難しいです。^_^;)ので、「自信なし」の回答ですが・・・・・・。

参考URL:http://www.naboki.net/access/achell/achell_03.html
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
とてもわかりやすく説明していただき、うれしいです。
そして、参考のURLもとても役に立ちました。

>データが保存されているハードディスクから読み込まれる順番によると思います。

なぞが解けて良かったです。
人に質問されて自分でもわからず悔しかったので(笑。
ありがとうございました。

お礼日時:2003/10/07 16:14

並び順が一意に保証されるような Order By 句を書けばよいのでは?

    • good
    • 0
この回答へのお礼

早速の回答、ありがとうございます。
Order By 句 という言葉を知らなかったためネットで調べました、ありがとうございます。
時間ができたら、それを使ってみようと思います。
ただ、今回質問させてもらったのは、並び替わらないようにする方法を知りたかったのではなく、「なぜ並び替わってしまうのか?」という理由を知りたかったのです。もしご存知の方がいらしたら、お願いします。

お礼日時:2003/10/06 22:08

このQ&Aに関連する人気のQ&A

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

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

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

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

QAccessにインポートしたら並び順が変わっちゃった

Access2000 を使っています。
ExcelデータをAccessテーブルにしようとしましたが、全項目をテキスト型で入れたいのに、自動的に各項目の型が変わってしまうので、一旦CSVに落としてAccessにインポートしました。
ところが、インポートされたテーブルではレコード順が違っちゃっているんです。
総数は変わっていませんから、全て入ってはいるんでしょうが。
いったい何がいけないんでしょうか。多量のデータをインポートするのに不安でいけません。誰か教えて下さい。

Aベストアンサー

>インポート等においてAccessが順番をあえて変えてしまうことに言及していただけていませんが、Accessは常にそういう余計な動作をするものなのですか。

データベースでは、処理的に一番早く追加できる領域に追加をしていきます。

そのため、最適化されていないテーブル(以前は値が入っていたが、現在はレコードの削除があったなど)では、以前のレコードの情報が残っていたりすると、テーブルの一番最後に追加するのが高速であったり、以前レコードが存在していた領域を上書きするのが高速だったりという感じでどこに追加されるかわからない状態になります。

なので、最適化をしてからデータをインポートすれば、その順番に入るかもしれません。
ただし、たしかAccessでは、主キーが張ってあるテーブルはインポートのレコード順に関係なく主キーの値の昇順になったような???

Qアクセスで入力したデータの順番が変わってしまいます

はじめまして。仕事でAccessを使っているのですが、フォームでデータを入力していき、アクセスを一旦閉じた後再度開くと入力したレコードの順番がバラバラになってしまいます。順番が変わらないようにするにはどうすればよいのでしょうか?

Aベストアンサー

こんにちは。maruru01です。

Accessのテーブルには、そもそも順番という概念がないので、並び順を制御するには、並べ替え用のフィールドを用意して、並べ替え設定をしておく必要があります。
手っ取り早いのが、オートナンバー型のフィールドを用意して、主キーにしておくことです。
この場合、このオートナンバー型のフィールドはフォームでは入力(変更)不可にしておきます。
連結コントロールの[可視]プロパティを「いいえ」にして、フォームの邪魔にならない場所に置いておけばいいでしょう。

QAccess→Excelへエクスポートすると日付の表示形式が変化する

DoCmd.OutputTo acOutputQuery, "クエリ1", "MicrosoftExcelBiff8(*.xls)"

のように
クエリをエクセルへエクスポートしたときに
もともと「2009/05/27 23:21:00」と入力されていた(DATE型の)日付の形式が
エクスポート後は「27-May-09」に変わってしまいます。
そのままの書式でエクスポートするにはどうすればいいですか?

よろしくお願いします。

Aベストアンサー

> そのままの書式でエクスポートするにはどうすればいいですか?

確認したところ、
 1)クエリで書式設定あり
  → クエリの書式設定を反映
 2)クエリで書式設定なし・テーブルで書式設定あり
  → テーブルの書式設定を反映
 3)クエリ・テーブルとも書式設定なし
  → Excel側(OS側?)の設定で表示
となるようです。
(Accessでの書式設定が、Excelの『セルの書式設定』に引き継がれる)

ですので、テーブルかクエリで、日付表示フィールドで明示的に
書式を設定してやれば、Excel側もその設定に従った書式で
表示するようになると思います。


※テーブルの場合は、デザインビューの左下の『標準』タブの
  『書式』で設定できます。
※クエリの場合は、デザインビューで開いた後、Alt+Enter等で
 プロパティシートを表示し、画面下半分(フィールド追加領域)
 で対象フィールドを選択してフィールドのプロパティを表示させ、
 『標準』タブの『書式』で設定します。

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のクエリで、Left関数を使用して、7桁の数値を抜き出す方

Accessのクエリで、Left関数を使用して、7桁の数値を抜き出す方法。
IDが8桁で入力されているのですが、左から7桁だけを抜き出して、全てのレコードを表示させたかったのですが、誤って入力されている7桁のIDしか表示されませんでした。
いつもExcelを使用している感覚だったので、文字の左から7桁の数値や文字列を抽出して表示してくれるものと思っていました。
元のテーブルに入力されているIDを変更することなく、
クエリで、7桁だけにして、その取り出した7桁で区別し、グループとして認識し合計を出したいと考えているのですが、どうすればよいのでしょうか。
宜しくお願い致します。

Aベストアンサー

>Left関数をする前は、5000行程なのですが、関数を加えたとたん4300程度に減ってしまいます。

関数を加えるのでは無く、関数だけ(演算フィールドのみ)のクエリを作成をして実行させます
単にleft関数で左から何文字取れという演算フィールドしか持たないクエリを実効させれば、指定した桁数に満たない場合には実際にある桁数まで、一文字も入っていない場合には0を返して、全データ分のクエリ結果を返します

全件分のデータが帰って来ないという事は作成しているクエリに問題ありの可能性高いです

先の書き込みに書きましたが、手順は演算フィールドのみのクエリを作成し実行させ全データが取得出来る事を確認してから、この演算フィールドのみのクエリに必用なフィールドを追加してゆくって事してください

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

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

Aベストアンサー

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

QAccessのマクロでモジュールを実行させたい。

Access2002を勉強中の初心者です。

AccessでDB1という名前のデータベースを作成し、その中で、モジュール1というモジュールを作成しました。これを実行するマクロを作成したく、次のようにマクロを作成しました。
マクロのデザイン画面でアクションに「プロージャの実行」を選択、プロージャ名入力覧の右側の...のボタンを押して式ビルダ画面を表示、ここの「関数」フォルダを開いてDB1を選択、表示されたモジュール1を貼り付けてOK。
しかし、このマクロを実行すると、次のエラーとなります。「DB1 指定されたDB1が見つけることができない関数名が含まれています」

根本的に方法が間違っているのでしょうか?
アドバイスをよろしくお願いします。

Aベストアンサー

#1です。

ちょっと時間ができたので、Accessのヘルプで、
 "RunCode/プロシージャの実行" アクション
についてのトピックを見てみました。

結論から言うと、基本的な考え方が間違っているみたいです^^;。

「プロシージャの実行」アクションでは、「Function」プロシージャを指定するようです。
Subプロシージャではエラーになります。


つまりご質問の件では、
「Subプロシージャを呼び出すFnctionプロシージャ」をまず書かなけれえばならない。
そして、マクロのアクションでは、あらためてこのFunctionプロシージャを指定しなければいけません。

Q【Access】クエリで抽出したデータをCSV形式でエクスポートできますか?

タイトルの通りなのですが、
クエリーで抽出したデータをcsv形式でエクスポートするには
どのようにすればいいのでしょうか?
Accessに慣れていなくて困っています、どなたか教えてください(>_<)

その後はいろいろ加工したいので、
最終的にはExcel形式で保存しなおそうと思っています。
初めからExcel形式でエクスポートすると、とても重くなるし、
いちいち「再計算」がかかってしまうので作業がやりづらいんです。。。

どなたかお力を貸してください。
よろしくお願いします!

Aベストアンサー

クエリをクリックし選択状態にしてメニューのファイルのエクスポートもしくはクエリを右クリックしエクスポートを選択すると保存する場所の選択するダイアログが出ますのでファイルの種類をテキストファイルを指定し保存するホルダとファイル名を指定します。
指定するとテキストエクスポートのウィザードが表示されますので順次進めていきエクスポート先のファイル名でパスとファイル名が表示されますのでcsvで保存するなら最後の.txtを.csvに変更しOKをクリックすればcsvで保存でします。

QAccess 同じデータをたくさんのレコード(同一列)に一度に入力するには

いつもお世話になっています。
Accessの基本的な入力に関して教えてください。
同じデータをたくさんのレコード(同一フィールド)に一度に入力するには、どうすればよいか教えてください。

Excelの列方向へのコピーと同じような感覚でできないのでしょうか?

よろしくお願いします。

Aベストアンサー

質問の回答にならないかも知れませんが・・・

1.EXCELでコピーするための元データを作成します
  ※仮にレコードが1000件ある場合はEXCELで1000行作ります。

2.Excelのデータをコピーします。

3.Accessのテーブルを開きます。

4.先頭レコードの貼り付けをしたい項目にカーソルを合わせます。(カーソルは白の十字)

5.下方向へドラッグし、項目を選択します。

6.貼り付けをします。

※貼り付けに失敗した場合、元に戻せませんので必ず元ファイルのコピーを取ってから行ってください

よろしければ、お試し下さい


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

人気Q&Aランキング