2016-02-08 1 views
1

Je ne peux pas référencer une plage avec une feuille pour ma fonction comme je peux avec = vlookup.passant gamme sur une autre feuille à vlookup

Cela fonctionne: =MVLOOKUP(a2,B:C,2,",",", ")
Ce n'est pas: =MVLOOKUP(a2,Sheet3!B:C,2,",",", ")

Le code:

Public Function MVLookup(Lookup_Values, Table_Array As Range, Col_Index_Num As Long, Input_Separator As String, Output_Separator As String) As String 

Dim in0, out0, i 
in0 = Split(Lookup_Values, Input_Separator) 
ReDim out0(UBound(in0, 1)) 

For i = LBound(in0, 1) To UBound(in0, 1) 

    out0(i) = Application.WorksheetFunction.VLookup(in0(i), Table_Array, Col_Index_Num, False) 

Next i 

MVLookup = Join(out0, Output_Separator) 

End Function 

Je ne sais pas de base et je ne prévois pas de l'apprendre, j'utilise rarement même excel, désolé pour la question boiteuse. Je suppose que basique est vraiment "basique" il m'a fallu 30 minutes pour arriver à ce point de la référence (lecture incluse), mais d'autres 60 minutes de frustration car le problème ci-dessus.
Aidez-moi pour que je puisse retourner à ma vie libre de vba! Bien que le code ci-dessus ait fonctionné après un redémarrage d'Excel, Jeeped m'a donné une solution plus sûre et une fonctionnalité plus universelle. Merci pour ça. Je n'avais pas l'intention de l'utiliser sur d'autres chaînes que les chaînes, mais grâce à l'ajout, j'ai supposé à tort qu'il y a une vérification du type de données à chaque fois et le type passé en arrière-plan et vlookup agissant en conséquence. J'ai également appris à définir des valeurs par défaut pour les variables d'entrée de fonction.

Voir la solution.

Merci encore, Jeeped!

+0

Votre objectif déclaré est suspect, mais vous * pourrait * écrire comme [INDEX] (https://support.office.com/en -us/article/index-function-0ee99cef-a811-4762-8cfb-a222dd31368a)/[MATCH] (https://support.office.com/fr-fr/article/match-fonction-0600e189-9f3c-4e4f- 98c1-943a0eb427ca) paire de fonctions. par exemple. = INDEX (Feuille3! C: C, MATCH (A2, B: B, 0)) ' – Jeeped

Répondre

1

Vous confondez 1 avec "1" et quelle que soit votre dégoût personnel pour VBA, je ne sais vraiment pas d'un langage de programmation qui les traite comme des valeurs identiques (à l'exception possible de COUNTIF function de une feuille de calcul).

Public Function MVLookup(Lookup_Values, table_Array As Range, col_Index_Num As Long, _ 
         Optional Input_Separator As String = ",", _ 
         Optional output_Separator As String = ", ") As String 

    Dim in0 As Variant, out0 As Variant, i As Long 

    in0 = Split(Lookup_Values, Input_Separator) 
    ReDim out0(UBound(in0)) 

    For i = LBound(in0) To UBound(in0) 
     If IsNumeric(in0(i)) Then 
      If Not IsError(Application.Match(Val(in0(i)), Application.Index(table_Array, 0, 1), 0)) Then _ 
       out0(i) = Application.VLookup(Val(in0(i)), table_Array, col_Index_Num, False) 
     Else 
      If Not IsError(Application.Match(in0(i), Application.Index(table_Array, 0, 1), 0)) Then _ 
       out0(i) = Application.VLookup(in0(i), table_Array, col_Index_Num, False) 
     End If 

    Next i 

    MVLookup = Join(out0, output_Separator) 

End Function 

Lorsque vous Split une chaîne dans un tableau de variante, vous vous retrouvez avec un ensemble d'éléments de chaîne. Accordé, ils regardent comme des nombres mais ils ne sont pas des nombres vrais; simplement des fac-similés de représentation textuelle de nombres réels. Le VLOOKUP function ne les traite pas comme des nombres lorsque la première colonne de votre paramètre table_array est remplie avec des nombres réels. Le IsNumeric function peut reconiser une chaîne qui ressemble à un nombre, puis le Val function peut convertir ce texte en un nombre vrai.

J'ai également ajouté une vérification rapide pour m'assurer que ce que vous recherchez est réellement là avant que vous n'essayiez d'insérer la valeur de retour dans un tableau.

Vos chaînes fractionnées sont des tableaux de variantes unidimensionnels. Il n'est pas nécessaire de fournir le rang dans les fonctions LBound/UBound.

mvlookup_samplemvlookup
Exemple de données sur Feuil3Les résultats de MVLOOKUP

+0

La formule dans B3 est '= MVLookup (A3, Sheet3! C: D, 2)'. – Jeeped

+0

Eh bien, en fait, le code que j'ai posté au début travaillé après avoir redémarré Excel sans types de données mixtes de toute façon. Je n'avais pas l'intention de l'utiliser autrement que sur des chaînes mais merci pour l'addition, j'ai supposé à tort qu'il y a une vérification du type de données à chaque fois et le type transmis en arrière-plan et vlookup agissant en conséquence. Merci aussi pour la syntaxe des valeurs par défaut, j'étais fainéant de vérifier comment cela se fait en basic. Merci pour l'aide! – z4k

+0

J'ai réfléchi à mon article et je me suis rendu compte que mes commentaires «basiques» et «vba libre» peuvent être interprétés comme offensants et/ou condescendants. Je voulais dire "basique" dans le bon sens, le basique d'aujourd'hui est un langage évolué de haut niveau avec des possibilités OO (pas comme sur c64 :), encore plus rapidement approchant que les autres, d'où le nom. – z4k

1

Cette référence de plage n'est pas valide dans Excel B:Sheet3!C.

Soit utiliser B:C ou Sheet3!B:C

Modifier. Corrigé selon le commentaire de Jeeped.

+0

peut-être' Sheet3! B: C'? – Jeeped

+0

'bien sûr. Avoir un moment. – teylyn

+0

Désolé que c'était une faute de frappe, j'entre ceux avec la souris, ici je l'ai tapé à la main. – z4k