如何将范围转换为字符串 (VBA)?
How can I convert a range to a string (VBA)?
将单元格区域转换为字符串的最佳方法是什么?
我有一个只接受字符串作为输入的函数,所以我需要将范围转换为字符串,同时尽可能多地保留格式(即它需要看起来像 table 或列表,而不仅仅是一个字符串)。
我试过使用 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
制作一个范围内的逗号分隔的单元格值列表:
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
你可以使用这个功能:
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
这将 return 一个以换行符作为范围行分隔符和竖线(“|”)作为列分隔符的字符串
这些功能中的任何一个都可以为您完成。
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
我知道这个问题已经问了快一年了,但我找到了一个适合我的快速解决方案:
您必须创建对 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
有一种更简单的方法。
假设变量rng是一个范围,那么写作:
rng = 左(rng,Len(rng))
会奇迹般的把rng变成字符串
您可以使用以下解决方案将范围转换为 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
鉴于显然需要迭代范围,我认为先将范围复制到数组,然后通过循环数组构建字符串会快得多。
即使在另一个工作表中使用范围,这也能完成工作
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
无需迭代。
Application.Textjoin(Chr(10),TRUE,Range("D3", "D10"))
或
Join(Application.Transpose(Range("D3:D10")),Chr(10))
将单元格区域转换为字符串的最佳方法是什么? 我有一个只接受字符串作为输入的函数,所以我需要将范围转换为字符串,同时尽可能多地保留格式(即它需要看起来像 table 或列表,而不仅仅是一个字符串)。 我试过使用 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
制作一个范围内的逗号分隔的单元格值列表:
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
你可以使用这个功能:
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
这将 return 一个以换行符作为范围行分隔符和竖线(“|”)作为列分隔符的字符串
这些功能中的任何一个都可以为您完成。
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
我知道这个问题已经问了快一年了,但我找到了一个适合我的快速解决方案: 您必须创建对 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
有一种更简单的方法。 假设变量rng是一个范围,那么写作:
rng = 左(rng,Len(rng))
会奇迹般的把rng变成字符串
您可以使用以下解决方案将范围转换为 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
鉴于显然需要迭代范围,我认为先将范围复制到数组,然后通过循环数组构建字符串会快得多。
即使在另一个工作表中使用范围,这也能完成工作
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
无需迭代。
Application.Textjoin(Chr(10),TRUE,Range("D3", "D10"))
或
Join(Application.Transpose(Range("D3:D10")),Chr(10))