Excel VBA base de données

Résolu
Bonjour,

je suis actuellement en stage et je dois créer une base de données avec les fournisseurs et leurs produits sous excel car il s'agit d'une PME. Je dois cependant faire que la recherche d'une donnée soit facile et donc intégrer une feuille avec la possibilité de lancer une recherche avec des critères données.

En plus de cela, comme je suis en stage, que je part dans quelques mois et que personne dans l'entreprise ne s'y connais en VBA, je dois faire en sorte que toute modification soit très simple à faire (donc pas sous VBA).

J'ai commencé le code mais je suis un peu perdu car je suis débutant sous VBA.
L'idée serait que les personnes qui me suivraient n'auraient qu'à rajouter des lignes ou colonnes et à modifier les plages déjà crées.

J'espère que c'est assez claire.

Voici le code que j'ai commencé

Le but est de renvoyer à la feuille désirée et de faire en sorte que les résultats soient sélectioner avec le bouton "rechercher"

Sub cac() 

Sheets("recherche").Activate 

Dim variable 

Dim result As Range 

variable = Range("D4").Value 

If Range("A25") = True Then If Range("B25") = True Then coche = True 

If coche = wrong Then MsgBox "case non cochée" 

If coche = True Then 

Set result = Sheets("produits").Range("A1:I27").Find(variable, LookIn:=xlValues) 

End If 

End Sub 




Voici le lien du document:

http://www.cijoint.fr/cjlink.php?file=cj201106/cijFCTHe6f.xlsm

Merci d'avance

6 réponses

Résumé de la discussion

Plusieurs échanges portent sur la création d'une base Excel associant fournisseurs et produits, avec une recherche filtrable et des modifications faciles sans VBA, incluant des critères variés et une interface claire pour l'utilisateur. Le but est d'utiliser une feuille de recherche accessible via un bouton, de renvoyer les résultats vers les feuilles 'produits' ou 'infos' et d'ajouter des lignes sans toucher au code. Plusieurs réponses proposent d'éviter le piège d'un Else sans If en vérifiant End If, ou de remplacer VBA par mécanismes Excel (formules et listes déroulantes) pour gagner en simplicité. D'autres évoquent aussi l'existence de tutoriels VBA simples ou de ressources Excel pour faciliter la prise en main et la continuation du travail après le stage.

