2014-08-27 3 views
1

Я использую следующий 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 

При запуске, это создает автомобиль, Cap.

Однако это таблица с фильтром, и как только он фильтруется на это:

ID | Date | Purchase | Concat Value 
1 | 3/4/16 | Car  | Car, Cap 
2 | 5/2/12 | Cat  | Cat 

Он все еще показывает автомобиль, Cap вместо того, чтобы игнорировать, что крышка не видно.

Я видел этот ответ, но не понимаю, как заставить его работать с моим текущим 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

Непонятно, что именно вы пытаетесь объединить. Это поможет: сброс структуры ваших данных с помощью пары строк фиктивных данных (минимальный пример). Идентификация именно того, что вы пытаетесь конкатенировать, то есть, какие ячейки в строке, которую вы котали, и какие результаты вы ожидаете ... и т. Д. И т. Д. Увидев, что у вопроса было какое-то время/усилия, , и многое другое. –

+0

Я пересмотрел свой вопрос, чтобы иметь более подробную информацию о структуре – Kode

+0

ОК. Формат все еще вонючий, но я могу работать с этим :-) –

ответ

1

Это работает. В исходном коде есть опечатка/ошибка: 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 
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

В нем говорится: «Ошибка компиляции ошибки не является необязательной». Вот мой текущий код: Функция JoinAll (ByVal BaseValue, ByRef rng As Range, ByVal delim As String) Dim a, i As Long a = rng.Value Для каждого Val In rng Если Val = BaseValue And Val.EntireRow .Hidden = False Тогда JoinAll = JoinAll & IIF (JoinAll = "", "", DELIM) и Val End If Next Val End Function – Kode

+1

Вы можете удалить 'Dim а, я, как Длинные = rng.Value' – Tom

+0

Это работает почти, но мне нужно, чтобы оно возвращало значение в столбце 3. Именно там вошел (i, 3). – Kode

Смежные вопросы