Open Office Spreadsheet (Calc) - Concaténer des cellules de texte avec des délimiteurs
-
22-07-2019 - |
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?
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