【问题标题】:Formula to Concatenate Visible Cells, Remove Duplicates连接可见单元格、删除重复项的公式
【发布时间】:2017-03-10 01:29:55
【问题描述】:

TL;DR:我需要一个公式来连接可见单元格、删除重复项并在值之间添加“,”。

我有一个电子表格,我一直都有宏过滤并运行数据拉取。

第 3 行包含从 A6:S16627 中的数据集中提取特定指标的公式。

第 3 行中的一个单元格调用 VBA 脚本来运行该脚本连接可见单元格,并返回一个删除重复项的值。

例如,如果数据为 100、100、101、102、101,则返回“100、101、102”。

我的困难是,当父宏运行通过自动过滤器并将第 3 行复制+粘贴到另一张纸上时,此脚本无法有效刷新。

有没有办法将下面的脚本复制为 excel 公式,适用于我上面提供的场景?

Public Function MakeList(myRange As Range)
Dim c As Range, MyDict As Object

    Set MyDict = CreateObject("Scripting.Dictionary")
    On Error Resume Next
    For Each c In myRange
        If Rows(c.Row).Hidden = False Then
            MyDict.Add c.Value, 1
        End If
    Next c

    MakeList = Join(MyDict.keys, ", ")

End Function

感谢您提供的任何帮助。

编辑:

这是与上面代码交互的第二个代码。

Option Explicit

Sub VBAFilterCopyPaste()
    Dim cell As Range 'loop range
    Dim Rng As Range 'range for unique values

    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim ws3 As Worksheet

    Dim lRow As Long 'last row in RegionSummary
    Dim i As Integer 'counter

    Set ws1 = Worksheets("WAP")
    Set ws2 = Worksheets("HCAsummary")
    Set ws3 = Worksheets("NamedRange")

    Application.ScreenUpdating = False

    'reset autofilter
    ws1.ListObjects("Table2").Range.AutoFilter

    'autofilter on project selected
    ws1.ListObjects("Table2").Range.AutoFilter Field:=1, Criteria1:=ws2.Range("Q6")

    'copy Column B in Table2 to named Range I1
    ws1.Range("B5:B16627").SpecialCells(xlVisible).Copy 'extend 16627 this if needed
    ws3.Range("i1").PasteSpecial

    'Remove duplicates for unique values
    ws3.Columns("I:I").RemoveDuplicates Columns:=1, Header:=xlYes

    'set range for loop and sort
    Set Rng = ws3.Range("i2:i" & ws3.Cells(Rows.Count, "i").End(xlUp).Row)
    Rng.Sort Key1:=ws3.Range("I1"), Order1:=xlAscending

    lRow = 11 'set current last row for start of HCASummary

    'loop to copy row 3 from ws1 to ws2

    For Each cell In Rng
        'increment last row
        i = i + 1

        With ws1
            .ListObjects("Table2").Range.AutoFilter Field:=2, Criteria1:=cell.Value
            .Range("A3:S3").Copy
            ws2.Range("a" & lRow + i).PasteSpecial xlPasteValues
        End With

    Next

    'goto ws2.Range A11
    Application.Goto ws2.Range("A11")

    Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • 为什么不从你的其他脚本调用函数?
  • @RyanWildry 你能把它添加到上面你看到它所属的脚本中吗?我不确定你会替换什么。
  • @SJR 它会产生错误,我似乎无法使其正常工作。
  • 您必须将其余代码发布给我们才能解决。
  • @RyanWildry 和 user3598756 - 您的两个脚本都按预期修复了功能。我用我当前的脚本拉取测试了它们中的每一个,并且它们都遭受了与我上面的脚本相同的命运,当过滤器更改时它们不会更新。您必须按 F2+Enter 重新计算输出。有没有办法让它在任何工作表更改时重新运行?也许这可能会解决我的重叠问题。

标签: vba excel excel-formula


【解决方案1】:

我真的不明白你的意思

this script does not refresh effectively when a parent macro runs through the autofilter and copy+paste's row 3 onto another sheet.

你可能想详细说明一下

与此同时,您可以测试这个小小的重构:

Public Function MakeList(myRange As Range)
    Application.Volatile
    Dim c As Range

    With CreateObject("Scripting.Dictionary")
        For Each c In myRange
            If Rows(c.Row).Hidden = False Then .Item(c.Value) = c.Value
        Next c
        MakeList = Join(.keys, ", ")
    End With
End Function

【讨论】:

  • 让我试着澄清一下。我有另一个脚本循环遍历 Sheet1 上的所有过滤器!并从 Sheet1 复制 A3:S3 并将它们粘贴到工作表 2 上。Sheet1 上的 A3:S3 中有公式可以从我的表中提取特定数据。每次脚本筛选到下一个筛选项时,第 3 行中的公式都会重新计算,从而提供要复制到 Sheet2 的新值。 A3:S3 中的三个单元格依赖于上述脚本更新。现在宏中存在错误,导致上述宏连接所有内容,而不是过滤范围内的特定数据。
  • 我最初的希望是看看一个公式是否可以完成与上面我、你和 Ryan 提供的脚本相同的事情。我假设 Excel 公式无法处理这样的请求,因此成为构建 VBA 的原因。
【解决方案2】:

根据要求,我清理了这个函数。有几个问题。正如我所提到的,仅仅忽略从重复中创建的错误并不是一个好主意。而是首先检查该值是否在字典中。

此外,我添加了一些错误处理,并让函数返回一个字符串值,我相信这是你想要的。

Public Function MakeList(ByVal myRange As Range) As String
On Error GoTo Errhand:

    Dim c       As Range
    Dim MyDict  As Object: Set MyDict = CreateObject("Scripting.Dictionary")

    For Each c In myRange
        If Not Rows(c.Row).Hidden Then
            If Not MyDict.exists(c.Value2) Then MyDict.Add c.Value2, 1
        End If
    Next

    MakeList = Join(MyDict.keys, ", ")

 cleanExit:
    Set MyDict = Nothing
    Set c = Nothing
    Exit Function

Errhand:
    Debug.Print Err.Number, Err.Description
    GoTo cleanExit
End Function

【讨论】:

  • 谢谢瑞恩。不幸的是,代码在运行时不返回任何连接值。自己测试的一种简单方法是制作任何数据集,例如在 A 列中输入 1-25,在 B1 列中输入 =MakeList(A1:A25),它应该连接所有值。目前,我认为代码不会运行。
  • Ryan,认为您只是在 If 子句中缺少一个 Not。
  • 我看到了,添加到字典时。我刚才加了。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2014-03-31
  • 2016-03-06
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 2014-11-11
相关资源
最近更新 更多