2009-12-01 9 views
12

Open Officeのスプレッドシートプログラムを使用していて、区切り文字とともに複数のテキストセルを連結しようとしています。Open Office Spreadsheet(Calc) - 区切り文字でテキストセルを連結します。

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

私の最初の考えは試してみた:結果はこのように一つのセルに1となるように、私は区切り文字でそれらを連結したい

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

:たとえば、私は下のセルを持っていると仮定マクロなどを作っていますが、私はオープンオフィスがそれらをサポートしているとは思いません。何か案は?

+1

これは、スーパーユーザーの方がより良い応答を得られます。質問が自動的に移動されるので、そこに再転記する必要はありません。 – ChrisF

+0

ああ、うわー、私はスーパーユーザーが存在するかどうか知りませんでした。ありがとう! –

答えて

8

もっと多くの検索と実験を行った後、私はあなたがcalcで独自の関数を作成できることを発見しました。これは、私が望むことをした機能です。

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

ありがとうございました。

ここに、私のようなOpenOffice Basic初心者のためのいくつかのより詳細な説明があります。これは、バージョン3.1に適用されます。

ツール - >マクロ - >マクロの管理 - > OpenOffice.org Basicの...

は今、あなたはあなたの関数は、ライブしたいエクスプローラツリー、 例えばから選択します現在のスプレッドシートに直接格納されている独自のマクロライブラリ(My Macros/Standard)または に入れることができます。

新しいマクロ名を入力し、[新規作成]をクリックしてOO.org Basic IDEを開きます。 REM ステートメントといくつかのスタブサブ定義が表示されます。上記のコードはマルクスのオリジナルから若干改善されました

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 

:すべてのことを削除して にそれを交換する範囲内の最初のセルがあるとき

  • は、区切り文字で起動しません空の。

  • は区切りのオプションの選択(デフォルトは「」)、前と範囲 ( 『』へのデフォルト)の各非空白のエントリの後に行く 文字列を可能にします。

  • "join"は、 の一般的な名前であり、Perl、Python、Rubyなどのいくつかの一般的な言語で機能するため、名前をSTRJOINに変更しました。

    =STRJOIN(C3:C50) 
    

    C3の交換:範囲C50すべて小文字

は今、あなたは とタイプは、表示されるように参加したいセルに移動し、マクロを保存

  • 変数あなたが参加したい文字列のあなたは電子メールアドレスの束に参加したい場合は、使用でき

    =STRJOIN(C3:C50; "/") 
    

    :ようなものを使用代わりに、区切り文字をカスタマイズするには

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

    と結果のようなものになるだろう

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

    これは本当に便利です。おかげで多く –

    +2

    うわーこれは恐ろしいです。標準的なオープンオフィス機能でなければなりません。 – surfer190

    1

    これまでのようにしばしば簡単に交換して楽しむと思います。&計算オプションと一般的には迅速な処理&ダンプされたファイルリストの前にもう一度座っているときにオプションを変更します。

    私は彼らが本当に最初からこのような本質的な機能を含んでいなかった理由は理解できませんでした。

    これはAdamのスクリプトに基づいていますが、デリミタを順番に保ちながら、水平から垂直へのスワップCONCATの拡張機能を備えています。

    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 
    
    関連する問題