问题
What is the best way to convert a range of cells to a string? I have a function that only takes a string as input so I need to convert the range to a string, while retaining as much of the formatting as possible (i.e. it needs to look like a table or list, not just a string of characters). I've tried working with CStr(), as well as converting from a range to an array and then to a string, but I just get errors.
Edit: Code attempt
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
回答1:
To make a comma separated list of cell values in a range:
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
You could add extra functionality like inserting a semicolon instead of a comma if the row number increases.
To use this function:
Sub AnySubNameHere()
Dim rng As Range
Set rng = ActiveSheet.Range("A3:A10")
Dim myString as String
myString = RangeToString(rng)
End Sub
回答2:
you could use this function:
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
which would return a string with linefeed character as range rows separator and pipes ("|") as columns separator
回答3:
I know this question is already almost a year old, but I found a quick solution that works for me: You do have to create a reference to Microsoft Forms 2.0 Object Library to use the 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:
Any one of these functions will do it for you.
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
OR
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
OR
Function spliceUm(r As Range) As String
spliceUm = ""
For Each rr In r
spliceUm = spliceUm & rr.Value & ";"
Next
End Function
回答5:
You can use the following solution to convert a range to a string in 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
回答6:
Given the apparent need to iterate the range, I'd imagine it'd be considerably quicker to copy the range to an array first, and build the string by looping the array.
回答7:
There is a much easier way. Assuming the variable rng is a range, then writing:
rng = Left(rng,Len(rng))
will miraculously turn rng into a string.
来源:https://stackoverflow.com/questions/41777996/how-can-i-convert-a-range-to-a-string-vba