【问题标题】:VBA code in multiple cells多个单元格中的 VBA 代码
【发布时间】:2013-08-09 13:48:37
【问题描述】:

我对使用 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

【问题讨论】:

  • 遍历范围的顺序是否重要?另外,“当代码完成一个范围”是什么意思?除了.Range("AT1:CB20"),还有其他范围吗?

标签: vba excel


【解决方案1】:

我能想到的最好方法是将参数传递给ConcatenateAll 过程,然后提及要连接的所有范围。例如,我从Sample() 两次调用ConcatenateAll()

我还冒昧地稍微修改了您的代码。

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

跟进

AT1:CB20, AT21:CB40, AT41:CB60, AT61:CB80 我希望结果以 AK1、AK2、AK3、AK4 等形式显示,直到范围结束 - user2668126 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

【讨论】:

  • 谢谢,这正是我想要的。但是,我有大约 2000 个范围可以使用它。有没有一种方法可以创建一个简单的函数来运行所有这些并显示适当的数据?
  • 如果范围的放置方式有趋势,那么您可以循环调用所有这些范围。如果你能举几个你的范围的例子,那么我可以看看是否有趋势......例如AT1:CB20AT31:CB50AT61:CB80这里我们可以看到趋势......
  • 范围中有重复,每个范围都与您在示例中使用的一样。最终范围是 AT2001:CB2020
  • 你能给我一个前 4 个范围的例子吗?就像我在上面给出的 3 个范围的示例一样。还要提及您希望输出的输出单元格..
  • AT1:CB20, AT21:CB40, AT41:CB60, AT61:CB80 我希望结果显示在 AK1, AK2, AK3, AK4 等直到范围结束
【解决方案2】:

由于您试图在单元格中显示输出,我认为最好的做法是编写自定义 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

然后您可以将此函数用作工作表函数,例如你可以在单元格中写AK1=concat(AT1:CB20),你会得到与你的代码相同的结果

【讨论】:

  • 这可能很有用,因为我可能需要在某个时候再次使用该代码。但是,当我按照您的指示输入公式时,单元格中会出现错误。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多