2013-02-02 11 views
7

G'Day,Come utilizzare le formule di matrice di Excel per un UDF per leggere correttamente ogni cella?

Ho una domanda in più per aiutarmi a capire come le formule di matrice di Excel (Control + Shift + Invio) possono leggere ogni cella dinamicamente nella formula.

ho fatto un esempio semplificato di mostrare ciò che voglio dire.

ho creato una piccola azienda agricola fittizia che ha alcuni animali, elencati da nomi e fornirà il suono di ciò che l'animale fa. Nella colonna successiva ho creato una funzione definita dall'utente chiamata MakesSound che prende in input l'animale e risponde al suono dell'animale che produce. Come mostrato nell'immagine dell'istantanea qui sotto.

enter image description here

Purtroppo, ho pensato che un ARRAYFORMULA potrebbe raccogliere che ho diverse cellule sfogliare gli animali e si conclude come questa istantanea, invece.

enter image description here

Così come posso chiedere al ARRAYFORMULA di riconoscere che ho diverse celle della colonna B come so ciarlatani non è la risposta per gli altri animali. :-)

Ecco un'altra istantanea che mostra le formule di fianco al arrayformulas per comparsion e il codice che ho usato pure.

enter image description here

Public Function MakesSound(AnimalName As String) As Variant 
    Select Case AnimalName 
     Case Is = "Duck" 
      MakesSound = "Quack!" 
     Case Is = "Cow" 
      MakesSound = "Moo!" 
     Case Is = "Bird" 
      MakesSound = "Tweet!" 
     Case Is = "Sheep" 
      MakesSound = "Ba-Ba-Ba!" 
     Case Is = "Dog" 
      MakesSound = "Woof!" 
     Case Else 
      MakesSound = "Eh?" 
    End Select 
End Function 

Sono aperto a suggerimenti.

Grazie, Peter.

+0

Perché non usi solo un "INDICE/MATCH" o anche "VLOOKUP'? – brettdj

+1

Sto esplorando le formule di array per ora per vedere quali effetti si verificano. Ti ringrazio per averlo suggerito, brettdj. –

risposta

11

è necessario farvi funzione di matrice di leggere i dati in un array, processo e creare un array di uscita.
Quindi la funzione array non deve essere inserita in una formula di matrice multicellulare (D3: D7) utilizzando ctrl-shift-invio.

Public Function MakesSound(AnimalName As Range) As Variant 
Dim Ansa() As Variant 
Dim vData As Variant 
Dim j As Long 
vData = AnimalName.Value2 
ReDim Ansa(1 To UBound(vData), 1 To 1) 
For j = 1 To UBound(vData) 
    Select Case vData(j, 1) 
    Case Is = "Duck" 
     Ansa(j, 1) = "Quack!" 
    Case Is = "Cow" 
     Ansa(j, 1) = "Moo!" 
    Case Is = "Bird" 
     Ansa(j, 1) = "Tweet!" 
    Case Is = "Sheep" 
     Ansa(j, 1) = "Ba-Ba-Ba!" 
    Case Is = "Dog" 
     Ansa(j, 1) = "Woof!" 
    Case Else 
     Ansa(j, 1) = "Eh?" 
    End Select 
Next j 
MakesSound = Ansa 
End Function 
+0

Grazie Charles/brettdj, sono impressionato. Funziona. –

+0

Quindi ... la lezione da cui trae ispirazione in termini semplici è quella di avere un input da un intervallo convertito in un array 2D di qualsiasi dimensione (o tipo?), La funzione o UDF (User Defined Function) può elaborare l'array come comunque, gli utenti apprezzano, una volta fatto, l'output "come variante" fa rientrare di conseguenza la conversione dalla matrice. Adoro imparare Excel !! :-) –

3

Lo scopo di utilizzare formule di matrice per il campione indicata è davvero oscuro per me, ma in ogni caso, se si insiste - provare quanto segue:

  1. Seleziona regione C3:C7 (come sullo schermo superiore).
  2. Press F2 per modificare sul posto e digitare la seguente formula: =MakesSound(B2:B7)
  3. Press CTRL + SHIFT + INVIO invece di solito ENTER - questo definirà una formula di matrice e si tradurrà in {} parentesi intorno ad esso (ma NON scriverle manualmente!).

Non sono sicuro che l'UDF possa gestire correttamente la notazione di matrice, ma per le normali formule di Excel funziona come previsto, ad es. prova =LEFT(B2:B7,2) come matrice uno per il passo 2 - e questo restituirà 2 lettere iniziali di ogni nome di animale.

Spero che sia stato in qualche modo utile. In bocca al lupo!

+0

Hai ragione, Peter L, non ha funzionato correttamente. E 'venuto fuori con #VALUES !. Speravo che avrebbe gestito questo tipo di elaborazione di array. –

+0

@ user1924393 Se la risposta è stata in qualche modo utile - non esitare a revocarlo, hai abbastanza rappresentante per tale privilegio) –

+0

fatto, Peter L. Sto imparando ... :) –