2012-04-20 3 views
2

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

Я думаю, что нужно:

  • найти первую ячейку со значением в столбце
  • убедитесь, что следующая строка не пуста
  • найти последнюю ячейку в диапазоне
  • "выполнить операцию" на полигоне

Start

enter image description here

+0

Вы можете перемещаться по диапазону и сохранять содержимое ячейки в переменной, разделенной с помощью 'vbNewline', а затем в конце писать в ячейку? –

+0

Спасибо. Является ли процедура выше наилучшего способа определения диапазонов? Их должно быть несколько тысяч, разделенных пробелами. – adayzdone

ответ

2

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

Option Explicit 

'~~> You can use any delimiter that you want 
Const Delim = vbNewLine 

Sub Sample() 
    Dim rngInput As Range, rngOutput As Range 

    Application.ScreenUpdating = False 

    Set rngInput = Range("A1:A5") '<~~ Input Range 
    Set rngOutput = Range("B1") '<~~ Output Range 

    Concatenate rngInput, rngOutput 

    Application.ScreenUpdating = True 
End Sub 

Sub Concatenate(rng1 As Range, rng2 As Range) 
    Dim cl As Range 
    Dim strOutPut As String 

    For Each cl In rng1 
     If strOutPut = "" Then 
      strOutPut = cl.Value 
     Else 
      strOutPut = strOutPut & Delim & cl.Value 
     End If 
    Next 

    rng2.Value = strOutPut 
End Sub 
+0

Как бы это изменить, чтобы заменить первую ячейку исходного диапазона на Конкатенированный диапазон, а не помещать его в b1? – adayzdone

+0

Изменяя 'Concatenate rngInput, rngOutput' на' Concatenate rngInput, rngInput.Cells (1, 1) ':) –

+0

Или вы можете изменить' Set rngOutput = Range ("B1") 'to' Установить rngOutput = rngInput.Cells (1, 1) ' –

1

В контексте кода на листе рабочего листа будут работать следующие. Столбец 2 жестко закодирован, поэтому вы можете передать значение или изменить его в соответствии с вашими потребностями.

Dim rng As Range 
Set rng = Me.Columns(2) 

Dim row As Integer 
row = 1 

' Find first row with non-empty cell; bail out if first 100 rows empty 
If IsEmpty(Me.Cells(1, 2)) Then 
    Do 
     row = row + 1 
    Loop Until IsEmpty(Me.Cells(row, 2)) = False Or row = 101 
End If 

If row = 101 Then Exit Sub 

' We'll need to know the top row of the range later, so hold the value 
Dim firstRow As Integer 
firstRow = row 

' Combine the text from each subsequent row until an empty cell is encountered 
Dim result As String 
Do 
    If result <> "" Then result = result & vbNewLine 
    result = result & Me.Cells(row, 2).Text 
    row = row + 1 
Loop Until IsEmpty(Me.Cells(row, 2)) 

' Clear the content of the range 
Set rng = Me.Range(Me.Cells(firstRow, 2), Me.Cells(row, 2)) 
rng.Clear 

' Set the text in the first cell 
Me.Cells(firstRow, 2).Value2 = result 
+0

Я думаю, что понял. Я добавил sub tester() в начало и заменил Me ActiveSheet. Правильно? Спасибо. – adayzdone

+0

Я только заметил, что это работает для первого диапазона в столбце 2, но не для других. Это, конечно, достаточно, чтобы указать мне в правильном направлении. Еще раз спасибо. – adayzdone

+0

@adayzdone Извините, я не вижу в этом необходимости. Вы хотите, чтобы следующий набор находился в следующей ячейке вниз от первой или в верхней ячейке диапазона? – Jay