使用循环将所有文本合并到列中

时间:2014-01-22 03:52:48

标签: excel vba loops excel-vba

寻找有关编写循环的帮助,该循环将组合列中的所有文本值,同时在每个文本值之间添加“OR”。为了给出一些上下文,我有一个存储在列中的文件名,我想编写一个宏,它将所有那些用“OR”分隔的文件名组合在一起,这样我就可以将字符串复制并粘贴到windows搜索栏中并查找所有这些文件。夹。

例如(在A栏中)

Apples
Oranges
Bananas
Pears
Blueberries

在B1中,结果应为Apples OR Oranges OR Bananas OR Pears OR Blueberries

5 个答案:

答案 0 :(得分:2)

虽然在VBA中学习使用ForDo循环是一项基本技能,但您会发现在范围的单元格上循环很慢,并且通常太慢而不能很有用。通常有一种替代方案,在这种情况下,它是Join函数:

Function MergeColumn(rng As Range, Delimiter As String) As Variant
    MergeColumn = Join(Application.Transpose(rng.Columns(1).Value), Delimiter)
End Function

这是如何运作的:

  • 它是一个UDF,因此可以从其他VBA代码或工作表单元格调用
  • 您传递Range个对象。它仅处理该Range
  • 的最左侧列
  • rng.Columns(1).Value返回最左侧的列,作为2D Variant数组,大小为n x 1,其中nrng中的行数。也就是说,其维度为1 to n, 1 to 1
  • Application.Transpose转置数组。它具有以下附加功能:当传递n x 1数组时,它返回1D数组长度n。也就是说,其维度为1 to n
  • Join连接数组的每个成员,在每个元素之间插入Delimiter

像这样使用

在VBA中

Sub Demo
    Dim r as Range
    Dim strResult as String
    ' Get a reference to the range to be processed, eg
    Set r = Range("A1:A10")
    ' Call the function
    strResult = MergeColumn(r, " OR ")
    ' Print Result to Imedieate window
    Debug.Print strResult
End Sub

作为细胞配方

=MergeText(A1:A10," OR ")

答案 1 :(得分:1)

使用公式(假设Apples在A2中,B1为空白):

=IF(ISBLANK(B1),A2,B1&" OR "&A2)  

向下复制以适应(并在最后一行输出)。

答案 2 :(得分:0)

一个简单的解决方案。随意修改代码。 我没有包括很多灵活性,比如计算最后一行。 只是一个基本模板,向您展示如何使用for循环。

for li_row = 1 to 10
   if str_file = '' then
      str_file = cells(li_row,1).value
   else
      str_file = str_file + ' OR ' + cells(li_row,1).value
   end if
next

cells(1,2).value = str_file

答案 3 :(得分:0)

这是一个使用For Each Loop

的简单示例
Dim cel as Range, rng as Range

Set rng = Range("A1","A5")

For Each cel in rng
    With Range("B1")
        If .Value = "" Then
            .Value = cel
        Else
            .Value = .Value & "OR" & cel
        End If
    End With
Next

使用简单的For Loop

Dim rng as Range, i as integer

Set rng = Range("A1", "A5")

For i = 1 to rng.Rows.Count
    With Range("B1")
        If .Value = "" Then
            .Value = rng.Range("A" & i)
        Else
            .Value = .Value & "OR" & rng.Range("A" & i)
        End If
    End With
Next

使用Do Loop

Dim rng as Range, i as integer

Set rng = Range("A1", "A5")
i = 1

Do Until i > rng.Rows.Count
    With Range("B1")
        If .Value = "" Then
            .Value = rng.Range("A" & i)
        Else
            .Value = .Value & "OR" & rng.Range("A" & i)
        End If
    End With
    i = i + 1
Loop

希望这有帮助。

答案 4 :(得分:0)

另一种方法..可以在A列的最后一行中使用

测试

Sub testing()
Dim lrow As Integer
Dim erange As Range
Dim str As String
With ActiveSheet
lrow = .Range("A" & Rows.Count).End(xlUp).Row
str = ""
For Each erange In .Range("A2:A" & lrow)

If str = "" Then
str = erange.Value
Else
str = str & " OR " & erange.Value

End If

Next erange

MsgBox (str)


End With

End Sub