Accessの自動並べ替えについて

解決


あこ  2005-01-14 00:02:13  No: 118865

お世話になります。
環境はVB6.0  およびAccess2000です。

Accessのテーブル内容を一括でExcelに書き込んでいる処理を行っているのですが
途中でIDを削除してからデータをそのまま貼り付けているのですが
アクセスのデータの順番とエクセルに出力された順番が違ってしまいます。

これは  プログラムで並べ替えを行わないように制御したりできるのでしょうか?

どなたか  知っておられます方がおりましたら  教えて下さい。
よろしくお願いいたします。

具体的なロジックは下記のとおりです。

'*****************************************************
'* 印刷処理(ACCESS  ---->>  EXCEL)
'*****************************************************
Public Sub ps_PRINT()

    Dim cn        As ADODB.Connection
    Dim rst       As ADODB.Recordset
    Dim objExcel  As Excel.Application
    Dim xlBook    As Excel.Workbook
    Dim xlSheet   As Excel.Worksheet
    
    Dim s_path_xlsname As String         'エクセルファイルのアドレスパス名
    
    Set cn = New ADODB.Connection
    cn.ConnectionString = _
            "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= c:\access\SAMPLE.mdb;"
    cn.Open
    
    rst.ActiveConnection = cn
    rst.CursorType = adOpenStatic
    rst.Open
    
    s_path_xlsname = "C:\EXCEL\sample.xls" 'エクセルファイル(出力用)
    
    Set objExcel = New Excel.Application
    Set xlBook = objExcel.Workbooks.Open(s_path_xlsname)
    Set xlSheet = xlBook.Worksheets(s_sheetname)
    
    xlSheet.Cells(1, 1).CopyFromRecordset rst
            
    Set xlSheet = Nothing   
    xlBook.Save                      'エクセルブック保存
    xlBook.Close                     'エクセルブック閉じる
    
    Set xlBook = Nothing             'エクセルブックの解放
    
    objExcel.Quit           'エクセルアプリケーションの終了
    Set objExcel = Nothing  'エクセルアプリケーションの解放
    
    rst.Close               'レコードセットのクローズ
    cn.Close
    
    Set rst = Nothing
    Set cn = Nothing

End Sub


魔界の仮面弁士  2005-01-14 00:52:28  No: 118866

具体的な例が挙げられていないので、状況が掴み難いです。

> xlSheet.Cells(1, 1).CopyFromRecordset rst
ここで指定した rst は、どのような順番でソートしてあるのでしょうか?
そして、Excelに出力された時には、どのような順番に変化しているのですか?

まずは、そもそものrst自体が、(ORDER BY等で)正しい順番に
ソートされているかどうかを確認してください。
また、Jetのソート順は、独特の『クセ』があるので注意しましょう。
http://www.asahi-net.or.jp/~ez3k-msym/comp/acccoll.htm

# mdbのCollatin Order設定にもよりますけどね。


あこ  2005-01-14 02:03:26  No: 118867

お返事ありがとうございました。

データ作成の状況ですが・・  
まず  テキストファイルからアクセスにデータを展開し
入力順に  ID項目(オートナンバー)で並んでいます。
そのテーブルをワークテーブルにコピーしてID項目を削除しております。
 rst  は  ID項目がなくなった状態のデータになります。
その後ソートできる項目がないのでソート作業は一切しておりません。
また  EXCELの出力内容は出力するたびに並び順がまちまちになっております。

ID項目を削除した時点で  なにかしらの並び替えが行われるのでしょうか?
できれば  ID項目を削除する前のテーブルの状態でEXCELへの出力を行いたいと
思っております。


魔界の仮面弁士  2005-01-14 02:59:18  No: 118868

> rst  は  ID項目がなくなった状態のデータになります。
> その後ソートできる項目がないのでソート作業は一切しておりません。

状況がよくわかりませんが、ID項目を除去するのって、
  SELECT ID, Col1, Col2 FROM MyTable ORDER BY ID
を、
  SELECT     Col1, Col2 FROM MyTable ORDER BY ID
にするだけですよね? ソートは可能だと思いますけど。

> ID項目を削除した時点で  なにかしらの並び替えが行われるのでしょうか?
「並び替え処理」を行って取得したなら、並び順は固定です。
「並び替え処理」を行わずに取得した場合、並び順は不定です。
http://www.naboki.net/access/achell/achell_03.html

