XL 2016 macro rechechev

  • Initiateur de la discussion Initiateur de la discussion juju91
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

juju91

XLDnaute Junior
Bonjour à tous,

Je me permets de vous solliciter pour un petit problème que je n'arrive pas a résoudre.

J'ai créé un macro ( peut être pas très propre pour les professionnels de VBA) qui me permet de faire une rechercheV sur une plage donnée (feuille recherche) depuis une feuille ( Base).
j'arrive a ''gérer'' si les valeurs cherchées son vide ....
Mon problème est lorsque la valeur cherché n'est pas trouver, je souhaiterais que dans ce cas là un "?" s'inscrive au lieu d'avoir '' #N/A''.

Je ne sais pas si j'ai été assez clair.
je mets donc in ficher pour plus simplifier les choses ..

Par avance merci pour votre aide

Cdt
 

Pièces jointes

Bonsoir,
Teste ceci
VB:
Private Sub CommandButton1_Click()
Dim Cel As Range
    With Sheets(2)
        For Each Cel In .Range("A1:A5,A9:A16") '  & .Range("A1").End(xlDown).Row)
            Cel.Offset(, 1).Formula = "=IFERROR(VLOOKUP(" & Cel.Address(0, 0) & ",BASE!$A$6:$D$101,4,FALSE),""?"")"
     Next Cel
  End With
  For ligne = 1 To 16
     If Cells(ligne, 2) = "" Then
     'si c'est vrai
     Cells(ligne, 2) = ""
     End If
     Next ligne
 
 
End Sub
 
Bonsoir juju91, le fil,

* sur la feuille "RECHERCHE", clique sur le bouton "Affiche après recherche".

* regarde les résultats affichés en B1:B16, dont B3, B10, et B13.

* supprime le 1er caractère "X" de A3 ; idem pour A10 et A13.

* clique de nouveau sur le bouton "Affiche après recherche".

* vérifie les résultats de B1:B16.

* TRÈS IMPORTANT : sur la 1ère feuille "BASE", si tu ajoutes des données sous la ligne 101, elles seront automatiquement prises en compte : tu n'auras PAS besoin de modifier le code VBA.

* lis le code VBA. 🙂

si besoin, tu peux demander une adaptation ; à te lire pour avoir ton avis. 😉
si tout est ok, clique sur la coche ☑ du bord vertical droit de ce post. 😇


code VBA de Feuil2 (22 lignes) :

VB:
Option Explicit

Private Sub CommandButton1_Click()
  Dim dlg&: dlg = Cells(Rows.Count, 1).End(3).Row
  If dlg = 1 And IsEmpty([A1]) Then Exit Sub
  Dim cel As Range, pdt$, lig&
  Application.ScreenUpdating = 0: Range("B1:B" & dlg) = Empty
  With Worksheets("BASE")
    For lig = 1 To dlg
      pdt = Cells(lig, 1)
      If pdt <> "" Then
        Set cel = .Columns(1).Find(pdt, , -4163, 1, 1)
        If cel Is Nothing Then
          Cells(lig, 2) = "?"
        Else
          Cells(lig, 2) = Round(cel.Offset(, 3), 2)
        End If
      End If
    Next lig
  End With
  ActiveCell.Select 'pour désélectionner le bouton
End Sub



* j'ai supprimé Module2 car mon code VBA écrit les données en dur au lieu de mettre une formule ➯ ça devient inutile de figer les données ➯ ta sub FIGER() n'est plus nécessaire ! 😉

* j'ai aussi supprimé Module1, qui était vide.​

soan
 

Pièces jointes

Dernière édition:
Bonjour

Et un grand merci pour toutes vos suggestions.

Pour la solution de M12, j'ai un message d'erreur " erreur de compilation : variable non définie "
apriori cela bloque à partir de : For ligne =1 to 16
Idem pour la solution de Phil69970 même message d'erreur.
et je ne vois pas pourquoi .

Concernant la solution de soan c'est parfait .
Etant donné que je n'aime pas trop utiliser le travaille des autres surtout quand il est parfait .
est il possible d'avoir quelques explication sur le code afin que je puisse mieux le comprendre et l'utiliser au mieux .

Encore un trés grand merci à tous.

Cdt

 
Bonjour à tous

@juju91

Pour la solution de M12, j'ai un message d'erreur " erreur de compilation : variable non définie "
apriori cela bloque à partir de : For ligne =1 to 16
Idem pour la solution de Phil69970 même message d'erreur.
et je ne vois pas pourquoi .
Normalement avec cette version tu ne devrais pas avoir d'erreur

Merci de ton retour

@Phil69970
 

Pièces jointes

@juju91

Concernant la solution de soan c'est parfait.

merci pour ton retour ! 😊



est-il possible d'avoir quelques explications sur le code afin que je puisse mieux le comprendre et l'utiliser au mieux ?

oui, voici le code commenté :

Option Explicit : oblige à déclarer les variables.

Private Sub CommandButton1_Click() .. End Sub : macro du bouton "Affiche après recherche".

Dim dlg& : idem que Dim dlg As Long : déclare la variable dlg, de type Long ; dlg est mon abréviation pour « dernière ligne ».

dlg = Cells(Rows.Count, 1).End(3).Row : idem que dlg = Cells(Rows.Count, "A").End(xlUp).Row : numéro de la dernière ligne, selon la colonne A.

If dlg = 1 And IsEmpty([A1]) Then Exit Sub : comme il n'y a pas de ligne d'en-têtes : si dlg est la 1ère ligne et que A1 est vide, alors sortir de la sub, car y'a aucune donnée !

Dim cel As Range, pdt$, lig& : déclaration de 3 autres variables ; Dim pdt$ : idem que Dim pdt As String

Application.ScreenUpdating = 0 : la mise à jour de l'écran est désactivée ➯ l'exécution de la sub est plus rapide.

Range("B1:B" & dlg) = Empty : on efface les anciens résultats, pour éviter toute interférence avec les nouveaux résultats à venir.

With Worksheets("BASE") .. End With : avec la feuille "BASE".

For lig = 1 To dlg .. Next lig : de la 1ère ligne à la dernière ligne ➯ pour toutes les lignes.

pdt = Cells(lig, 1) : pdt contient ce qu'il y a en colonne A : ça peut être le nom du produit, ou rien si c'est une cellule vide.

If pdt <> "" Then .. End If : si pdt est différent de rien, alors on a un nom de produit.

Set cel = .Columns(1).Find(pdt, , -4163, 1, 1) : on cherche le nom du produit dans la colonne A de la feuille "BASE" ; -4163 = xlValues ; le 1er 1 = xlWhole ; le 2ème 1 = xlByRows.
VB:
If cel Is Nothing Then
  Cells(lig, 2) = "?"

si le nom du produit n'a pas été trouvé, alors on affiche un "?" en colonne B.

VB:
Else
  Cells(lig, 2) = Round(cel.Offset(, 3), 2)
End If

si on a trouvé le nom du produit, alors on affiche en colonne B ce qu'il y a 3 colonnes à droite du nom de produit (de la feuille "BASE") ; or 3 colonnes à droite de la colonne A, c'est la colonne D, où il y a effectivement le prix qu'on recherche : celui du produit trouvé.

ActiveCell.Select : pour désélectionner le bouton ➯ c'est la cellule active qui est sélectionnée au lieu du bouton.

à te lire pour avoir ton avis. 😉

soan​
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
40
Affichages
1 K
Réponses
14
Affichages
372
Réponses
9
Affichages
210
Réponses
3
Affichages
115
Retour