web-dev-qa-db-fra.com

Comment puis-je convertir une plage en chaîne (VBA)?

Quel est le meilleur moyen de convertir une plage de cellules en chaîne? J'ai une fonction qui ne prend qu'une chaîne en entrée, donc je dois convertir la plage en chaîne, tout en conservant autant de formatage que possible ( c’est-à-dire qu’il doit ressembler à une table ou à une liste, et pas seulement à une chaîne de caractères) .J'ai essayé de travailler avec CStr (), ainsi que de convertir une plage en tableau juste avoir des erreurs.

Edit: tentative de code

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

Pour créer une liste de valeurs de cellules séparées par des virgules dans une plage:

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

Vous pouvez ajouter des fonctionnalités supplémentaires telles que l’insertion d’un point-virgule au lieu d’une virgule si le nombre de lignes augmente.

Pour utiliser cette fonction:

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

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

vous pouvez utiliser cette fonction:

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

qui renverrait une chaîne avec un caractère de saut de ligne comme séparateur de lignes de rangée et des tuyaux ("|") comme séparateur de colonnes

5
user3598756

Je sais que cette question a déjà presque presque un an, mais j'ai trouvé une solution rapide qui fonctionne pour moi: Vous devez créer une référence à la bibliothèque d'objets Microsoft Forms 2.0 pour utiliser le DataObject.

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

Vous pouvez utiliser la solution suivante pour convertir une plage en chaîne dans 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
0

Chacune de ces fonctions le fera pour vous.

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
ryguy72