J'essaie de copier les valeurs d'une plage de cellules (A1: A50) dans une seule cellule (B1). Je peux le faire manuellement en copiant les cellules dans le presse-papiers, puis en collant le presse-papiers dans la barre formelle de B1, mais je ne trouve pas de moyen de le faire dans une macro autre que de copier les cellules dans le presse-papiers.

J'espère que quelqu'un pourra m'aider ici.

Sheet1.Range("A1:A50").SpecialCells(xlCellTypeConstants).Select
Selection.Copy

Je voudrais que le contenu de la cellule B1 ressemble à ceci:

Valeur de la cellule A1

Valeur de la cellule A2

Valeur de la cellule A3

...etc

0
Patrick 16 sept. 2020 à 14:31

3 réponses

Meilleure réponse

Juste

Sub myConcat(rSource As Range, rTarget As Range, Optional sDelimiter = vbCrLf)
Dim oCell As Range
Dim sRes As String
    sRes = vbNullString
    For Each oCell In rSource
        sRes = sRes & sDelimiter & oCell.Text
    Next oCell
    rTarget.Value = Right(sRes, Len(sRes) - Len(sDelimiter))
End Sub

Appelez-le à partir de votre code comme

Sub tst_myConcat()
    Call myConcat([A1:A50], [B1])
End Sub

Bien entendu, cette procédure peut être facilement convertie en fonction:

Function myConcat(rSource As Range, Optional sDelimiter = vbCrLf)
Dim oCell As Range
Dim sRes As String
    sRes = vbNullString
    For Each oCell In rSource
        sRes = sRes & sDelimiter & oCell.Text
    Next oCell
    myConcat = Right(sRes, Len(sRes) - Len(sDelimiter))
End Function

Dans ce cas, écrivez simplement dans la cellule cible (B1) =myConcat(A1:A50)

N'oubliez pas d'inclure dans le format de cellule Envelopper le texte !

myConcat WrapText.gif

1
JohnSUN 17 sept. 2020 à 06:13

Première colonne en chaîne

  • La fonction FirstColumnToString (UDF) a un délimiteur fixe (Delimiter) qui peut être modifié manuellement. Mais cela peut par exemple procédez comme suit:

    =FirstColumnToString(A1:A2,A4,A6:C8,Sheet2!A1:A3)
    

    où il supprimera les valeurs d'erreur et les chaînes de longueur nulle ("") et choisira uniquement les valeurs de la première colonne de chaque plage, par exemple dans la plage A6:C8, il choisira les valeurs de A6:A8.

Le code

Option Explicit

Function FirstColumnToString(ParamArray SourceRanges() As Variant) _
         As String
    
    Const Delimiter As String = vbLf & vbLf
    
    Dim RangesCount As Long
    RangesCount = UBound(SourceRanges) - LBound(SourceRanges) + 1
    Dim data As Variant
    ReDim data(1 To RangesCount)
    Dim Help As Variant
    ReDim Help(1 To 1, 1 To 1)
    
    Dim Element As Variant
    Dim RowsCount As Long
    Dim j As Long
    
    For Each Element In SourceRanges
        j = j + 1
        If Element.Rows.Count > 1 Then
            data(j) = Element.Columns(1).Value
        Else
            data(j) = Help
            data(j)(1, 1) = Element.Columns(1).Value
        End If
        RowsCount = RowsCount + UBound(data(j))
    Next Element
    
    Dim Result As Variant
    ReDim Result(1 To RowsCount)
    Dim Current As Variant
    Dim i As Long
    Dim k As Long
    
    For j = 1 To RangesCount
        For i = 1 To UBound(data(j))
            Current = data(j)(i, 1)
            If Not IsError(Current) Then
                If Current <> vbNullString Then
                    k = k + 1
                    Result(k) = Current
                End If
            End If
        Next i
    Next j
    ReDim Preserve Result(1 To k)
    
    FirstColumnToString = Join(Result, Delimiter)

End Function
0
VBasic2008 16 sept. 2020 à 18:08

Une façon beaucoup plus simple de faire le travail consiste à utiliser la fonction TEXTJOIN dans Excel:

With Sheet2.Range("A1:A50")
    .AutoFilter Field:=1, Criteria1:="<>"
    Sheet2.Range("B1").Value2 = WorksheetFunction.TextJoin(vbCrLf, True, _
        .SpecialCells(xlCellTypeVisible))
    .AutoFilter
End With
0
pdtcaskey 17 sept. 2020 à 01:22