【问题标题】:How can I convert a range to a string (VBA)?如何将范围转换为字符串 (VBA)?
【发布时间】:2021-07-07 01:30:12
【问题描述】:

将一系列单元格转换为字符串的最佳方法是什么? 我有一个只接受字符串作为输入的函数,因此我需要将范围转换为字符串,同时保留尽可能多的格式(即它需要看起来像一个表格或列表,而不仅仅是一个字符串) . 我尝试过使用 CStr(),以及从范围转换为数组,然后再转换为字符串,但我得到了错误。

编辑:代码尝试

Dim email_answer As Integer
email_answer = MsgBox("Do you want to be emailled a copy of this schedule?", vbYesNo)
If email_answer = vbYes Then

    Dim wb As Workbook
    Dim to_send As Range
    to_send = Range("D3", "D10")

    If Val(Application.Version) < 14 Then Exit Sub

    Set wb = ActiveWorkbook
    With wb
        MailFromMacWithMail body content:=CStr(to_send), _
                    mailsubject:="Schedule", _
                    toaddress:="email address", _
                    ccaddress:="", _
                    bccaddress:="", _
                    attachment:=.FullName, _
                    displaymail:=False
    End With
    Set wb = Nothing
End If

【问题讨论】:

  • 分享你的代码属性
  • 你如何期望一个字符串看起来像一个表格?
  • Sorry @ShaiRado 现在添加代码尝试(这是最后一次尝试,也尝试了 range->array->string 方法)。

标签: vba macos excel excel-2011


【解决方案1】:

在一个范围内创建一个逗号分隔的单元格值列表:

Function RangeToString(ByVal myRange as Range) as String
    RangeToString = ""
    If Not myRange Is Nothing Then
        Dim myCell as Range
        For Each myCell in myRange
            RangeToString = RangeToString & "," & myCell.Value
        Next myCell
        'Remove extra comma
        RangeToString = Right(RangeToString, Len(RangeToString) - 1)
    End If
End Function

如果行号增加,您可以添加额外的功能,例如插入分号而不是逗号。

要使用这个功能:

Sub AnySubNameHere()
    Dim rng As Range
    Set rng = ActiveSheet.Range("A3:A10")

    Dim myString as String
    myString = RangeToString(rng)
End Sub

【讨论】:

  • 抱歉新手问题。我添加了您的代码,然后使用 Dim to_send As Range to_send = Range("D3", "D10") Call RangeToString(to_send) 调用它,这是否会将 to_send 更改为字符串?当我这样做时,我的代码仍然返回一个 byref 参数不匹配错误
  • 我已经编辑了我的答案,向您展示如何使用此功能。该函数返回一个字符串对象,因此您可以将其分配给一个变量:)
  • 你太棒了,非常感谢!有没有办法让它在移动到下一行之前运行到每一列?目前它似乎正在读取 A1、B1、C1、A2、B2、C2 等,而不是 A1、A2、A3、B1、B2、B3 等。
  • 您可以遍历For Each rowRange in myRange.Rows 列,然后遍历每个rowRange 中的单元格,而不是整个myRange。注意你应该首先Dim Range 对象myRow
  • 谢谢,但现在它给了我一个运行时错误 13 类型不匹配。我是否正确实施了您的解决方案? Dim myCell As Range Dim RowRange As Range For Each RowRange In myRange.Rows For Each myCell In RowRange RangeToString = RangeToString &amp; Chr(13) &amp; myCell.Value Next myCell Next RowRange
【解决方案2】:

你可以使用这个功能:

Function Rang2String(rng As Range) As String
    Dim strng As String
    Dim myRow As Range
    With rng
        For Each myRow In .Rows
            strng = strng & Join(Application.Transpose(Application.Transpose(myRow.value)), "|") & vbLf
        Next
    End With
    Rang2String = Left(strng, Len(strng) - 1)
End Function

这将返回一个以换行符作为范围行分隔符和管道(“|”)作为列分隔符的字符串

【讨论】:

  • 善用转置两次将二维数组转换为一维数组(我刚刚从 SO 中学到的东西)!
  • @SMeaden,“行”范围需要它,而“列”范围只需要一个转置
【解决方案3】:

我知道这个问题已经有将近一年的历史了,但我找到了一个适合我的快速解决方案: 您必须创建对 Microsoft Forms 2.0 对象库的引用才能使用 DataObject。

Public Function GetStringFromRange(RNG As Range) As String
    Dim DOB As New MSForms.DataObject
    RNG.Copy
    DOB.GetFromClipboard
    GetStringFromRange = DOB.GetText
End Function

【讨论】:

    【解决方案4】:

    有一个更简单的方法。 假设变量 rng 是一个范围,那么写:

    rng = 左(rng,Len(rng))

    会奇迹般的把 rng 变成一个字符串。

    【讨论】:

    • 不,它没有...这里的输入rng 是什么?你认为rng 的输出是什么?问题是关于将范围(多个单元格)的内容转换为字符串变量,而不是将单个单元格的内容格式化为字符串...
    【解决方案5】:

    这些功能中的任何一个都可以为您完成。

    Function ConCatRange2(CellBlock As Range) As String
    'for non-contiguous cells =ccr((a1:a10,c4,c6,e1:e5))
    Dim Cell As Range
    Dim sbuf As String
    For Each Cell In CellBlock
    If Len(Cell.Text) > 0 Then sbuf = sbuf & Cell.Text & ","
    Next
    ConCatRange2 = Left(sbuf, Len(sbuf) - 1)
    End Function
    

    Function mergem(r As Range) As String
    mergem = r.Cells(1, 1).Value
    k = 1
    For Each rr In r
        If k <> 1 Then
            mergem = mergem & "," & rr.Value
        End If
        k = 2
    Next
    End Function
    

    Function spliceUm(r As Range) As String
    spliceUm = ""
    For Each rr In r
    spliceUm = spliceUm & rr.Value & ";"
    Next
    End Function
    

    【讨论】:

      【解决方案6】:

      您可以使用以下解决方案将范围转换为 VBA 中的字符串:

      Sub convert()
      
      Dim rng As Range, cell As Range
      
      Dim filter As String
      
      filter = ""
      
      Set rng = Selection
      
      For Each cell In rng
      
          If Not cell Is Nothing Then
              filter = """" & cell & """" & "," & filter
          End If
      
      Next cell
      
      End Sub
      

      【讨论】:

      • 请解释你在做什么以及为什么这是一个好方法
      【解决方案7】:

      鉴于显然需要迭代范围,我想先将范围复制到数组,然后通过循环数组来构建字符串会快得多。

      【讨论】:

        【解决方案8】:

        即使使用另一个工作表中的范围,这也可以完成工作

        Function RangeToString(ByVal myRange As range) As String
            RangeToString = ""
            If Not myRange Is Nothing Then
                RangeToString = "=" & myRange.Worksheet.Name & "!" & myRange.Address
            End If
        End Function
        

        【讨论】:

          【解决方案9】:

          无需重复。

          Application.Textjoin(Chr(10),TRUE,Range("D3", "D10"))
          

          Join(Application.Transpose(Range("D3:D10")),Chr(10))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-01-28
            • 1970-01-01
            • 1970-01-01
            • 2020-07-18
            • 1970-01-01
            • 2012-04-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多