Débug fonction de recherche Vlookup VBA

PINET Augustin 20 Points de réputation
2026-03-11T16:16:35.6033333+00:00

Bonjour,

J'ai monté la fonction de recherche ci-dessous. Elle fonctionne très bien quand axe="y". Quand axe="x", elle fonctionne de manière plus aléatoire. A partir d'une certaine ligne de mon tableau de recherche, la fonction retourne l'erreur VALEUR!. Je ne comprends pas d'où vient le" problème puisque la fonction est codée de la même manière pour y et pour x et en x, la fonction fonctionne bien jusqu'à un certain point.

Il me semble avoir correctement vérifié que mes données (que des nombres) sont correctement implémentées ... Pas d'espaces invisibles

Merci de votre aide !


'Récupération des données relatives au profilé selon l'axe d'intérêt (x ou y) selon type de profilé
'Est directement dépendante des feuilles de données de profilés

Function donneesH(typeProfilé As String, refProfile As Integer, axe As String)

    'Instanciation variables
    Dim hauteur As Integer
    Dim momentQuad As Integer
    Dim moduleQuad As Integer
    Dim epaisseurAme As Double
    Dim epaisseurSemelle As Double
    Dim section As Double
    Dim masse As Double
    
    'Données génériques
    epaisseurAme = Application.WorksheetFunction.VLookup(refProfile, Worksheets(typeProfilé).Range("B3:O26"), 4, False)
    epaisseurSemelle = Application.WorksheetFunction.VLookup(refProfile, Worksheets(typeProfilé).Range("B3:O26"), 5, False)
    section = Application.WorksheetFunction.VLookup(refProfile, Worksheets(typeProfilé).Range("B3:O26"), 8, False)
    masse = Application.WorksheetFunction.VLookup(refProfile, Worksheets(typeProfilé).Range("B3:O26"), 7, False)
    
    'Cas de la flexion selon x
    If axe = "x" Then
    
        hauteur = Application.WorksheetFunction.VLookup(refProfile, Worksheets(typeProfilé).Range("B3:O26"), 2, False)
        momentQuad = Application.WorksheetFunction.VLookup(refProfile, Worksheets(typeProfilé).Range("B3:O26"), 9, False)
        moduleQuad = Application.WorksheetFunction.VLookup(refProfile, Worksheets(typeProfilé).Range("B3:O26"), 10, False)
        
    'Cas de la flexion selon y
    ElseIf axe = "y" Then
    
        hauteur = Application.WorksheetFunction.VLookup(refProfile, Worksheets(typeProfilé).Range("B3:O26"), 3, False)
        momentQuad = Application.WorksheetFunction.VLookup(refProfile, Worksheets(typeProfilé).Range("B3:O26"), 12, False)
        moduleQuad = Application.WorksheetFunction.VLookup(refProfile, Worksheets(typeProfilé).Range("B3:O26"), 13, False)
        
    End If
    
    'Mise en forme du résultat
    Dim Arr(1 To 7, 1 To 5) As Variant
    
    Arr(1, 5) = hauteur
    Arr(2, 5) = epaisseurAme
    Arr(3, 5) = epaisseurSemelle
    Arr(4, 5) = momentQuad * ((10) ^ (4)) 'Conversion en mm4
    Arr(5, 5) = moduleQuad * ((10) ^ (3)) 'Conversion en mm3
    Arr(6, 5) = section * ((10) ^ (2)) 'Conversion en mm2
    Arr(7, 5) = masse * 9.81 / 1000 'Conversion N/mm
    
    Arr(1, 1) = "Hauteur de flexion"
    Arr(1, 2) = "h"
    Arr(1, 3) = "mm"
    Arr(2, 1) = "Epaisseur d'ame"
    Arr(2, 2) = "e_ame"
    Arr(2, 3) = "mm"
    Arr(3, 1) = "Epaisseur de semelle"
    Arr(3, 2) = "e_sem"
    Arr(3, 3) = "mm"
    Arr(4, 1) = "Moment quadratique"
    Arr(4, 2) = "I" + axe
    Arr(4, 3) = "mm4"
    Arr(5, 1) = "Module quadratique"
    Arr(5, 2) = "W" + axe
    Arr(5, 3) = "mm3"
    Arr(6, 1) = "Section"
    Arr(6, 2) = "S"
    Arr(6, 3) = "mm2"
    Arr(7, 1) = "Poids linéique"
    Arr(7, 2) = "p"
    Arr(7, 3) = "N/mm"
    
    donneesH = Arr
    
End Function
Microsoft 365 et Office | Excel | Pour les entreprises | Windows
0 commentaires Aucun commentaire

Réponse acceptée par l’auteur de la question
Doris V 2,920 Points de réputation Personnel externe Microsoft Modérateur
2026-03-12T03:52:42.1066667+00:00

Cette réponse a été traduite automatiquement. Elle peut donc contenir des erreurs grammaticales ou des expressions inhabituelles.

