从ADODB记录集复制数据时,Excel表丢失数字格式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从ADODB记录集复制数据时,Excel表丢失数字格式相关的知识,希望对你有一定的参考价值。
我正在使用CopyFromRecordset
方法从ADODB记录集更新excel表。
更新后,数字显示为有数字列的日期。
到目前为止我使用的解决方法是通过VBA将列格式化为数字,但这不是一个好的解决方案,因为报告需要更长的时间才能完成。另外,我必须编写代码来容纳很多表。
有快速解决方案吗?任何帮助是极大的赞赏。
'Delete old data and copy the recordset to the table
Me.ListObjects(tblName).DataBodyRange.ClearContents
Me.Range(tblName).CopyFromRecordset rst
tblName
- 指的是一个包含与第一个数据相同格式/数据类型的数据的现有表
试试这个 - 这会将结果集复制到一个数组中,对其进行转置,然后将其复制到excel中
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
我知道这是一个迟到的答案,但我遇到了同样的错误。我想我找到了一个解决方法。
似乎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中修复。
以下是示例代码。每当调用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
在阅读了遇到同样问题的其他人的论坛帖子后,这里有我所知道的所有选项(其中一些已经在其他答案中提到过):
- 仅插入目标范围的第一个单元格 - 请参阅@ ThunderFrame的答案。
- 激活包含
CopyFromRecordset()
上方行上目标范围的工作表 - 关闭自动重新计算:
Application.Calculation = xlCalculationManual .CopyFromRecordset rs Application.Calculation = xlCalculationAutomatic
解决方法:
- 迭代行/列并一次插入一个值 - @ Sriketan的答案为此提供了代码。另外的代码片段在下面的链接中。
- 粘贴到临时工作簿中,然后从那里复制它。
资料来源:
- Duchgemini的帖子和讨论:https://dutchgemini.wordpress.com/2011/04/21/two-serious-flaws-with-excels-copyfromrecordset-method/
- 微软的论坛:https://social.msdn.microsoft.com/Forums/office/en-US/129c0a52-4ccb-4f54-9e38-8c0ae6e300b1/copyfromrecordset-corrupts-cell-formats-for-the-whole-excel-workbook?forum=exceldev
以上是关于从ADODB记录集复制数据时,Excel表丢失数字格式的主要内容,如果未能解决你的问题,请参考以下文章
ADODB 记录集不会在 MS SQL 的临时表中添加新记录