我有两个电子表格。第一个电子表格在同一列中包含连续行的部件号和描述。我需要从第一个电子表格中获取部件号和描述,然后将它们(仅限值,无格式化)转置到第二个电子表格中,以便现在部件号和描述是连续的列而不是行。为了解决这个问题,我将以下VBA代码添加到Worksheet_Change()函数中。
If Not Application.Intersect(Target, MatNumDesc) Is Nothing Then
If Application.CutCopyMode = xlCopy Then
Application.Undo
Target.PasteSpecial Paste:=xlPasteValues, Transpose:=True
End If
End If
MatNumDesc是一系列单元格,我将在其中粘贴零件号。如果我有2个以上的材料和描述一切正常,我的问题是当只有一种材料和描述时。在这些情况下,我得到了一个我不想要的重复条目。
要清楚,我是在两个独立文件的电子表格之间手动复制和粘贴值(使用Ctrl-C和Ctrl-V)。我没有使用任何VBA代码尝试从一张纸复制到另一张,因为不值得进入的原因,它不适用于我的设置。
另外,从我能够观察到的,我面临的实际问题与默认的Excel行为有关。我复制的是2行1列数据。转置后,它将变为2列和1行,但在.Application.Undo
操作运行后,将选择2行和2列,然后Excel将运行.PasteSpecial
操作。至少从我能够观察到的情况来看。
答案 0 :(得分:0)
使用您提供的有限代码部分调试有点难,但Worksheet_Change
事件宏中更改值的标准做法是暂时关闭.EnableEvents
该子操作不会触发另一个尝试在其自身上运行的事件。
If Not Application.Intersect(Target, MatNumDesc) Is Nothing Then
If Application.CutCopyMode = xlCopy Then
on error goto Fìn
application.enableevents = false ' turn off event handling
Application.Undo
Target.PasteSpecial Paste:=xlPasteValues, Transpose:=True
End If
End If
Fìn:
application.enableevents = true 'remember to turn it back on before exiting the sub
答案 1 :(得分:0)
经过一些测试后,我相信我至少找到了一个解决方案。不必使用Excel定义的Target
,而是必须命名显式范围。因此,初始代码的更正版本将如下所示。
If Not Application.Intersect(Target, MatNumDesc) Is Nothing Then
If Application.CutCopyMode = xlCopy Then
Application.Undo
ThisWorkbook.Sheets("Sheet1").Range("G" & Target.Row).PasteSpecial Paste:=xlPasteValues, Transpose:=True
End If
End If
在此示例列中" G"使用,但它可以替换为任何其他列。