2014-08-27 98 views
1

我使用下面的VBA有一个共同的IDCONCATENATE仅显示行

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:

Excel VBA Concatenate only visible cells of filtered column. Test code included

UPDATE: 使用此我得到的只是可见的项目加入,但我需要它在列返回值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 
+0

它并不清楚你想要连接的是什么。这将有助于:将数据结构的转储与几行伪数据(最小示例)进行转储。确切地确定你想要连接的内容 - 例如,你所在的行中的哪些单元格以及你期待的结果是什么等等等等。看到一个问题已经花费了一些时间/精力来鼓励回答,还有更多。 – 2014-08-27 21:42:06

+0

我修改了我的问题,以获得更多关于结构 – Kode 2014-08-27 21:58:59

+0

的详细信息。格式仍然很臭,但我可以用这个:-) – 2014-08-27 22:10:27

回答

1

This works。原始代码中存在拼写错误​​,因此在考虑隐藏行时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 
1

你有没有尝试过这样的:

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 
+0

它声明“编译错误参数不是可选的”。这里是我当前的代码:Function JoinAll(ByVal BaseValue,byRef rng As Range,ByVal delim As String) Dim a,i As Long Long a = rng.Value For Each Val In rng 如果Val = BaseValue和Val.EntireRow .Hidden = False Then JoinAll = JoinAll&IIf(JoinAll =“”,“”,delim)&Val End If Next Val End Function – Kode 2014-08-27 21:35:05

+1

您可以删除Dim a,i as long a = rng.Value' – Tom 2014-08-27 21:39:03

+0

几乎适用,但我需要它返回第3列中的值。这是(i,3)进来的地方。 – Kode 2014-08-27 21:50:27