Vba 仅连接可见行

Vba 仅连接可见行,vba,excel,Vba,Excel,我使用以下VBA将行与公共ID连接起来 Function JoinAll(ByVal BaseValue, ByRef rng As Range, ByVal delim As String) Dim a, i As Long a = rng.Value For i = 1 To UBound(a, 1) If a(i, 1) = BaseValue Then JoinAll = JoinAll & _ IIf(JoinAll = "", "", delim) & a(i

我使用以下VBA将行与公共ID连接起来

Function JoinAll(ByVal BaseValue, ByRef rng As Range, ByVal delim As String)
Dim a, i As Long
a = rng.Value
For i = 1 To UBound(a, 1)
If a(i, 1) = BaseValue Then JoinAll = JoinAll & _
    IIf(JoinAll = "", "", delim) & a(i, 3)
Next
End Function
例如:

ID | Date   | Purchase | Concat Value
1  | 3/4/16 | Car      | Car, Cap
2  | 5/2/12 | Cat      | Cat
1  | 6/2/13 | Cap      | Cap
当运行时,这将创建汽车、帽子

但是,这是一个带有筛选器的表,一旦筛选到此表:

ID | Date   | Purchase | Concat Value
1  | 3/4/16 | Car      | Car, Cap 
2  | 5/2/12 | Cat      | Cat
它仍然显示汽车,而不是忽略帽子是不可见的

我已经看到了这个答案,但不知道如何使用我当前的VBA:

更新: 使用这个函数,我只得到连接的可见项,但我需要它返回第3列中的值。这仅返回第1列中的值:

Function JoinAll(ByVal BaseValue, ByRef rng As Range, ByVal delim As String)

For Each a In rng
If a = BaseValue And a.EntireRow.Hidden = False Then
    JoinAll = JoinAll & IIf(JoinAll = "", "", delim) & a
End If
Next a
End Function

你有没有试过这样的方法:

For each val in rng.Columns(3).Cells
    If val = BaseValue And val.EntireRow.Hidden = False Then
        JoinAll = JoinAll & IIf(JoinAll = "", "", delim) & val
    End If
Next val

这很有效。您的原始代码中有一个输入错误/错误,如
a=rng.value
,因此在考虑隐藏行时,
a
应该是
rng

 Function JoinAll3(ByVal BaseValue, ByRef rng As Range, ByVal delim As String)
    Dim a, i As Long
    a = rng.Value
        For i = 1 To UBound(a, 1)
            If a(i, 1) = BaseValue And rng(i, 1).EntireRow.Hidden = False Then
                JoinAll3 = JoinAll3 & IIf(JoinAll3 = "", "", delim) & a(i, 3)
            End If
        Next
    End Function

它声明“编译错误参数非可选”。这是我的当前代码:函数JoinAll(ByVal BaseValue,ByRef rng作为Range,ByVal delim作为String)Dim a,i只要a=rng.Value,如果Val=BaseValue和Val.EntireRow.Hidden=False,那么JoinAll=JoinAll&IIf(JoinAll=“”,delim)&Val End如果下一个Val End函数可以删除
Dim a,只要a=rng.Value
几乎可以工作,我就需要它来返回第3列中的值。这就是a(i,3)出现的地方。@Kode如果将a(i,3)更改为a(1,3),您的代码将按照您的意愿工作。不是最有效的代码,但可行。当
a.EntireRow
rng.EntireRow
替换为
a=rng.value
并将
rng
作为范围对象时,我怀疑I只是一个输入错误。这会有帮助:用几行伪数据转储数据结构(最简单的示例)。准确确定您要连接的内容-即,您要分类的行中的哪些单元格以及您希望得到什么样的结果…等等。看到一个问题已经花费了一些时间/精力,这会鼓励回答,并鼓励回答更多。我已经修改了我的问题,以获得关于结构的更多细节OK。格式仍然很难闻,但我可以使用它:-)如果我添加了另一行,ID=1,DATE=blah,Purchase=Car,这与第1行完全相同。你想让猫汀表演什么?两辆车(即车,盖,车)或(车(2),盖)或(车,盖),即不计算/不关心重复值。回答如下。检查为工作状态。你有
a.EntireRow.Hidden=False
,我想应该是
rng.EntireRow.Hidden=False