Excel VBA base de données

Résolu/Fermé
Signaler
Messages postés
7
Date d'inscription
lundi 6 juin 2011
Statut
Membre
Dernière intervention
6 juin 2011
-
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
-
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

Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
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...
Messages postés
708
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
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.
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
re,

Surtout qu'avec les mises en formes conditionnelles, tu n'as pas besoin de VBA...
Messages postés
708
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
pardon?
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
Ç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
Messages postés
708
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
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...
Messages postés
7
Date d'inscription
lundi 6 juin 2011
Statut
Membre
Dernière intervention
6 juin 2011

Je suis pas vraiment en stage mais plutot en job d'été.

Sinon dans mon cas comment eviter tout ces if-end if?

Je suis débutant en vba...

Merci pour votre aide
Messages postés
708
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
Pour éviter tous ces end fi, il faut juste que tu evite tous les if ^^'
Messages postés
7
Date d'inscription
lundi 6 juin 2011
Statut
Membre
Dernière intervention
6 juin 2011

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.
Messages postés
708
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
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
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
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
Messages postés
7
Date d'inscription
lundi 6 juin 2011
Statut
Membre
Dernière intervention
6 juin 2011

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é.
Messages postés
708
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
as-tu rajouté des end if?
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
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
Messages postés
7
Date d'inscription
lundi 6 juin 2011
Statut
Membre
Dernière intervention
6 juin 2011

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)
Messages postés
708
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
Nomal, il doit lui manquer un chiffre au niveau du A et du I je pense
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
Ah tiens, j'existe ?

ci joint proposition
https://www.cjoint.com/?3FgmJPXB5Sw
Messages postés
7
Date d'inscription
lundi 6 juin 2011
Statut
Membre
Dernière intervention
6 juin 2011

ouai c'est parfait, merci beaucoup.
Pour le reste, je me baserais sur ce que tu as fait pour finir ce projet.
Je laisse le sujet ouvert au cas où j'ai d'autres questions ou problèmes (pour éviter d'ouvrir de nouveaux posts).

P.S: connaissez vous des tutoriaux assez facile sur le VBA (je suis allez sur le site du zero mais ya pas tout.)?

Merci encore à vous deux
Messages postés
708
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
Non, sur le site du zero, tu as juste les bases.
Si tu veux d'autre tuto, va sur ce site : https://vb.developpez.com/cours/
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
on aurait pu aussi passer par des filtres pour ne voir que ce qu'on cherchait

tutos: tu peux regarder
en pdf ou web

ftp://ftp2.developpez.be/developps/vb/VB-excel2.pdf
http://www.excelabo.net/accueil
très pédagogique et sympa
http://www.info-3000.com/vbvba/index.php

Bonne lecture (ca ne se lit pas comme un polar, hélas!) mais le + important quelque soit le langage est de définir le "système d'information" -cad, ce que tu veux obtenir précisément et entièrement

vaut mieux que tu ouvres de nouveaux sujets sauf pour la fin de celui-ci: recherche par fournisseur (je n'ai pas compris ce que tu voulais faire, cf paragraphe ci dessus)
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"
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.
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
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
Je vais essayer et je vous dis si sa fonctionne. (je vais manger d'abord ;) )
Bon'ap!
C'est parfait sa fonctionne, merci encore!
Comment signaler que le probleme est résolu?
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
tu coches en haut du 1° message "marquer comme résolu"

Le mieux serait que tu t'inscrives

Cordialement et à bientôt pour de nouvelles aventures
Messages postés
708
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
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