2013-04-17 62 views
6

CopyFromRecordsetメソッドを使用してADODBレコードセットからExcelテーブルを更新しています。ADODBレコードセットからデータをコピーするとExcelテーブルが数値フォーマットを失う

更新後、数値の列がある場合はいつでも、数値は日付として表示されます。

私が今まで使用していた回避策は、VBAまでの数値に列を戻す方法ですが、レポートが完了するまでに時間がかかるため、良い解決策ではありません。また、私は多くのテーブルを収容するコードを書く必要があります。

クイックフィックスはありますか?どんな助けでも大歓迎です。

'Delete old data and copy the recordset to the table 
Me.ListObjects(tblName).DataBodyRange.ClearContents 
Me.Range(tblName).CopyFromRecordset rst 

tblNameは -

+0

'CopyFromRecordset'を使用してデータをエクスポートする前に、この' Me.Range(tblName).Columns(1).Numberformat = "0" 'を試してください。たとえば' 1 'は数字が格納されている関連する列です。 –

+0

私は現在、データのインポート後、各数値列(または可能な場合は列の範囲)にこれを実行しています。インポートする前にそれを行うとタイミングが変わるだけですが、問題は解決しません。私はまだすべてのテーブルのすべての数値列を修正するコードを記述する必要があります。私は、インポートの前に書式を保持しておきたいと思います。 – flungu

+0

ADODBレコードセットには「フォーマット」はなく、データ型のみがあります。列ADODBデータ型に基づいてExcel形式を自動的に設定するようにコードを変更できますが、ADODBデータセットには本質的な形式はありません。その中のすべてのプロパティを見てください。 –

答えて

1

以下のサンプルコードであるRSTデータと同じ形式/データ型のデータを保持されている既存のテーブルを参照します。 proc getTableDataが呼び出されるたびに、table1の書式設定&の列書式がレコードセットに従って保持されます。私はこれがあなたが探しているものであることを願っています。

Sub getTableData() 

    Dim rs As ADODB.Recordset 
    Set rs = getRecordset 

    Range("A1").CurrentRegion.Clear 
    Range("A1").CopyFromRecordset rs 
    Sheets("Sheet1").ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlNo).Name = "Table1" 

End Sub 



Function getRecordset() As ADODB.Recordset 

    Dim rsContacts As ADODB.Recordset 
    Set rsContacts = New ADODB.Recordset 

    With rsContacts 
     .Fields.Append "P_Name", adVarChar, 50 
     .Fields.Append "ContactID", adInteger 
     .Fields.Append "Sales", adDouble 
     .Fields.Append "DOB", adDate 
     .CursorLocation = adUseClient 
     .CursorType = adOpenStatic 

     .Open 

     For i = 1 To WorksheetFunction.RandBetween(3, 5) 
      .AddNew 
      !P_Name = "Santosh" 
      !ContactID = 2123456 * i 
      !Sales = 10000000 * i 
      !DOB = #4/1/2013# 
      .Update 
     Next 

     rsContacts.MoveFirst 
    End With 

    Set getRecordset = rsContacts 
End Function 

enter image description here

+0

サンプルコードをありがとうございます。しかし、テーブルを削除することはできません(Range( "A1")。CurrentRegion.Clear'はテーブルを完全に削除します)。テーブルを再利用する必要があります。それ以外の場合は、すべての式に「#REF!」というエラーがあります。数値が日付としてフォーマットされる問題は、古いデータ( 'Me.ListObjects(tblName))のテーブルをクリアした後に発生します。DataBodyRange.ClearContents')、新しいデータをレコードセットから同じテーブルにコピーします( 'Me.Range(tblName).CopyFromRecordset rst')。 – flungu

1

これを試してみてください - 私はこれが後半の答えですけど、私はこれに遭遇したエクセル

Dim rs As New ADODB.Recordset 

Dim targetRange As Excel.Range 

Dim vDat As Variant 

' Set rs 

' Set targetRange 

rs.MoveFirst 

vDat = Transpose(rs.GetRows) 

targetRange.Value = vDat 


Function Transpose(v As Variant) As Variant 
    Dim X As Long, Y As Long 
    Dim tempArray As Variant 

    ReDim tempArray(LBound(v, 2) To UBound(v, 2), LBound(v, 1) To UBound(v, 1)) 
    For X = LBound(v, 2) To UBound(v, 2) 
     For Y = LBound(v, 1) To UBound(v, 1) 
      tempArray(X, Y) = v(Y, X) 
     Next Y 
    Next X 

    Transpose = tempArray 

End Function 
0

にそれを、それを転置、配列にこのコピーの結果セットして、コピー同じエラー。私は回避策を見つけたと思う。

Excelは、範囲がセルの範囲ではなく左上のセルであると考えているようです。だからRange(tblName).Cells(1,1).CopyFromRecordset rst

'Delete old data and copy the recordset to the table 
Me.ListObjects(tblName).DataBodyRange.ClearContents 
Me.Range(tblName).Cells(1,1).CopyFromRecordset rst 

も対象シートがアクティブであるという要件があるように、あなたのステートメントを変更するので、あなたはかもしれないは、シートが最初にアクティブであることを確認した後、以前にアクティブに戻って変更する必要がありますシート。これは、Excelのそれ以降のバージョンで修正されている可能性があります。

関連する問題