2009-12-01 41 views
12

Tôi đang sử dụng chương trình bảng tính của Open Office và đang cố kết nối nhiều ô văn bản cùng với dấu phân cách. Ví dụ, giả sử tôi có các tế bào dưới đây:Bảng tính văn phòng mở (Calc) - Kết hợp các ô văn bản với dấu phân cách

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

Tôi muốn nối chúng với delimiters để kết quả là trong một tế bào như thế này một:

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

Suy nghĩ đầu tiên của tôi là cố gắng và tạo ra một macro hoặc một cái gì đó, nhưng tôi không nghĩ rằng văn phòng mở hỗ trợ những người đó. Bất kỳ ý tưởng?

+1

Điều này sẽ nhận được phản hồi tốt hơn trên Super User. Bạn không cần phải đăng lại ở đó vì câu hỏi sẽ được chuyển tự động. – ChrisF

+0

Ồ, wow, tôi thậm chí không biết người dùng siêu tồn tại. Cảm ơn! –

Trả lời

8

Vâng, sau khi tìm kiếm và thử nghiệm nhiều hơn, tôi thấy bạn có thể làm cho các hàm của riêng bạn trong calc. Đây là một chức năng tôi đã thực hiện để thực hiện những gì tôi muốn:

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

Cảm ơn rất nhiều Markus vì đã tìm ra giải pháp cho điều này.

Dưới đây là một số hướng dẫn chi tiết hơn một chút về lợi ích của những người mới sử dụng OpenOffice Basic như tôi. Này áp dụng cho phiên bản 3.1:

Tools -> Macro -> Sắp xếp Macros -> OpenOffice.org Basic ...

Bây giờ chọn từ cây nhà thám hiểm nơi bạn muốn chức năng của bạn trực tiếp, ví dụ nó có thể nằm trong thư viện macro của riêng bạn (My Macros/Standard) hoặc được lưu trữ trực tiếp trong bảng tính hiện tại.

Bây giờ hãy nhập tên Macro mới và nhấp vào Mới để mở OO.org Basic IDE. Bạn sẽ thấy câu lệnh REM và một số định nghĩa phụ. Xóa tất cả những gì và thay thế nó với :

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 

Đoạn mã trên có một số cải tiến nhẹ từ Markus' gốc:

  • Không bắt đầu với một dấu phân cách khi ô đầu tiên trong phạm vi là trống.

  • Cho phép lựa chọn tùy chọn dấu phân tách (mặc định là ",") và các chuỗi trước và sau mỗi mục nhập không trống trong phạm vi (mặc định là "").

  • Tôi đổi tên thành STRJOIN vì "tham gia" là tên thông thường của chức năng này bằng một số ngôn ngữ phổ biến, chẳng hạn như Perl, Python và Ruby.

  • biến tất cả chữ thường

Bây giờ lưu vĩ mô, đi vào ô nơi bạn muốn tham gia xuất hiện, và gõ:

=STRJOIN(C3:C50) 

thay C3: C50 với phạm vi các chuỗi bạn muốn tham gia.

Để tùy chỉnh các dấu phân cách, thay vì sử dụng một cái gì đó như:

=STRJOIN(C3:C50; "/") 

Nếu bạn muốn tham gia vào một loạt các địa chỉ email, bạn có thể sử dụng:

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

và kết quả sẽ là một cái gì đó như

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

điều này thực sự hữu ích. cảm ơn rất nhiều –

+2

Wow điều này thật khủng khiếp. Nó phải là một chức năng văn phòng mở tiêu chuẩn. – surfer190

1

Bao giờ tôi thường tận hưởng sự dễ dàng và nhanh chóng thay thế & Tùy chọn tính toán cũng như nói chung xử lý nhanh chóng & sửa đổi Tùy chọn, khi một lần nữa ngồi trước danh sách tệp được bán phá giá hoặc bất kỳ thứ gì.

Tôi chưa bao giờ hiểu tại sao họ không bao gồm một chức năng thiết yếu như vậy ngay từ đầu, thực sự.

Nó dựa trên tập lệnh của Adam, nhưng với phần mở rộng để hoán đổi CONCAT từ ngang sang dọc, trong khi vẫn giữ các dấu phân cách theo thứ tự.

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 
Các vấn đề liên quan