2009-06-23 46 views
26

Tôi đang cố gắng tách một chuỗi trong một công thức excel, giống như tôi có thể làm bằng nhiều ngôn ngữ lập trình, ví dụ:Mô phỏng chức năng tách chuỗi trong công thức Excel

string words = "some text".split(' '); 

Vấn đề là tôi không thể chắc chắn rằng có nhiều hơn một từ trong ô. Nếu tôi cố gắng sử dụng các hàm FIND() hoặc SEARCH(), chúng sẽ trả lại #VALUE nếu không có không gian. Có cách nào dễ dàng để tách chuỗi để trả về các từ riêng lẻ (hoặc thậm chí tốt hơn, để trả về hoặc là từ trước hoặc tất cả các từ khác)?

+1

Theo cách nào bạn muốn các từ được trả lại? Excel không thể lưu trữ một mảng trong một ô đơn lẻ. Vậy nó nên là gì? – Tomalak

Trả lời

23

Một công thức để trở lại một trong hai từ đầu tiên hoặc tất cả các từ khác.

=IF(ISERROR(FIND(" ",TRIM(A2),1)),TRIM(A2),MID(TRIM(A2),FIND(" ",TRIM(A2),1),LEN(A2))) 

Các ví dụ và kết quả

Text     Description      Results 

         Blank 
         Space 
some     Text no space    some 
some text    Text with space     text 
some     Text with leading space   some 
some     Text with trailing space   some 
some text some text Text with multiple spaces  text some text 

Bình luận về Công thức:

  • Các TRIM chức năng được sử dụng để loại bỏ tất cả các không gian ở đầu và đuôi. Khoảng cách trùng lặp trong văn bản cũng bị xóa.
  • Các FIND chức năng sau đó tìm thấy không gian đầu tiên
  • Nếu không có không gian thì tỉa văn bản được trả về
  • Nếu không MID chức năng là sử dụng để trả lại bất kỳ văn bản sau khi không gian đầu tiên
+0

Cảm ơn bạn, đó chỉ là những gì tôi đã làm sau –

+2

Tại sao oh tại sao họ không thêm một số chức năng phân tích cú pháp chuỗi phong nha vào Excel!?!? – Rory

+0

@Rory vì Excel chủ yếu được tạo cho kế toán và không có cách nào thanh lịch để ghi đè giả định rằng một kế toán đang thúc đẩy ứng dụng. Có cần phải có một Excel cho các lập trình viên. – dreftymac

9

Lợi nhuận sau từ đầu tiên trong ô A1 khi tách ra bởi một không gian (chỉ hoạt động trong Excel 2003):

=LEFT(A1, SEARCH(" ",A1,1)) 
+1

Có, nhưng nếu không có khoảng trống trong ô, nó sẽ chỉ trả về lỗi! –

+3

= LEFT (A1, TÌM KIẾM ("", CONCATENATE (A1, ""), 1)) – flash

9
=IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3) 

này trước hết sẽ kiểm tra nếu ô chứa một không gian, nếu nó có phải nó sẽ trả về giá trị đầu tiên từ không gian, nếu không nó sẽ trả về giá trị ô.

Sửa

Chỉ cần để thêm vào công thức trên, vì nó đứng nếu không có giá trị trong các tế bào nó sẽ trở về 0. Nếu bạn đang tìm kiếm để hiển thị một tin nhắn hoặc một cái gì đó để cho người sử dụng nó trống bạn có thể sử dụng như sau:

=IF(IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)=0, "Empty", IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3)) 
+0

Rõ ràng bạn có thể thay đổi A3 thành ô nào mà bạn đang cố gắng đánh giá, James. – James

+0

Không hoàn toàn làm được những gì tôi đã làm, nhưng +1 vì nó hữu ích ở nơi khác –

3

Những điều này có xu hướng đơn giản hơn nếu bạn viết một ô tại một thời điểm, chia các công thức dài thành các ô nhỏ hơn, nơi bạn có thể kiểm tra chúng dọc theo t anh ấy. Sau đó, bạn có thể ẩn các phép tính trung gian hoặc cuộn tất cả thành một công thức.

Ví dụ, lấy James' công thức:

=IFERROR(LEFT(A3, FIND(" ", A3, 1)), A3) 

Đó là chỉ có giá trị trong Excel 2007 hoặc muộn hơn.

Phá vỡ nó lên như sau:

B3: =FIND(" ", A3) 
C3: =IF(ISERROR(B3),A3,LEFT(A3,B3-1)) 

Nó chỉ là một chút dễ dàng hơn để làm việc trên, một đoạn cùng một lúc. Khi đã hoàn tất, bạn có thể biến nó thành

=IF(ISERROR(FIND(" ", A3)),A3,LEFT(A3,FIND(" ", A3)-1)) 

nếu bạn muốn.

1

Highlight tế bào, sử dụng Đạt => Text to Columns và DELIMITER là không gian. Kết quả sẽ xuất hiện trong nhiều cột khi phần tách tìm thấy khoảng trắng.

0

Một số trang tính tuyệt vời trong các câu trả lời khác nhưng tôi cho rằng họ đã bỏ qua rằng bạn có thể xác định hàm do người dùng xác định (udf) và gọi hàm này từ trang tính hoặc công thức.

Vấn đề tiếp theo bạn có là quyết định làm việc với toàn bộ mảng hoặc với phần tử.

Ví dụ mã chức năng UDF này

Public Function UdfSplit(ByVal sText As String, Optional ByVal sDelimiter As String = " ", Optional ByVal lIndex As Long = -1) As Variant 
    Dim vSplit As Variant 
    vSplit = VBA.Split(sText, sDelimiter) 
    If lIndex > -1 Then 
     UdfSplit = vSplit(lIndex) 
    Else 
     UdfSplit = vSplit 
    End If 
End Function 

cho phép các yếu tố duy nhất với những điều sau đây trong một tế bào

=UdfSplit("EUR/USD","/",0)

hoặc người ta có thể sử dụng một khối tế bào với

=UdfSplit("EUR/USD","/")

Các vấn đề liên quan