我已经使用了几个月的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
遇到类似问题,以下是我尝试过的步骤。
此外,受影响的行数似乎取决于记录集中的行。如果记录集是5行长,那么前5行' Sheet1'被重新格式化。如果它是10行长,那么前10行。Office 2013和2016都会出现此问题。
更新:我将CopyFromRecordset函数的范围更改为仅引用粘贴范围的左上角单元格。现在,它不会影响Sheet1的所有列,而只会显着影响单个列。 " N列和34号;为了它的价值。
答案 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