Eu não sou especialista em Excel! No entanto eu percebo que a fórmula funciona bem envolto em MAX quando uma matriz absoluta é passada para ele, em vez de Array retornado de IF. Eu acho que isso é porque os comprimentos resultantes de duas matrizes não correspondem retornando # N / A para o excesso e que puxa a fórmula inteira para # N / A. Veja esta imagem abaixo.
IssomelevaacriarumaUDFmuitobásicanoVBAqueretornaapenasoArraynecessário.NãoexistemmuitasvalidaçõesnesteUDF.Certifique-sedequeapenasumareferênciadecolunasejapassadaparaelaeosvaloresderetornoesperadosexistamnacolunaadjacenteàdireita.porexemplo.sevocêpassarA1:A4,eleverificaráosvaloresemB1:B4.
PressioneALT+F11paraacessaroEditorVBA,Inserir->Móduloecoleoseguintecódigonele.
PublicFunctionRetArray(r1AsRange,aAsString)AsVariantDimii=0Dimmyarray()ForEachcellInr1Ifcell.Value=aTheni=i+1EndIfNextcellReDimmyarray(i)Dimjj=0ForEachcellInr1Ifcell.Value=aThenmyarray(j)=cell.Offset(0,1).Valuej=j+1EndIfNextcellRetArray=myarrayEndFunction
UsaremosesseUDFnasoluçãofinal.porexemplo.paraobterumamatrizdacolunaBondeAéH1useestafórmulacomo=RetArray(A1:A6,H1)
ApróximapartecomplicadaémapearessevalorretornadoparaolocalexatonacolunaEeobterovalordeD.
Primeiro,crieumacolunaauxiliaremC,queéaconcatenaçãodeD&E
AfórmulaemC1é=E1&F1
eéarrastadaatéascélulaspretendidasabaixo.Certifique-sedequesuadataestejaemumformatodedataválidonoseuExcelenãocomoumtexto;casocontrário,estasoluçãonãofuncionará.
SuatabelaestáemH1:H4.
Agora,emI1,coloqueaseguintefórmula.
=INDEX($D$1:$D$9,MIN(IF($C$1:$C$9=MAX(IF($F$1:$F$9=RetArray($A$1:$A$8,H1),$E$1:$E$9,0))&RetArray($A$1:$A$8,H1),ROW($C$1:$C$9),99^99)))
PressioneCTRL+SHIFT+ENTERparacriareArrayFormulaearraste-oparabaixoaolongodocomprimentodatabela.
Estasoluçãonãoétotalmentetestada.ElesófuncionarábemsevocêiniciarseusdadosnaLinha1,senãoareferênciairádarerrado,amenosquevocêmanipuleosmesmosusandoareferênciadelinhaanterior.Experimenteevolteatrás.Tambémverifiquesehásoluçõesmaisinteligentesdeoutrosusuáriostambém.
Atualizar
EuperceboqueenquantoosArraysConstantesfuncionavameoCellReferencenão(oquemelevouacriarumUDFretornandoumArray)usandoafunçãoTRANSPOSE,naverdade,parececriarumtipodeArrayConstantedentro.EntãoapenassubstituaUDFporTRANSPOSEenvoltoemIFeasoluçãofuncionasemnenhumcódigoVBA&qualquercolunaauxiliar.
Tenteissoeverifiqueseissocombinacomvocê.
AfórmuladamatrizemI1eabaixoé
=INDEX($D$1:$D$9,MIN(IF($E$1:$E$9&$F$1:$F$9=MAX(IF($F$1:$F$9=TRANSPOSE(IF($A$1:$A$8=H1,$B$1:$B$8)),$E$1:$E$9,0))&TRANSPOSE(IF($A$1:$A$8=H1,$B$1:$B$8)),ROW($C$1:$C$9),99^99)))