Question

J'utilise le tableur Open Office et essaie de concaténer plusieurs cellules de texte avec des délimètres. Par exemple, supposons que j'ai les cellules ci-dessous:

+--------+
| cell 1 |
+--------+
| cell 2 |
+--------+
| cell 3 |
+--------+
| cell 4 |
+--------+
| cell 5 |
+--------+

Je voudrais les concaténer avec des délimiteurs pour que le résultat soit dans une cellule comme celle-ci:

+----------------------------------------------+
| (cell 1),(cell 2),(cell 3),(cell 4),(cell 5) |
+----------------------------------------------+

Ma première pensée a été d'essayer de créer une macro ou quelque chose d'autre, mais je ne pense pas que Open Office les supporte. Des idées?

Était-ce utile?

La solution 2

Eh bien, après beaucoup plus de recherches et d’expérimentations, j’ai trouvé que vous pouviez créer vos propres fonctions dans calc. C’est une fonction que j’ai faite qui fait ce que je veux:

Function STRCONCAT(range)
    Dim Row, Col As Integer
    Dim Result As String
    Dim Temp As String

    Result = ""
    Temp = ""

    If NOT IsMissing(range) Then
        If NOT IsArray(range) Then
            Result = "(" & range & ")"
        Else
            For Row = LBound(range, 1) To UBound(range, 1)
                For Col = LBound(range, 2) To UBound(range, 2)
                    Temp = range(Row, Col)
                    Temp = Trim(Temp)
                    If range(Row, Col) <> 0 AND Len(Temp) <> 0 Then
                        If(NOT (Row = 1 AND Col = 1)) Then Result = Result & ", "
                        Result = Result & "(" & range(Row, Col) & ") "
                    End If
                Next
            Next
        End If
    End If

    STRCONCAT = Result
End Function

Autres conseils

Merci beaucoup Markus d'avoir trouvé une solution à ce problème.

Voici quelques instructions un peu plus détaillées pour aider les débutants OpenOffice Basic comme moi. Ceci s'applique à la version 3.1:

Outils - > Macros - > Organiser les macros - > OpenOffice.org Basic ...

Sélectionnez maintenant dans l'arborescence de l'explorateur l'emplacement de votre fonction, par exemple. il peut être dans votre propre bibliothèque de macros (Mes Macros / Standard) ou stockées directement dans la feuille de calcul en cours.

Maintenant, entrez un nouveau nom de macro et cliquez sur Nouveau pour ouvrir l'EDI de base OO.org. Vous verrez un REM déclaration et quelques définitions de Sub st. Supprimer tout cela et remplacer le avec:

Function STRJOIN(range, Optional delimiter As String, Optional before As String, Optional after As String)
    Dim row, col As Integer
    Dim result, cell As String

    result = ""

    If IsMissing(delimiter) Then
        delimiter = ","
    End If
    If IsMissing(before) Then
        before = ""
    End If
    If IsMissing(after) Then
        after = ""
    End If

    If NOT IsMissing(range) Then
        If NOT IsArray(range) Then
            result = before & range & after
        Else
            For row = LBound(range, 1) To UBound(range, 1)
                For col = LBound(range, 2) To UBound(range, 2)
                    cell = range(row, col)
                    If cell <> 0 AND Len(Trim(cell)) <> 0 Then
                        If result <> "" Then
                            result = result & delimiter
                        End If
                        result = result & before & range(row, col) & after
                    End If
                Next
            Next
        End If
    End If

    STRJOIN = result
End Function

Le code ci-dessus présente de légères améliorations par rapport à l'original de Markus:

  • Ne commence pas par un délimiteur lorsque la première cellule de la plage est vide.

  • Permet le choix facultatif du délimiteur (par défaut, "&";), et de la les chaînes qui vont avant et après chaque entrée non vide dans la plage (valeur par défaut: "").

  • Je l'ai renommé STRJOIN depuis "rejoindre". est le nom typique de cette fonctionner dans plusieurs langages populaires, tels que Perl, Python et Ruby.

  • Variables toutes en minuscules

Maintenant, sauvegardez la macro, allez dans la cellule où vous voulez que la jointure apparaisse, et tapez:

  =STRJOIN(C3:C50)

remplacement de C3: C50 par la plage de chaînes que vous souhaitez rejoindre.

Pour personnaliser le délimiteur, utilisez plutôt quelque chose comme:

  =STRJOIN(C3:C50; " / ")

Si vous souhaitez rejoindre plusieurs adresses e-mail, vous pouvez utiliser:

  =STRJOIN(C3:C50; ", "; "<"; ">")

et le résultat serait quelque chose comme

<foo@bar.com>, <baz@qux.org>, <another@email.address>, <and@so.on>

De temps en temps, j’appréciais la facilité et la rapidité de replace & amp; Options de calcul et, en général, la gestion rapide & amp; modifier les options, lorsque vous vous retrouvez une fois de plus devant une liste de fichiers vidés ou quoi que ce soit.

Je n'ai jamais compris pourquoi ils n'incluaient pas une fonction aussi essentielle dès le début, vraiment.

Il s’appuie sur le script d’Adam, mais avec l’extension permettant de permuter CONCAT d’horizontale à la verticale, tout en maintenant les délimiteurs dans l’ordre.

Function CONCAT2D(Optional range,   Optional delx As String, Optional dely As String, _
                                    Optional xcell As String, Optional cellx As String, _
                                    Optional swop As Integer)
    Dim xy(1), xyi(1), s(1) As Integer
    Dim out, cell, del, dxy(1) As String

    'ReDim range(2, 1)           'Gen.RandomMatrix 4 Debugging
    'For i = LBound(range, 1) To UBound(range, 1)
    '   For j = LBound(range, 2) To UBound(range, 2)
    '       Randomize
    '       range(i,j) = Int((100 * Rnd) )
    '   Next
    'Next

    out  = ""
    If IsMissing(delx)  Then : delx  = ","      : End If
    If IsMissing(dely)  Then : dely  = delx()   : End If
    If IsMissing(xcell) Then : xcell = ""       : End If
    If IsMissing(cellx) Then : cellx = xcell()  : End If
    If IsMissing(swop)  Then : swop  = 0        : End If
    dxy(0) = delx() : dxy(1) = dely()
    xyi(0) = 1      : xyi(1) = 2
    If swop = 0     Then :  s(0) = 0 : s(1) = 1
                    Else    s(0) = 1 : s(1) = 0 : End If

    If NOT IsMissing(range) Then
        If   NOT IsArray(range) _
        Then :  out = xcell & range & cellx
        Else    del = delx
                For xy(s(0)) = LBound(range, xyi(s(0))) To UBound(range, xyi(s(0))
                For xy(s(1)) = LBound(range, xyi(s(1))) To UBound(range, xyi(s(1))
                    cell = range(xy(0), xy(1))
                    If cell <> 0 AND Len(Trim(cell)) <> 0 _
                    Then :  If out <> "" Then : out = out & del : End If
                            out = out & xcell & cell & cellx
                            del = dxy(s(0))
                    End If
                Next :      del = dxy(s(1))
                Next
        End If
    Else        out = "ERR"
    End If

    CONCAT2D = out
End Function
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top