XL 2016 macro rechechev

juju91

XLDnaute Nouveau
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

  • RECHERCHE V PAR MACRO .xlsm
    28.3 KB · Affichages: 7
  • RECHERCHE V PAR MACRO .xlsm
    28.3 KB · Affichages: 1

M12

XLDnaute Accro
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
 

soan

XLDnaute Barbatruc
Inactif
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

  • RECHERCHE V PAR MACRO .xlsm
    29.5 KB · Affichages: 3
Dernière édition:

juju91

XLDnaute Nouveau
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

 

Phil69970

XLDnaute Barbatruc
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

  • Recherche V & SiErreur V2 .xlsm
    27.6 KB · Affichages: 4

soan

XLDnaute Barbatruc
Inactif
@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:

Discussions similaires

Réponses
6
Affichages
143
Réponses
20
Affichages
440
Réponses
5
Affichages
193

Statistiques des forums

Discussions
312 111
Messages
2 085 391
Membres
102 882
dernier inscrit
Sultan94