【问题标题】:How do I make an excel vba function that can handle vertical and horizontal ranges如何制作可以处理垂直和水平范围的excel vba函数
【发布时间】:2021-06-11 12:02:21
【问题描述】:

我看到了这个:Excel VBA: Determine if range is horizontal or vertical

如果它是垂直的,我有这个连接文本的功能:

Function textjoiner(x As Range, Optional delimiter As String = ",") As String
    Dim darray() As Variant
    Dim darray2() As Variant
    Dim counter As Long, i As Long
    darray = x.value
    counter = UBound(darray, 1)
    ReDim darray2(1 To counter)
    For i = 1 To counter
        darray2(i) = darray(i, 1)
    Next i
    textjoiner = join(darray2, delimiter)
End Function

修改它的最简单方法是什么,所以不管它是 1xn 还是 nx1 范围的单元格,它都会连接起来?

【问题讨论】:

  • if RangeIsVertical(ThisRange) Then...Else...Endif.
  • 如果你想要一个 Textjoin UDF,也许是here

标签: excel vba


【解决方案1】:
Function textjoiner(xRange As Range, Optional delimiter As String = ",") As String
    Dim oRet As String
    oRet = ""
    
    'Ensure we are dealing with a nx1 or 1xn range
    If xRange.Rows.Count = 1 Or xRange.Columns.Count = 1 Then
    
        'Concatenate each value in Range and add delimter
        For Each oValue In xRange
            oRet = oRet & oValue & delimiter
        Next
        
        ' Remove last delimiter
        oRet = Left(oRet, Len(oRet) - Len(delimiter))
    End If
    
    textjoiner = oRet
End Function

【讨论】:

  • 是的,你比我聪明得多。谢谢!
【解决方案2】:

处理范围

  • 以下内容适用于任何连续(一个区域)范围。
  • ByColumns 设置为 True 将允许一次读取一列(默认为一次一行)。
Option Explicit

Function TextJoiner( _
    ByVal rg As Range, _
    Optional ByVal Delimiter As String = ",", _
    Optional ByVal ByColumns As Boolean = False) _
As String
    
    If rg Is Nothing Then Exit Function
    
    Dim rCount As Long: rCount = rg.Rows.Count
    Dim cCount As Long: cCount = rg.Columns.Count
    
    Dim sData As Variant
    If rCount + cCount = 2 Then
        ReDim sData(1 To 1, 1 To 1): sData(1, 1) = rg.Value
    Else
        sData = rg.Value
    End If
    
    Dim nCount As Long: nCount = rCount * cCount
    Dim nData As Variant: ReDim nData(1 To nCount)
    
    Dim cValue As Variant
    Dim r As Long, c As Long, n As Long
    
    If ByColumns Then
        For c = 1 To cCount
            For r = 1 To rCount
                cValue = sData(r, c)
                If Not IsError(cValue) Then
                    If Len(cValue) > 0 Then
                        n = n + 1
                        nData(n) = cValue
                    End If
                End If
            Next r
        Next c
    Else
        For r = 1 To rCount
            For c = 1 To cCount
                cValue = sData(r, c)
                If Not IsError(cValue) Then
                    If Len(cValue) > 0 Then
                        n = n + 1
                        nData(n) = cValue
                    End If
                End If
            Next c
        Next r
    End If
    
    If n < nCount Then
        ReDim Preserve nData(1 To n)
    End If
    
    TextJoiner = Join(nData, Delimiter)
    
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    相关资源
    最近更新 更多