2017-08-21 2 views
2

Je suis en train d'extraire des valeurs d'une feuille Excel à une autre. J'utilise la formule suivante:Formule personnalisée Excel avec les instructions IF et INDEX, MATCH renvoie une erreur #VALUE

= IF(ISBLANK(IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1));Error2;IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1)) 

Depuis que je dois faire des calculs avec les données extraites, je voulais créer une fonction personnalisée qui simplifierait le processus d'extraction en éliminant la nécessité de saisir les paramètres qui restent les mêmes à chaque fois . J'ai donc construit la fonction suivante:

Function DataCap(Dates As Variant, Row As Variant) As Variant 

    Dim Range1 As Range 'Define the whole lookup table 
     Set Range1 = Range("Data!A1:P151") 

    Dim Range2 As Range 'Define the date lookup table 
     Set Range2 = Range("Data!A3:P3") 

    Dim Error1 As Range 'Define the error 1; if no value 
     Set Error1 = Range("X16") 

    Dim Error2 As Range 'Define the error 2; if blank 
     Set Error2 = Range("Y16") 

    DataCap.Formula "= IF(ISBLANK(IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1));Error2;IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1))" 


End Function 

Lorsque je l'exécute, j'obtiens l'erreur #VALUE. Si je colle l'équation (avec les mêmes arguments) directement dans la cellule, cela fonctionne comme prévu. Donc, je pense que le problème est que VBA n'est pas capable de faire le calcul. Des suggestions pour résoudre ce problème?

Nous vous remercions de l'aide à l'avance

+0

Avez-vous défini 'Range',' Range2', 'Error1' et' Error2' comme plages nommées? –

+0

Vous ne pouvez pas utiliser de noms de variables VBA dans une formule et vous devez utiliser des virgules et non des points-virgules dans la chaîne de formule. – Rory

+0

@RobinMackenzie, non la plage, Range2, etc. sont définis uniquement dans le code, pas dans la feuille Excel. – Mark

Répondre

1

Sans être en mesure de le tester sur vos données, je ne peux pas être sûr que cela fonctionnerait, mais il pourrait au moins être en mesure de vous indiquer plus dans la bonne direction .

Public Function DCap(xDates As Variant, xRow As Variant) 
Dim Range1 As Range, Range2 As Range, Error1 As Range, Error2 As Range 

Set Range1 = ActiveWorkbook.Sheets("Data").Range("A1:P151") 
Set Range2 = ActiveWorkbook.Sheets("Data").Range("A3:P3") 

Set Error1 = ActiveWorkbook.ActiveSheet.Range("X16") 
Set Error2 = ActiveWorkbook.ActiveSheet.Range("Y16") 

On Error Resume Next 
If IsError(WorksheetFunction.Index(Range1, xRow, WorksheetFunction.Match(xDates, Range2, 0))) Then 
    DCap = Error1 
ElseIf Len(WorksheetFunction.Index(Range1, xRow, WorksheetFunction.Match(xDates, Range2, 0))) = 0 Then 
    DCap = Error2 
Else 
    DCap = WorksheetFunction.Index(Range1, xRow, WorksheetFunction.Match(xDates, Range2, 0)) 
End If 
On Error GoTo 0 

End Function 
+0

C'est parfait. Merci beaucoup. – Mark

+0

pourriez-vous également s'il vous plaît expliquer ce qui a causé des problèmes dans mon script original, donc je sais pour la prochaine fois? – Mark

+1

Les fonctions VBA retourneront toujours une valeur, plutôt qu'une formule (puisque la fonction est essentiellement la formule), donc essayer de construire autour de ce modèle est principalement ce que j'ai fait différemment. Je viens de diviser votre formule dans ses parties de base et l'a réécrit dans VBA, en utilisant WorksheetFunction, le cas échéant, pour garder son fonctionnement similaire à la façon dont il a été écrit à l'origine. Le premier 'If' vérifie que' Index' est une erreur, et si c'est le cas, retourne Error1; le second 'If' vérifie si l'Index est vide (c'est-à-dire length = 0), et si c'est le cas, renvoie Error2; si aucun d'entre eux n'est vrai, il renvoie le 'Index'. –