Excel Transpose删除重复条目

时间:2015-01-12 19:54:37

标签: excel vba excel-vba

我有两个电子表格。第一个电子表格在同一列中包含连续行的部件号和描述。我需要从第一个电子表格中获取部件号和描述,然后将它们(仅限值,无格式化)转置到第二个电子表格中,以便现在部件号和描述是连续的列而不是行。为了解决这个问题,我将以下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操作。至少从我能够观察到的情况来看。

2 个答案:

答案 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"使用,但它可以替换为任何其他列。