2009-12-01 5 views
12

J'utilise le tableur d'Open Office et j'essaie de concaténer plusieurs cellules de texte avec des délimiteurs. Par exemple, supposons que je les cellules ci-dessous:Open Office Spreadsheet (Calc) - Concaténer des cellules de texte avec des délimiteurs

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

Je voudrais les concaténer avec délimiteurs de telle sorte que le résultat est dans une cellule comme celle-ci:

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

Ma première pensée était d'essayer et faire une macro ou quelque chose, mais je ne pense pas que les bureaux ouverts les supportent. Des idées?

+1

Ceci obtiendra une meilleure réponse sur Super User. Vous n'avez pas besoin de le republier car la question sera déplacée automatiquement. – ChrisF

+0

Oh, wow, je ne savais même pas que le super utilisateur existait. Merci! –

Répondre

8

Eh bien, après beaucoup plus de recherche et d'expérimentation, j'ai trouvé que vous pouvez faire vos propres fonctions dans calc. Ceci est une fonction que je fait 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 
29

Merci beaucoup Markus pour trouver une solution à cela.

Voici quelques instructions légèrement plus détaillées pour les débutants OpenOffice Basic comme moi. Il en est à la version 3.1:

Outils -> Macros -> Gérer les macros -> OpenOffice.org Basic ...

Maintenant, sélectionnez dans l'arborescence de l'explorateur où vous voulez que votre fonction en direct, par exemple il peut être dans votre propre bibliothèque de macros (My Macros/Standard) ou stocké directement dans la feuille de calcul actuelle.

Entrez maintenant un nouveau nom de macro et cliquez sur Nouveau pour ouvrir l'EDI de base OO.org. Vous verrez une instruction REM et certaines définitions de sous-raccord stub. Supprimer tout cela et remplacer 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 a quelques légères améliorations de Markus' origine:

  • ne démarre pas avec un séparateur lorsque la première cellule de la plage est vide.

  • Permet le choix en option du séparateur (par défaut « »), et les chaînes qui vont avant et après chaque entrée non vide dans la gamme (par défaut, « »). Je l'ai renommé STRJOIN puisque "join" est le nom typique de cette fonction dans plusieurs langages populaires, tels que Perl, Python, et Ruby.

  • Variables en minuscules

maintenant enregistrer la macro, allez à la cellule où vous voulez la rejoindre à apparaître, et tapez:

=STRJOIN(C3:C50) 

remplacement C3: C50 avec la gamme des chaînes que vous voulez rejoindre.

Pour personnaliser le séparateur, utilisez plutôt quelque chose comme:

=STRJOIN(C3:C50; "/") 

Si vous voulez rejoindre un groupe d'adresses e-mail, vous pouvez utiliser:

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

et le résultat serait quelque chose comme

<[email protected]>, <[email protected]>, <[email protected]>, <[email protected]> 
+2

c'est vraiment utile. merci beaucoup –

+2

Wow, c'est horrible. Ce devrait être une fonction de bureau ouvert standard. – surfer190

1

Toujours si souvent j'apprécierais la facilité et la rapidité de remplacement & calcul Options ainsi que, en général, la manipulation rapide & Modifier les options, une fois de plus assis devant une liste de fichiers de dumping ou quoi que ce soit.

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

Il est basé sur le script d'Adam, mais avec l'extension permettant d'échanger CONCAT de l'horizontale à la verticale, tout en conservant 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 
Questions connexes