Excel 转置删除重复条目

Excel Transpose Remove Duplicate Entries

我有两个点差sheet。第一个 spreadsheet 在同一列但连续的行中有零件号和描述。我需要从第一个 spreadsheet 中获取零件号和描述,然后将它们(仅值,无格式)转置到第二个 spreadsheet 上,这样现在零件号和描述就在连续的列中的行。为了解决这个问题,我在 Worksheet_Change() 函数中添加了以下 VBA 代码。

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+ material 和描述一切正常,我的问题是只有一个 material 和描述。在那些情况下,我得到了一个我不想要的重复条目。

需要说明的是,我在两个单独的文件之间手动复制和粘贴值(使用 Ctrl-C 和 Ctrl-V)。我没有使用任何 VBA 代码来尝试从一个 sheet 复制到另一个,因为不值得探讨的原因,它不适用于我的设置。

此外,据我观察,我面临的实际问题与默认 Excel 行为有关。我复制的是2行1列的数据。转置时它变成 2 列和 1 行,但是在 .Application.Undo 操作运行后,选择 2 行和 2 列,Excel 然后在其上运行 .PasteSpecial 操作。至少从我能够观察到的情况来看。

使用您提供的有限代码段进行调试有点困难,但是 Worksheet_Change 事件宏中更改值的标准做法是暂时关闭 .EnableEvents,以便sub 的操作不会触发另一个事件,它试图 运行 在其自身之上。

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

经过一些测试,我相信我至少找到了一个解决方案。必须指定一个明确的范围,而不是使用由 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" 列,但它可以替换为任何其他列。