Excel 2016 VBA 插入新列时更新 1705 后宏中断
Excel 2016 VBA macro breaks after update 1705 when inserting a new column
我在一个宏中有一些 VBA 代码,在 Excel 2016 年更新 1703 时运行良好。但是,一个用户刚刚获得了新的更新 (1705),现在这个宏给出了一个“1004 application/object 未知”错误。错误发生在这部分代码中,特别是在第二个 Selection.Offset(1,0).Select 行。
'Get the values from the first column
Range("A2 : A" & NumRows).Select
Selection.Copy
'Paste the copy once for each column containing data
For I = 2 To NumCols
Range("A2").Select
Selection.End(xlDown).Select
Selection.Offset(1, 0).Select
ActiveSheet.Paste
Next
'Insert a new column at the front of the worksheet
Columns("A:A").Select
Selection.Insert Shift:=xlToRight
'Get the first data column header and copy it
Range("C1").Select
Selection.Copy
'Paste the selection into the first column
Range("A2:A" & NumRows).Select
ActiveSheet.Paste
'Get and copy the rest of the headers
For I = 1 To NumCols
Range("C1").Select
Selection.Offset(0, I).Select
Selection.Copy
For C = 2 To NumRows
Range("A2").Select
Selection.End(xlDown).Select
Selection.Offset(1, 0).Select
ActiveSheet.Paste
Next
Next
我在 1703 和 1705 的计算机之间注意到的一件事是,在 1703 上插入的新列是空的,而在 1705 上新列的值一直到最大行数(行号 > 1万)。
所以我想我的问题是,如何插入新列而不让数据填满所有行直到 Excel 最大行?
我对此做了一些研究。知道它在 1703 年有效而在 1705 年无效,我查找了不同版本的变更日志。这是我能找到的所有内容:
它说他们添加了一个新功能,叫做"Keep the Copy","With this update you can copy your cells, and before you paste, you can still do other tasks like typing or inserting cells." VBA代码设置为select一列,然后插入一个新的(空)它前面的柱子。但是,由于单元格之前已被复制,新功能保留了它们并将它们插入到新列中,用值填充了整个列(超过一百万行)。
因此,由于我注意到旧版本在新创建的列中没有值,我认为 "Keep the Copy" 功能可能是罪魁祸首。在创建新列之前,我在 Stack Overflow 中搜索了一种清除剪贴板内容(感谢 SO!)的方法。
我更改了我的代码:
Columns("A:A").Select
Selection.Insert Shift:=xlToRight
为此:
Application.CutCopyMode = False 'Clears any copied cells so they do not get inserted into the new column
Columns("A:A").Select
Selection.Insert Shift:=xlToRight
这解决了问题。我希望其他人能从这些知识中找到价值。
我在一个宏中有一些 VBA 代码,在 Excel 2016 年更新 1703 时运行良好。但是,一个用户刚刚获得了新的更新 (1705),现在这个宏给出了一个“1004 application/object 未知”错误。错误发生在这部分代码中,特别是在第二个 Selection.Offset(1,0).Select 行。
'Get the values from the first column
Range("A2 : A" & NumRows).Select
Selection.Copy
'Paste the copy once for each column containing data
For I = 2 To NumCols
Range("A2").Select
Selection.End(xlDown).Select
Selection.Offset(1, 0).Select
ActiveSheet.Paste
Next
'Insert a new column at the front of the worksheet
Columns("A:A").Select
Selection.Insert Shift:=xlToRight
'Get the first data column header and copy it
Range("C1").Select
Selection.Copy
'Paste the selection into the first column
Range("A2:A" & NumRows).Select
ActiveSheet.Paste
'Get and copy the rest of the headers
For I = 1 To NumCols
Range("C1").Select
Selection.Offset(0, I).Select
Selection.Copy
For C = 2 To NumRows
Range("A2").Select
Selection.End(xlDown).Select
Selection.Offset(1, 0).Select
ActiveSheet.Paste
Next
Next
我在 1703 和 1705 的计算机之间注意到的一件事是,在 1703 上插入的新列是空的,而在 1705 上新列的值一直到最大行数(行号 > 1万)。
所以我想我的问题是,如何插入新列而不让数据填满所有行直到 Excel 最大行?
我对此做了一些研究。知道它在 1703 年有效而在 1705 年无效,我查找了不同版本的变更日志。这是我能找到的所有内容:
它说他们添加了一个新功能,叫做"Keep the Copy","With this update you can copy your cells, and before you paste, you can still do other tasks like typing or inserting cells." VBA代码设置为select一列,然后插入一个新的(空)它前面的柱子。但是,由于单元格之前已被复制,新功能保留了它们并将它们插入到新列中,用值填充了整个列(超过一百万行)。
因此,由于我注意到旧版本在新创建的列中没有值,我认为 "Keep the Copy" 功能可能是罪魁祸首。在创建新列之前,我在 Stack Overflow 中搜索了一种清除剪贴板内容(感谢 SO!)的方法。
我更改了我的代码:
Columns("A:A").Select
Selection.Insert Shift:=xlToRight
为此:
Application.CutCopyMode = False 'Clears any copied cells so they do not get inserted into the new column
Columns("A:A").Select
Selection.Insert Shift:=xlToRight
这解决了问题。我希望其他人能从这些知识中找到价值。