Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


300 / 2272 ツリー ←次へ | 前へ→

【12177】テーブル項目の自動取得の並びについて しはん 12/10/22(月) 1:30 質問[未読]
【12183】Re:テーブル項目の自動取得の並びについて 小僧 12/10/24(水) 16:09 回答[未読]
【12205】Re:テーブル項目の自動取得の並びについて しはん 12/11/2(金) 16:15 質問[未読]

【12177】テーブル項目の自動取得の並びについて
質問  しはん  - 12/10/22(月) 1:30 -

引用なし
パスワード
   初めて投稿します。

以下の様な項目をもつテーブルをEXCELに出力しようとしており
ADOを利用して追加出力しようとしているのですが
参照中に並び位置が変わってしまいます。

<ACCESSのテーブル項目の並び>
[順] [BBBB] [AAAA] [DDDD] [CCCC]

<収集された際の項目の並び>
[AAAA] [BBBB] [CCCC] [DDDD] [順]

定義を与えて固定にしてしまえば一応は解決しますが、それですと今後フィールドの増減が発生した場合
VBA側でもテーブル定義の修正が入るので出来れば避けたいと思っています。

どの様にしたら取得の順番がACCESSのテーブル項目の順番で取得されるのでしょうか?
それとも変えられないものなのでしょうか?


------------------------------------------------------

Function EXCEL()

'/参照設定 Microsoft ActiveX Data object 2.0 Library /
'-----------------------------------
Const csTbl As String = "OutPut" 'Accessテーブル名
Dim voCn As ADODB.Connection
Dim vvArryFldName As Variant 'フィールド名用配列
Dim vvRet As Variant

vvRet = SysCmd(acSysCmdSetStatus, "Accessフィールド名取得中......")
vvArryFldName = FnGetArrayFldName(csTbl)
DoEvents

End Function

'-----------------------------------
Private Function FnGetArrayFldName(argsTblName As String) As String()
Dim voRs As ADODB.Recordset
Dim vsArryFldName() As String
Dim i As Long

Set voRs = CurrentProject.Connection _
.OpenSchema(Schema:=adSchemaColumns, _
Restrictions:=Array(Empty, Empty, argsTblName, Empty))

i = 0
Do Until voRs.EOF '繰り返し 開始 -----------------------------
ReDim Preserve vsArryFldName(i)
vsArryFldName(i) = voRs![COLUMN_NAME].Value 'ソートされて格納されてしまう箇所

Debug.Print vsArryFldName(i) 'デバック結果

i = i + 1
voRs.MoveNext '次のレコードへ
Loop ' 繰り返し 終了 -------------------------------------------

FnGetArrayFldName = vsArryFldName
voRs.Close: Set voRs = Nothing

End Function

-----------------------------------

【12183】Re:テーブル項目の自動取得の並びについて
回答  小僧  - 12/10/24(水) 16:09 -

引用なし
パスワード
   ▼しはん さん:
こんにちは。

>参照中に並び位置が変わってしまいます。

列の並び順を常に意図通りに並べたいのであれば
列を固定する必要があると思います。

Access側で保持している列の並び順通りに表示したいのであれば

>Private Function FnGetArrayFldName(argsTblName As String) As String()
>Dim voRs As ADODB.Recordset
>Dim vsArryFldName() As String
>Dim i As Long
Dim cn As ADODB.Connection '←追加

  Set cn = CurrentProject.Connection '←追加
    cn.CursorLocation = adUseClient '←追加

>Set voRs = CurrentProject.Connection _
>.OpenSchema(Schema:=adSchemaColumns, _
>Restrictions:=Array(Empty, Empty, argsTblName, Empty))

Set voRs = cn.OpenSchema(Schema:=adSchemaColumns, _
Restrictions:=Array(Empty, Empty, argsTblName, Empty)) '←変更

voRs.Sort = "ORDINAL_POSITION" '←追加
>
>i = 0





の様にソートが可能です。
ですが、あくまでも「Accessが保持している順番」ですので
ある日突然違った並び順になっても文句が言えませんね。


列の追加の度にメンテナンスが必要ですが、
Excel出力用のクエリを用意して、
ざっくり出力するのであれば TransferSpredSheetメソッド、
細かな制御をしながら出力するのであれば CopyFromRecordsetメソッドを
利用してエクスポートするのが良さような気がします。

【12205】Re:テーブル項目の自動取得の並びについて
質問  しはん  - 12/11/2(金) 16:15 -

引用なし
パスワード
   すみません。
急な作業が立て込みどうしても閲覧ができず、今時分になってしまいました。

出来ました!!ありがとうございます。

ついでにで教わって申し訳ありませんが
記載頂いています「CopyFromRecordset」は使ったことがないのですが
どの様になるのでしょうか?


▼小僧 さん:
>▼しはん さん:
>こんにちは。
>
>>参照中に並び位置が変わってしまいます。
>
>列の並び順を常に意図通りに並べたいのであれば
>列を固定する必要があると思います。
>
>Access側で保持している列の並び順通りに表示したいのであれば
>
>>Private Function FnGetArrayFldName(argsTblName As String) As String()
>>Dim voRs As ADODB.Recordset
>>Dim vsArryFldName() As String
>>Dim i As Long
>Dim cn As ADODB.Connection '←追加
>
>  Set cn = CurrentProject.Connection '←追加
>    cn.CursorLocation = adUseClient '←追加
>
>>Set voRs = CurrentProject.Connection _
>>.OpenSchema(Schema:=adSchemaColumns, _
>>Restrictions:=Array(Empty, Empty, argsTblName, Empty))
>
>Set voRs = cn.OpenSchema(Schema:=adSchemaColumns, _
>Restrictions:=Array(Empty, Empty, argsTblName, Empty)) '←変更
>
>voRs.Sort = "ORDINAL_POSITION" '←追加
>>
>>i = 0
>
>・
>・
>・
>
>の様にソートが可能です。
>ですが、あくまでも「Accessが保持している順番」ですので
>ある日突然違った並び順になっても文句が言えませんね。
>
>
>列の追加の度にメンテナンスが必要ですが、
>Excel出力用のクエリを用意して、
>ざっくり出力するのであれば TransferSpredSheetメソッド、
>細かな制御をしながら出力するのであれば CopyFromRecordsetメソッドを
>利用してエクスポートするのが良さような気がします。

300 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078190
(SS)C-BOARD v3.8 is Free