2013-11-20 30 views
27

Muszę wypełnić komórkę pierwszym niepustym wpisem w zbiorze kolumn (od lewej do prawej) w tym samym wierszu - podobnie do koalescencji() w SQL.Czy istnieje funkcja koalescencji w programie Excel?

w poniższym przykładzie arkusza

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

chcę umieścić funkcję komórek w każdej komórce w wierszu A takie, że będę się:

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

wiem, co mogłem zrobić to z kaskada funkcji IF, ale w moim prawdziwym arkuszu mam 30 kolumn do wyboru, więc byłbym szczęśliwy, gdyby był prostszy sposób.

Odpowiedz

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

To jest formuła tablicy. Po wprowadzeniu formuły naciśnij CTRL + Shift + Wprowadź, aby Excel ocenił ją jako formułę macierzy. Zwraca pierwszą niepustą wartość z podanego zakresu komórek. Na swoim przykładzie, formuła jest wpisane w kolumnie z nagłówkiem „a”

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

Lub jeśli chcesz porównać poszczególne komórki, można utworzyć funkcję zlewają się w 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 

I następnie wywołaj go w Excelu. W przykładzie formuła w A1 będzie:

=Coalesce(B1, C1, D1) 
1

Biorąc podejście VBA krok dalej, mam go ponownie napisane, aby umożliwić połączenie obu (lub obaj) poszczególnych komórek i zakresów komórek:

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 

teraz w programie Excel można użyć jednego z następujących wzorów w A1:

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

Czy nie powinna to być zmiana oryginalnej odpowiedzi? – moggi

0

Wewnątrz tablicy wprowadzić zmienne, które nie są dozwolone.

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