web-dev-qa-db-ja.com

範囲を文字列(VBA)に変換するにはどうすればよいですか?

セルの範囲を文字列に変換する最良の方法は何ですか?文字列のみを入力として受け取る関数があるので、できるだけ多くのフォーマットを保持しながら、範囲を文字列に変換する必要があります(つまり、文字列だけでなく、テーブルまたはリストのように見える必要があります) 。 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
3
1937827

範囲内のセル値のコンマ区切りリストを作成するには:

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
6
Wolfie

あなたはこの関数を使うことができます:

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

範囲行の区切り文字としてラインフィード文字を、列の区切り文字としてパイプ( "|")を含む文字列を返します

5
user3598756

私はこの質問がほぼ1年前であることを知っていますが、私にとって効果的な簡単な解決策を見つけました。DataObjectを使用するには、Microsoft Forms 2.0 Object Libraryへの参照を作成する必要があります。

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

次のソリューションを使用して、範囲を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
0
Pixel_95

明らかに範囲を反復する必要があることを考えると、最初に範囲を配列にコピーして、配列をループすることによって文字列を作成する方がかなり速くなると思います。

0
Rohan Moore

これらの関数のいずれかがそれを行います。

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
0
ASH