2013-08-09 2 views
1

Я относительно новичок в использовании VBA. У меня есть этот код, который считывает набор данных в диапазоне и объединяет данные в ячейку. У меня есть широкий диапазон ячеек, которые нужно запустить в этом коде. Может ли кто-нибудь помочь мне с циклом, поэтому, когда код закончил для одного диапазона, он перемещается вниз по следующей ячейке и запускается в следующем диапазоне?Код VBA в нескольких ячейках

Sub ConcatenateAll() 
    Dim x As String, y As String, rng As Range, cell As Range 

    With ActiveSheet 
     Set rng = .Range("AT1:CB20") 
     For Each cell In rng 
      If cell.Value <> "" Then 
       x = x & cell.Value & "; " 
      End If 
     Next 
     .Range("AK1").Value = Left(x, Len(x) - 2) 
    End With 
End Sub 
+0

Имеет ли смысл порядок прохождения диапазона? Кроме того, что вы подразумеваете под «когда код закончился для одного ** диапазона **»? Существуют ли другие диапазоны помимо '.Range (« AT1: CB20 »)'? – neizan

ответ

0

Лучший способом я могу думать об этом, чтобы передать параметры ConcatenateAll процедуры, а затем отметить, что все диапазоны вы хотите конкатенации. Например, я звоню ConcatenateAll() дважды с Sample()

Я также позвонил, чтобы немного изменить ваш код.

Sub Sample() 
    With ActiveSheet 
     ConcatenateAll .Range("AT1:CB20"), .Range("AK1") 
     ConcatenateAll .Range("AT31:CB50"), .Range("AK2") 
    End With 
End Sub 

Sub ConcatenateAll(rngInput As Range, rngOutput As Range) 
    Dim x As String, cell As Range 

    For Each cell In rngInput 
     If Len(Trim(cell.Value)) <> 0 Then 
      If x = "" Then 
       x = cell.Value 
      Else 
       x = x & "; " & cell.Value 
      End If 
     End If 
    Next 

    rngOutput.Value = x 
End Sub 

Followup

AT1: CB20, AT21: CB40, AT41: CB60, AT61: CB80 Я хотел бы результат не отображается в AK1, АК2, АК3, АК4 и так далее до тех пор, конец диапазонов - пользователь2668126 4 мин. назад

Попробуйте этот код. Поскольку существует тренд, становится легче проходить через диапазоны.

Option Explicit 

Sub Sample() 
    Dim r1 As Long, r2 As Long, i As Long 

    r2 = 20: i = 1 

    With ActiveSheet 
     For r1 = 1 To 2001 Step 20 
      ConcatenateAll .Range("AT" & r1 & ":CB" & r2), .Range("AK" & i) 
      r2 = r2 + 20: i = i + 1 
     Next 
    End With 
End Sub 

Sub ConcatenateAll(rngInput As Range, rngOutput As Range) 
    Dim x As String, cell As Range 

    For Each cell In rngInput 
     If Len(Trim(cell.Value)) <> 0 Then 
      If x = "" Then 
       x = cell.Value 
      Else 
       x = x & "; " & cell.Value 
      End If 
     End If 
    Next 

    rngOutput.Value = x 
End Sub 
+0

Спасибо, это в значительной степени то, что я хотел. Тем не менее, у меня есть около 2000 диапазонов, чтобы использовать это. Есть ли способ создать простую функцию для запуска всех этих функций и отображения соответствующих данных? – user2668126

+0

Если есть тенденция в том, как располагаются диапазоны, вы можете вызывать все эти диапазоны в цикле. Если вы можете привести несколько примеров своих диапазонов, то я вижу, есть ли тенденция ... Например, 'AT1: CB20',' AT31: CB50', 'AT61: CB80' Здесь мы видим тенденцию ... –

+0

В диапазонах есть повторение, каждое из которых соответствует вашему примеру. Конечный диапазон: AT2001: CB2020 – user2668126

0

Поскольку вы пытаетесь отобразить результат в ячейке, я думаю, что лучший способ действовать, чтобы написать пользовательскую функцию VBA, а затем использовать его в качестве функции рабочего листа Excel Чтобы сделать это, сначала вам необходимо определить общественную функцию в модуле VBA:

Public Function concat(values As Variant) 

    Dim val As Variant, aux As String 

    For Each val In values 
     If val <> "" Then aux = aux & val & "; " 
    Next val 

    If Len(aux) > 2 Then aux = Left(aux, Len(aux) - 2) 
    concat = aux 

End Function 

Затем вы можете использовать эту функцию в качестве функции рабочего листа, например, вы можете написать в ячейке =concat(AT1:CB20), и вы получите тот же результат своего кода

+0

Это может быть полезно, поскольку мне, вероятно, понадобится снова использовать код в какой-то момент. Однако, когда я сделал это, как вы указали, и введите формулу, в ячейке произошла ошибка. Есть идеи? – user2668126

+0

Ошибка ведьмы? Формула отлично работала здесь –