2013-11-20 16 views
27

Tôi cần phải điền vào một ô có mục nhập không trống đầu tiên trong một tập hợp các cột (từ trái sang phải) trong cùng một hàng - tương tự như coalesce() trong SQL.Có chức năng giống như coalesce trong Excel không?

Trong bảng ví dụ sau

--------------------------------------- 
|  | A | B | C | D | 
--------------------------------------- 
| 1 |  | x | y | z | 
--------------------------------------- 
| 2 |  |  | y |  | 
--------------------------------------- 
| 3 |  |  |  | z | 
--------------------------------------- 

Tôi muốn đặt một chức năng tế bào trong mỗi tế bào của hàng A như vậy mà tôi sẽ nhận được:

--------------------------------------- 
|  | A | B | C | D | 
--------------------------------------- 
| 1 | x | x | y | z | 
--------------------------------------- 
| 2 | y |  | y |  | 
--------------------------------------- 
| 3 | z |  |  | z | 
--------------------------------------- 

Tôi biết tôi có thể làm điều này với một cascade của hàm IF, nhưng trong trang tính thực sự của tôi, tôi có 30 cột để chọn, vì vậy tôi sẽ rất vui nếu có một cách đơn giản hơn.

Trả lời

34
=INDEX(B2:D2,MATCH(FALSE,ISBLANK(B2:D2),FALSE)) 

Đây là công thức mảng. Sau khi nhập công thức, nhấn CTRL + Shift + Nhập để Excel đánh giá nó dưới dạng Công thức mảng. Hàm này trả về giá trị không trống đầu tiên của dải ô đã cho. Ví dụ của bạn, công thức được nhập vào cột với tiêu đề "a"

A B C D 
1 x x y z 
2 y  y 
3 z   z 
4

Hoặc nếu bạn muốn so sánh các tế bào riêng lẻ, bạn có thể tạo một hàm liên hiệp trong VBA:

Public Function Coalesce(ParamArray Fields() As Variant) As Variant 

    Dim v As Variant 

    For Each v In Fields 
     If "" & v <> "" Then 
      Coalesce = v 
      Exit Function 
     End If 
    Next 
    Coalesce = "" 

End Function 

Và sau đó gọi nó trong Excel. Trong ví dụ của bạn công thức trong A1 sẽ là:

=Coalesce(B1, C1, D1) 
1

Lấy tiếp cận VBA một bước xa hơn, tôi đã viết lại nó để cho phép một sự kết hợp của cả hai (hoặc cả hai) tế bào đơn lẻ và phạm vi di động:

Public Function Coalesce(ParamArray Cells() As Variant) As Variant 

    Dim Cell As Variant 
    Dim SubCell As Variant 

    For Each Cell In Cells 
     If VarType(Cell) > vbArray Then 
      For Each SubCell In Cell 
       If VarType(SubCell) <> vbEmpty Then 
        Coalesce = SubCell 
        Exit Function 
       End If 
      Next 
     Else 
      If VarType(Cell) <> vbEmpty Then 
       Coalesce = Cell 
       Exit Function 
      End If 
     End If 
    Next 
    Coalesce = "" 

End Function 

Vì vậy, bây giờ trong Excel bạn có thể sử dụng bất kỳ công thức sau đây trong vùng A1:

=Coalesce(B1, C1, D1) 
=Coalesce(B1, C1:D1) 
=Coalesce(B1:C1, D1) 
=Coalesce(B1:D1) 
+2

Đây có phải là bản chỉnh sửa trên câu trả lời gốc của bạn không? – moggi

0

Bên trong mảng nhập các biến mà không được phép.

Function Coalesce(ParamArray Fields() As Variant) As Variant 

    Dim v As Variant 

    For Each v In Fields 
     If IsError(Application.Match(v, Array("", " ", 0), False)) Then 
      Coalesce = v 
      Exit Function 
     End If 
    Next 
    Coalesce = "" 

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