copyFromRecordset正在改变其他工作表中的格式

时间:2017-08-24 18:45:35

标签: sql excel-vba adodb vba excel

我已经使用了几个月的VBA宏突然开始将不相关工作表中的单元格重新格式化为日期格式。我通过代码找到了有问题的行,它似乎是" copyFromRecordset"功能。请参阅下面的相关snippit。是的,这个简单直接的代码正在创造这个奇怪的问题。

Dim adRs As ADODB.Recordset
Set adRs = New ADODB.Recordset
Dim SQLQuery As String 
SQLQuery = "SELECT Field1, Field2 FROM Table;"
On Error GoTo OpenFailed
adRs.Open SQLQuery, adConn, adOpenStatic, adLockPessimistic         
If Not (adRs.BOF And adRs.EOF) Then
    Worksheets("Sheet2").Range("A2:O300").CopyFromRecordset adRs
End If

遇到类似问题,以下是我尝试过的步骤。

  1. 我确保所有受影响的单元格都有特定的数字格式,并且未设置为" General"
  2. 我删除了工作簿中的所有自定义数字格式
  3. 我确保没有与" Normal"相关联的数字格式或任何其他使用过的细胞样式。
  4. 此外,受影响的行数似乎取决于记录集中的行。如果记录集是5行长,那么前5行' Sheet1'被重新格式化。如果它是10行长,那么前10行。Office 2013和2016都会出现此问题。

    更新:我将CopyFromRecordset函数的范围更改为仅引用粘贴范围的左上角单元格。现在,它不会影响Sheet1的所有列,而只会显着影响单个列。 " N列和34号;为了它的价值。

1 个答案:

答案 0 :(得分:1)

copyfromrecordset存在问题,当数据复制(具体日期)时,它会格式化activesheet而不是目标表格。

我已经解决了这个问题,只需在复制前激活目标表单,在您的情况下:

Dim adRs As ADODB.Recordset
Set adRs = New ADODB.Recordset
Dim SQLQuery As String  
SQLQuery = "SELECT Field1, Field2 FROM Table;"
On Error GoTo OpenFailed
adRs.Open SQLQuery, adConn, adOpenStatic, adLockPessimistic         

Worksheets("Sheet2").Activate

If Not (adRs.BOF And adRs.EOF) Then
    Worksheets("Sheet2").Range("A2:O300").CopyFromRecordset adRs
End If

我发现这并没有大幅减慢我的表现。如果您需要将活动工作表还原为您正在使用的工作表,则可以使用此工具:

Dim adRs As ADODB.Recordset
Dim WS as Worksheet
Set adRs = New ADODB.Recordset
Dim SQLQuery As String  
SQLQuery = "SELECT Field1, Field2 FROM Table;"
On Error GoTo OpenFailed
adRs.Open SQLQuery, adConn, adOpenStatic, adLockPessimistic         

Set WS = ActiveSheet
Worksheets("Sheet2").Activate

If Not (adRs.BOF And adRs.EOF) Then
    Worksheets("Sheet2").Range("A2:O300").CopyFromRecordset adRs
End If
WS.Activate