> できれば  ID項目を削除する前のテーブルの状態でEXCELへの出力を行いたいと
> 思っております。
もし、ソートのためにID列が必要だが、Excel展開時には不要と言うだけなら、
とりあえず、ID付きのままExcelに展開しておき、後から ID列を
Excel上からDeleteする事もできますよね。

先にも書きましたように、「具体的な例」が挙げられていないので、
私には、そちらの状況が全くわかりませんし、実際にデータを作って
動作を検証する事もできません。

できれば、
「ID項目を削除する前のテーブル」
「ID項目を削除した後のテーブル」
「Excelに展開された結果」
のそれぞれについて、現状、どのようなデータの並びになっているのか、
具体的な情報を提示していただけないでしょうか。


あこ  2005-01-14 20:01:36  No: 118869

説明不足で大変失礼いた強いました。

>「ID項目を削除する前のテーブル」(編集元テーブルのことです。)

テーブル名称:SAMPLE_TBL(項目:ID、項目1〜100)

ID付きのテーブル(項目的には100項目くらいあります。)になります。
テーブルを見ると  ID項目順になっておりました。

>「ID項目を削除した後のテーブル」(ワークテーブルになります。)

テーブル名称:WK_SAMPLE_TBL(項目:項目1〜100)
プログラム上で編集もとのテーブルをワークテーブルへコピー作成して
下記のモジュールを使用してIDを削除しております。

Public Sub ps_COLUMNdel(cnn As Connection)

    'テーブルのid項目の削除
    Dim s_SQL_str As String
    
    s_SQL_str = ""
    'インディックスの削除
    s_SQL_str = "ALTER TABLE WK_SAMPLE_TBL DROP CONSTRAINT ID"

    cnn.Execute s_SQL_str
    
End Sub

>「Excelに展開された結果」
出力ごとに  順番がかわっております。

Excelのシートは(項目1〜100)の
ヘッダー情報が記載されているシートを使用しております。(固定)
データのみを  任意の位置(プログラムで設定)より出力をおこなっており
現在ID項目を削除できるようなつくりになっておりません。。


魔界の仮面弁士  2005-01-14 22:39:43  No: 118870

えーっと。(^_^;)
……その手法は問題があると書きましたよね。私は。

》「並び替え処理」を行って取得したなら、並び順は固定です。
》「並び替え処理」を行わずに取得した場合、並び順は不定です。
http://www.naboki.net/access/achell/achell_03.html

上記のリンク先に書かれている内容を、もう一度、よく読んでみてください。
ソートしなければ、順序は保障されませんので、求めるデータを
ID順に取り出したいなら、ID順にソートしてください。
(これは、Jetに限った話ではありません)

最初の質問にあるコードには、そのテーブルを開く部分が
書かれていないので、どのようにして取得しているかわかりませんが、
取得時にソートするなら、ORDER BY を指定して
  rst.Open "SELECT * FROM WK_SAMPLE_TBL ORDER BY ID"
と書けますし、取得後にソートするなら、Sortプロパティを利用して
  rst.Open "WK_SAMPLE_TBL"
  rst.Sort = "ID"
などと書けます。

# あるいは、ソートした結果を返すクエリを別途用意しておき、
#  rst.Open "VIEW_SAMPLE_TBL"
# とか、
#   Set rst = cn.VIEW_SAMPLE_TBL
# でも良いかな?

> 現在ID項目を削除できるようなつくりになっておりません。。
その件については、
>    s_SQL_str = "ALTER TABLE WK_SAMPLE_TBL DROP CONSTRAINT ID"
>    cnn.Execute s_SQL_str
などのように、テーブル構造自体を変更させるのではなく、
》 SELECT     Col1, Col2 FROM MyTable ORDER BY ID
にて取得する方法を回答しましたよね。


あこ  2005-01-19 01:12:24  No: 118871

お返事ありがとうございました。
また  返信が遅くなりまして大変失礼いたしました。

思い込みでACCESSの項目をきってもそのままだろう・・と
作りこんでしまったため  只今修正中です(^-^;;)
"ORDER BY "のやり方で・・

本当にありがとうございました。


あこ  2005-01-20 03:45:38  No: 118872

解決です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加