【问题标题】:Excel defining range across 100+ sheet tabs, remove duplicates in column for 100+ SheetsExcel 定义 100 多个工作表选项卡的范围,删除 100 多个工作表的列中的重复项
【发布时间】:2017-03-24 07:21:52
【问题描述】:

用例:我想将数据从 A 列复制到 B 列(其中 A、B 列是任意列)。一旦数据在 B 列中,我想删除 B 列中的重复条目。

创建一个循环,将数据从 A 列移动到 B 列,然后删除工作簿中每个工作表的重复项。

`Sub Copy()
    For i = 1 To Sheets.Count
        Worksheets(i).Range("A1:A100")
        Destination:=Worksheets(i).Range("B1")
    Next
End Sub
`

为了测试,我将任务分成两个不同的 Sub()。 Sub Copy() 正在工作并正确复制我的数据。对于我的特定工作簿,Sheet1 也被命名为“Sheet1”

`Sub RemoveStuff()
    Dim rng As Range
    For j = 1 To Sheets.Count
        Set rng = Worksheets("Sheet1").Range(Range("B1"),Range("B1").End(xlDown)).Select
        rng.RemoveDuplicates Columns:=(1), Header:=xlGuess
    Next
End Sub
`

我的错误似乎在于正确定义范围。每张工作表都有不同数量的条目来删除重复项。 Sheet1 可能有 50 行并减少到 6。Sheet2 可能有 70 行并减少到 3。Sheet3 可能有 20 行并减少到 12 个唯一值。 Excel 不允许您从范围中删除重复项 (B:B!)

如何正确定义我的范围,以便我可以在循环中删除重复项,以便为每个工作表动态定义范围(工作簿中的工作表=选项卡)?

编辑 2-23-17 来自 Y0wE3K 的新代码

Sub RemoveStuff() Dim ws As Worksheet For Each ws In Worksheets ws.Columns("P:P").RemoveDuplicates,Columns:=1, Header:=xlYes Next End Sub 还是不行。如果我在运行宏之前手动选择列 P,它可以工作。但它只适用于我选择的一张纸,它似乎没有执行循环。绝对不会自动完成每张纸,或提示我每张纸。 编辑:3/4

确保您没有任何受保护的数据,我也遇到了数据透视表的问题,但我认为这可能是权限,谢谢您的帮助。

【问题讨论】:

  • 从Set rng = .... .Select中删除.Select
  • 您的RemoveStuff 循环实际上不会改变每个循环的任何内容。你的意思是选择所有的工作表并在那里设置一个范围吗?您还应该小心,并在Range("B1") 之前添加工作表。否则,抓取的范围将只是 ActiveSheet 的范围。
  • 你确定Copy 工作正常吗?!?!?!
  • 在下面@YowE3K 的回答中,复制子缺少.copy
  • @VBAPete ... 和行继续符。

标签: vba excel


【解决方案1】:

您的RemoveStuff 子程序可以重写为:

Sub RemoveStuff()
    Dim ws As Worksheet
    For Each ws In Worksheets ' Use Worksheets instead of Sheets, 
                              ' in case there are any Charts
        'You can just select the whole column, rather than selecting
        'specific rows
        ws.Columns("B:B").RemoveDuplicates Columns:=1, Header:=xlGuess
    Next
End Sub

【讨论】:

  • 这不起作用。我的新代码是这样的:Sub RemoveStuff() Dim ws As Worksheet For Each ws In Worksheets ws.Columns("P:P").RemoveDuplicates Columns:=1, Header:=xlYes Next End Sub 查看编辑
  • @ktgold 恐怕我想不出为什么该代码不起作用。 (您粘贴到问题中的代码不会,因为其中有额外的,。)我对其进行了测试,它很高兴地删除了我的测试工作簿包含的三个工作表中的重复项。
  • 我的错误,在搜索完每张工作表后,我意识到有一张带有受保护数据的工作表正在破坏它。我修好了,效果很好!谢谢!
【解决方案2】:
Sub RemoveStuff()
    Dim ws As Worksheet
    For Each ws In Worksheets
        ws.Columns("P:P").RemoveDuplicates,Columns:=1, Header:=xlYes
    Next
 End Sub

此代码将起作用。最后一点,请确保在需要运行删除脚本的工作表中没有受保护的数据或数据透视表。无论出于何种原因导致我失败,但在不受保护的正确工作表上运行我的脚本效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2012-10-09
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多