Bobot (l’IA à votre service)
  1. Contributeur
    Bonjour,

    If coche = wrong
    wrong ? plutôt false
    "coche" ne sert à rien

    manque des end if

    mais
    personne dans l'entreprise ne s'y connais en VBA, je dois faire en sorte que toute modification soit très simple à faire (donc pas sous VBA).

    puis
    Voici le code que j'ai commencé

    y'a un lézard...
    1. Je pense que les modification à faire ne seront pas sous le VBA editor, mais plutot sous excel. Je pense, pour ma part, que c'ets ce qu'il a voulu dire.
  2. Hello!

    A modifier:

    If Range("A25") = True Then 
    If Range("B25") = True Then 
    coche = True          
    
    If coche = False Then MsgBox "case non cochée"          
    
    Else          
    
    Set result = Sheets("produits").Range("A1:I27").Find(variable, LookIn:=xlValues)          
    
    End if
    End If    
    End If


    En effet: Pas de wrong mais False, et la, en remplacant ton deuxieme if par un else, tu as tous les end if

    De plus, es-tu sur que :
    MsgBox "case non cochée"
    marche et que ca ne soit pas plutot
    MsgBox ("case non cochée") 
    ?

    Dim variable 
    Pas de string ou integer?

    If Range("A25") = True Then If Range("B25") = True Then coche = True

    je ne comprend pas ce que tu veux dans la ligne... Est-ce que le true correspond à une case non vide?

    P.S à michel_m: Je vous ai envoyé un MP, l'avais-vous vu? :s
    1. Contributeur
      re,

      Surtout qu'avec les mises en formes conditionnelles, tu n'as pas besoin de VBA...
      1. Surement, mais il est en stage ^^' A mon avis, en stage prog, et il devra faire un compte-rendu.. Il faudra bien le nourrir avec quelques lignes de codes. ;)
      2. Contributeur
        mouche du coche
      3. Contributeur
        Ça m'arrive assez souvent d'être jury de stage:

        Si il utilise du VBA alors que des formules Excel sont possibles: validation refusée à moins qu'il n'est pas tout dit ce qui est aussi mauvais pour une validation
        S'il présente ton code,validation défavorable car peu efficace:variable inutile test if-end if surabondant

        donc, tu as la réponse
      4. Ha mais moi, je ne faisait que rectifier son code.. C'ets son stage, pas le notre, c'est à lui de faire comme il le souhaite, si il a besoin d'aide, il viens poster et on essaira de l'aider...
    2. Merci d'avoir répondu aussi vite.

      En fait, c'est plus un boulot d'été et le patron veut que sa base de données fournisseurs et produits soit plus ordonée mais il faut que sa reste simple car à la fin de l'été (donc quand je partirais), plus personne dans l'entreprise ne sera capable de faire des modifications de cette base sous VBE.

      Le but est donc que cette bdd puisse être mise à jour (sinon quel intérêt pour une entreprise) mais très facilement pour des personnes qui ne connaissent que les bases d'excel. Donc j'ai pensé que le plus simple serait de faire comme cela et ainsi il n'y aurait que les plages à modifier (pour englober les nouvelles informations).

      Sinon c'est vrai que pour les fournisseurs par exemple il suffit d'aller dans la liste des plages (avec leur noms) mais bon faut que ce soit complet et plus ou moins présentable et avec un minimum de pratiques et de connaissances Excel.

      Pour ce qui est du:
      If Range("A25") = True Then If Range("B25") = True Then coche = True

      c'est juste que je ne savais pas trop comment faire référence directement à la case à cocher donc j'ai utilisé ces cellules en tant que valeur reliée à la case à cocher.

      Je vais essayer les modifs et vous donner un retour.
      1. Donc si je comprend bien:
        If Range("A25") = True Then If Range("B25") = True Then coche = True
        veux dire :
        -Si Cellule A25 est remplie, alors la case est coché?

        Dans ce cas, tu devrais plutot ecrire: If Cells(25,1).value <> "" then...

        Important: Dans ton code, pense à bien l'aéré. Il n'y a rien de plus énervant que de lire un code en "bloc".

        De plus, comme l'a dit michel_m plus haut, essai d'oublier les if end if en abondance :s
      2. Contributeur
        ET si tu nous disais précisément ce que tu veux faire ? actuellement, tu nous parles de l'environnement humain de ta boite, ce qui nous permet pas de te donner un coup de main
      3. Non pas vraiment, ce que je veux faire c'est:
        d'abord choisir quel est le facteur de recherche à partir d'une liste déroulante puis choisir ce que je veux trouver (informations sur un produit ou sur un fournisseurs).
        Par exemple:

        -je coche la 1ère ligne (recherche par produits; disons le produit qui s'appelle A3)
        puis je coche la 4ème ligne (détails produits), je veux donc que le bouton rechercher me redirige vers l'onglet produits et me sélectionne la ligne correspondant au produit appelé A3 (donc ligne 6)

        -je coche la 1ère ligne (recherche par produits; disons le produit qui s'appelle A3)
        puis je coche la 3ème ligne (détails fournisseurs), je veux donc que le bouton recherche me redirige vers l'onglet infos et me sélection la ligne correspondant au fournisseur du produit appelé A3 (donc ligne 4)

        Sinon j'ai mis le Else et sa beug, il me dit "erreur de compilation, Else sans if"
        sachant que j'ai mis le Else juste avant le set result comme vous l'avez indiqué.
      4. as-tu rajouté des end if?
      5. Contributeur
        puisque tu tiens à du VBA malgré que ton patron n'en veuille pas...

        proposition ton code modifié:
        Sub cac()
        Dim variable As String
        Dim lig As Byte
        
         With Sheets("recherche")
             variable = .Range("D4").Value
             If .Range("A25") And .Range("B25") Then
                  With Sheets("produits")
                       lig = .Range("A1:I27").Find(variable, .Range("A3"), xlValues).Row
                       .Range(.Cells(lig, "A"), .Cells(lig, "I")).Select
                       .Activate
                  End With
             Else
                  MsgBox "case non cochée"
             End If
        End With
        End Sub


        pour ce qui est des autres choix tu as intér^t à installer 2 autres cellules liées
    3. Ok j'ai modifié le code et sa fonctionne:

      Sub cac()
      
      Sheets("recherche").Activate
      
      Dim variable
      
      Dim result As Range
      
      variable = Range("D4").Value
      
      If Range("A25") = True And Range("B25") = True Then
      
      coche = True
      
      End if
      
      If coche = False Then
      
      MsgBox "case non cochée"
      
      Else
      
      Set result = Sheets("produits").Range("A1:I27").Find(variable, LookIn:=xlValues)
      
      End If
      
      End Sub


      Ce que j'aimerais maintenant c'est que quand je lance ma macro, si un des deux boutons n'est pas coché le message "case non cochée" apparait (ce qui est déjà le cas) et si mes deux cases sont cochées (recherche par "produits"; disons "A8") et, information désirée: détails produits), je me retrouve sur l'onglet "produits" et excel ayant selectioné la ligne correspondante au produit sélectioné via la liste déroulante (donc ici la ligne qui correspondant au produit appelé "A8" est la ligne 11)
      1. Et bien je pense que tu dois pouvoir le faire de la meme facon que ton premier code ;)

        Sinon, tu peut faire un :

        For i = 1 to Range("A65536").End(xlUp).Row
        If cells(i,1).value = combobox.text then
        Row(i).select
        end if
        next


        Je ne suis aps sur que cela marche, il y a surement des modifications à faire.
      2. Contributeur
        j'ai vraiment l'impression de déranger: faut me le dire, vous pourrez continuer de niveler par le bas ...

        il vaut mieux utiliser des boutons radios pour simplifier le code

        dernière proposition en attente d'intérêt
      3. Pour le bouton radio (appelé "case option" sous excel non?) j'ai l'impression qu'une fois sélectioné, on ne peut plus le désélectioner.

        Sinon pour ton code au dessus, ya un probleme au niveau du
        .Range(.Cells(lig, "A"), .Cells(lig, "I")).Select

        sa me met: "la méthode select de la classe range a échoué"
      4. Nomal, il doit lui manquer un chiffre au niveau du A et du I je pense
    4. Merci, j'ai presque fini mon code: voici ce que cela donne si ça peut aider pour d'autres:

      Sub cac() 
      Dim variable 
      Dim lig 
      Dim fournisseur 
      Dim vari_able 
      Dim leg 
      
      If Range("type") = 0 Or Range("info") = 0 Then GoTo erreur 
      
      
      variable = Sheets("recherche").Range("D4").Value 
      vari_able = Sheets("recherche").Range("D6").Value 
      
      '---------------recherche par produits 
      If Range("type") = 1 Then 
           With Sheets("produits") 
                lig = .Columns(1).Find(variable, .Range("A3"), xlValues).Row 
                If Range("info") = 1 Then              ' recherche produits 
                     .Activate 
                     Range(Cells(lig, "A"), Cells(lig, "Z")).Select 
                 Else                                                  ' recherche fournisseur 
                     fournisseur = .Cells(lig, "B") 
                     With Sheets("infos") 
                          .Activate 
                          lig = Columns(1).Find(fournisseur, Range("A3"), xlValues).Row 
                          Range(Cells(lig, "A"), Cells(lig, "Z")).Select 
                     End With 
                End If 
           End With 
      '--------------recherche par fourniseurs 
      Else 
              If Range("info") = 2 Then                               ' recherche fournisseur 
                  With Sheets("infos") 
                      leg = .Columns(1).Find(vari_able, .Range("A3"), xlValues).Row 
                      .Activate 
                      Range(Cells(leg, "A"), Cells(leg, "Z")).Select 
                  End With 
              Else 
                  With Sheets("produits")                             ' recherche produits 
                      leg = .Columns(2).Find(vari_able, .Range("B3"), xlValues).Row ' problème ici 
                      If leg Is Nothing Then 
                          MsgBox "Aucune référence pour ce nom" 
                      Else 
                          .Activate 
                          Range(Cells(leg, "A"), Cells(leg, "Z")).Select 
                      End If 
                  End With 
              End If 
      End If 
      Exit Sub 
      erreur: 
      MsgBox "choix non effectués", vbCritical 
      End Sub


      Voila tout fonctionne correctement sauf à l'endroit indiqué.
      Quand je ne met pas
      If leg is nothing then 
      Msgbox "Aucune référence pour ce nom" 
      Else 
      End if


      Tout va bien tant que la valeur est trouvée sinon sa beug (forcément car pas d'indication pour ce cas de figure). Donc je veut mettre un message si la valeur n'est pas trouvé avec le "if nothing" mais mon code ci-dessus me génére une erreur 91 "variable objet ou variable bloc with non définie"
      1. Contributeur
        Bonjour

        vari_able ????
        m^me punition un peu + haut
      2. Pardon mais j'ai pas trop saisi le sens de votre réponse.
        vari_able a été déclaré tout en haut et je lui ai attribué une valeur.
      3. Contributeur
        effectivement, excuses moi
        le choix de vari_able et de variable est un peu casse-g....

        difficile de dire
        pour ma part avec find je fais plutôt ceci (ce n'est pas une obligation) car j'ai souvent eu des pb avec ce "If leg Is Nothing Then "

         With Sheets("produits")
                            If Application.CountIf(.Columns(2), vari_able) > 0 Then
                                 leg = .Columns(2).Find(vari_able, .Range("B3"), xlValues).Row ' problème ici
                                 .Activate
                                 Range(Cells(leg, "A"), Cells(leg, "Z")).Select
                            Else
                                 MsgBox "Aucune référence pour ce nom"
                            End If
                    End With
      4. Je vais essayer et je vous dis si sa fonctionne. (je vais manger d'abord ;) )
        Bon'ap!
      5. C'est parfait sa fonctionne, merci encore!
        Comment signaler que le probleme est résolu?