Bonjour @PINET Augustin,

Après avoir examiné la fonction VBA que vous avez partagée, plusieurs points peuvent expliquer l'apparition de l'erreur #VALEUR! après une certaine ligne lorsque axe="x".

Tout d'abord, la fonction utilise « WorksheetFunction.VLookup ». En VBA, cette méthode recherche une valeur dans la première colonne de la plage de recherche et renvoie une valeur d'une autre colonne de la même ligne. Si la valeur recherchée ne correspond pas, la fonction peut renvoyer une erreur.

Veuillez vérifier les points suivants :

  1.  Assurez-vous que « refProfile » existe dans la première colonne de la plage de recherche (B3:O26) et que les types de données correspondent (par exemple, les nombres sont stockés comme des nombres et non comme du texte).
  2. Confirmez que la plage de recherche inclut bien toutes les lignes utilisées et qu'aucune entrée n'est omise.
  3. Vérifiez les types de variables utilisés dans la fonction. Certaines variables, telles que « hauteur », « momentQuad » et « moduleQuad », sont déclarées comme « Integer », ce qui peut poser problème si les valeurs renvoyées dépassent la limite des entiers. L'utilisation du type Double est souvent plus sûre pour les données numériques dans les tableaux techniques.

Pour plus d'informations sur le fonctionnement de la fonction RECHERCHEV dans Excel et en VBA, consultez les articles Microsoft suivants :

Si le problème persiste, n'hésitez pas à partager un exemple de données de la feuille de calcul ou une capture d'écran de la table de recherche afin que la communauté puisse examiner la structure et vous apporter une aide plus precise.


Si cette réponse vous a été utile, veuillez cliquer sur « Accepter la réponse » et voter pour elle. Si vous avez des questions supplémentaires concernant cette réponse, veuillez cliquer sur « Commenter ».

Remarque : Veuillez suivre les instructions de notre documentation pour activer les notifications par e-mail si vous souhaitez recevoir les notifications relatives à cette discussion.

Cette réponse a-t-elle été utile ?

1 personne a trouvé cette réponse utile.
0 commentaires Aucun commentaire

2 réponses supplémentaires

  1. Doris V 2,920 Points de réputation Personnel externe Microsoft Modérateur
    2026-03-13T02:03:50.1166667+00:00

    Bonjour @PINET Augustin,
    Merci pour cette mise à jour. Je suis ravi d'apprendre que le passage au type Double a résolu le problème. 

    La confusion provient probablement de la limitation du type de données Integer en VBA. En VBA, Integer ne peut stocker que des valeurs comprises entre -32 768 et 32 767. La plage de -2 147 483 648 à 2 147 483 647 correspond en réalité au type de données Long. 

    De ce fait, le dépassement de capacité s'est probablement produit avant la conversion d'unité dans votre code. Par exemple, dans votre jeu de données, la valeur de Ix pour HEA450 semble être 63 722 (cm⁴). Cette valeur dépasse déjà la limite maximale qu'un Integer peut stocker (32 767). Lorsque le résultat de la fonction VLookup est affecté à: 

    momentQuad = Application.WorksheetFunction.VLookup(...)

    VBA tente de stocker 63722 dans un Integer, ce qui provoque un dépassement de capacité. La conversion ultérieure en mm⁴ (× 10⁴) n'est pas effectuée car l'affectation elle-même échoue. 

    L'utilisation du type Double (ou Long, le cas échéant) permet de contourner cette limitation et est généralement recommandée pour la manipulation de tableaux d'ingénierie ou de mesures susceptibles de contenir des valeurs plus importantes. 

    J'espère que cela vous aide à comprendre le comportement que vous avez observé. Si vous avez d'autres questions ou besoin d'aide supplémentaire, n'hésitez pas à me contacter.

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire

  2. PINET Augustin 20 Points de réputation
    2026-03-12T08:17:33.37+00:00

    Bonjour Doris,

    Merci pour votre réponse rapide. Effectivement, modifier le type de variable à Double à résolu le problème, Merci beaucoup.

    Cela ne m'explique tout de même pas pourquoi elle m'affichait l'erreur. Il arrive effectivement de dépasser la limite des Integer de -2 147 483 648 et 2 147 483 647 mais l'erreur apparaissait bien avant. Exemple, pour un profilé HEA450 (pour lequel la fonction me retournait l'erreur), mon momentQuad convertie en mm4 (plus grande valeur donnée par la fonction) n'excède pas les 637 220 000... (cf. image ci-dessous).Image de l’utilisateur De plus les données de mon tableau sont bien des entiers pour ces valeurs d'entrée :

    Image de l’utilisateur

    Une idée du pourquoi du comment ?

    Merci d'avance.

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire

Votre réponse

Les réponses peuvent être marquées comme « Acceptées » par l’auteur de la question et « Recommandées » par les modérateurs, ce qui aide les utilisateurs à savoir que la réponse a résolu le problème de l’auteur.