Besoin d'aide en VB

Fermé
Gwec - 17 avril 2009 à 10:24
 Gwec - 21 avril 2009 à 10:17
Bonjour,

J'ai un petit soucis avec la programmation de mon excel,

Je souhaite effectuer une recherche sur mon classeur excel pour ensuite lui affecter un calcul!
J'ai utilisé pour cela un formulaire où il est demandé les informations suivantes:

- profil de l'acier
- dimension du profil
- longueur du profil
- traitement du profil
et quantité à soustraire à mon stock

Voilà mon code :

'je démarre ma recherche ici'
'il faut que le profil, la dimensions et la longueur soient identiques afin de pouvoir effectuer le calcul'


With stock.Range("a5:a100")

Set asortie = .Find("txtprofilsortie", LookIn:=xlValues)

If Not asortie Is Nothing Then

MsgBox "le profil n'existe pas"

Exit Sub
End If

With stock.Range("b5:b100")

Set bsortie = .Find("txtdimsortie", LookIn:=xlValues)

If Not bsortie Is Nothing Then

MsgBox "Cette dimension n'est pas disponible pour ce profil "

Exit Sub
End If

With stock.Range("c5:c100")

Set csortie = .Find("txtlongsortie", LookIn:=xlValues)

If Not csortie Is Nothing Then

MsgBox "Cette longueur n'est pas disponible pour ce profil"

Exit Sub
End If

'il manque la partie ou je calcul la soustraction sachant que je dois vérifier qu'il y a assez de quantit avant d'effectuer le calcul'
'la quantité se situe sur la colonne d et la valeur devrait affecté la ligne correspondant à la recherche'


End With
End With
End With


End Sub


DOnc voilà mes deux problèmes:

-Ma recherche ne marche dès la première ligne de code
- comment effectuer le calcul

Je suis débutant j'aii lus pas mal de tuto mais je ne m'en sort pas

SVP aidez moi

Cordialement
A voir également:
  • Besoin d'aide en VB
  • Vb cable - Télécharger - Audio & Musique
  • Vb - Télécharger - Langages
  • Vb editor - Télécharger - Langages
  • Vb runtime - Télécharger - Divers Utilitaires
  • Vb 2008 - Télécharger - Langages

11 réponses

Utilisateur anonyme
17 avril 2009 à 12:13
Bon j'ai modifié quelques trucs.

Je n'ai pas abordé la partie calcul, parce que tel que le programme est fait je ne sais pas retrouver les cellules du profil choisi (mais je cherche !!!)

Une question, pourquoi saisir tous les éléments d'un profil?
Ce serait plus simple de saisir le profil et de faire afficher longueur dimension... ( enfin pour l'utilisateur)


https://www.cjoint.com/?etbVaYUaHB

A+
1
cette ligne sert juste à faire apparaitre le terme en majuscule, il est vrai que cela n'est pas forcément utile.
[quote]'************* A quoi ca sert?
Profilconverti = Application.WorksheetFunction.Proper(Me.txtprofilsortie.Text)[/quote]


Ensuite je veux retrouver les informations (que je rentre dans mon formulaire ) dans mon feuillet excel je me trompe peut etre mais pour moi c'est bien cela que je cherche à faire

[quote]'With Worksheet("stock").Range("a5:a1000")
With Worksheets("stock").Range("a5:a1000")
'Set asortie = .Find("txtprofilsortie", LookIn:=xlValues)
'la on cherche le text =txtprofilsortie ca peut pas marcher
Set asortie = .Find(txtprofilsortie.Text, LookIn:=xlValues)
End With[/quote]

Enfin pour répondre à ta question sur les informations à faire apparaitre c'est pour faciliter la vie de l'utilisateur

Je souhaite "mais je ne sais pas faire", faire une liste déroulante pour le choix du profil (HEA, HEB, IPE, IPN, UPN, UPAF, UAP, Tube, Cornière, rond et carré. )
ensuite il existe tellement de dimension pour chaque profil que ca deviendrais trop long à faire dérouler c'est pourquoi j'ai séparer ( un peu faire comme tu cherche une voiture: tu cherche la marqe , puis le modèle puis le kliométrage ; c'est le même principe )

Mais bon si tu trouve une solution moins pratique mais qui fonctionne je suis preneur !!!

Je te remercie de t'occuper de mon cas,

Je continue de chercher aussi sur internet

Cordialement
0
Utilisateur anonyme
20 avril 2009 à 09:43
Salut,
Pour la partie calcul, erreur corrigée:
For i = 5 To 1000
    If Cells(i, 1) = "" Then
        Exit Sub
        MsgBox "produit non trouvé"
    End If
    
    If Cells(i, 1).Value = asortie And Cells(i, 2).Value = bsortie And Cells(i, 3).Value = csortie Then
        If Val(Cells(i, 4).Value) < Val(txtquantsortie.Value) Then
            MsgBox "Attention le stock n'est pas suffisant"
            txtquantsortie.SetFocus
        Else
            Cells(i, 4).Value = Cells(i, 4).Value - Val(txtquantsortie.Value)
            MsgBox "Stock " & asortie & " " & bsortie & " " & csortie & " Mis à Jour"
            frmsortie.Hide
        End If
        Exit Sub
    End If
Next i


tout regrouper en un seul formulaire au lieu de trois ( nouvel entrée, sortie et entrée d'un produit existant )

a priori oui, il n'y aurait d'ailleurs que 2 formulaires :sortie et entré (si le produit n'existe pas on le crée)
comment fait-on pour faire apparaître une liste déroulante

crée une combobox que tu remplis avec "ComboBox1.AddItem 'valeur' "

Par ailleurs le code serait changé! Ca dépend de ce que tu veux en faire!
1
Utilisateur anonyme
20 avril 2009 à 17:48
J'ai remplacer la text box du profil par une combobox qui est remplis dans le userform activate

elle possède le même nom qu'avait la textbox, ça devrait marcher sans modification. (Je n'ai pas testé jusqu'au bout)


https://www.cjoint.com/?ewhBlUv5QK
1
je vais essayé et je te tiendrais au courant. Je l'ai lancé en production et je l'améliorerais au fur et à mesure.

Je te remercie de ton aide c'était bien sympa et j'ai appris plein de chose.

PROBLEME RESOLU
0
j'ai essayé tes listes déroulantes j'ai modifier le code ca marche pour certaine mais pas tous je te mets le code:

Private Sub UserForm_Activate()
For i = 1 To 1000
If Worksheets("stock").Cells(i + 5, 1).Value <> Worksheets("stock").Cells(i + 4, 1).Value Then
    frmMouvement.txtprofil.AddItem Worksheets("stock").Cells(i + 4, 1).Value
Else
End If
Next i
For i = 1 To 1000
If Worksheets("stock").Cells(i + 5, 4).Value <> Worksheets("stock").Cells(i + 4, 4).Value Then
    frmMouvement.txtquant.AddItem Worksheets("stock").Cells(i + 4, 4).Value
End If
Next i
For i = 1 To 1000
If Worksheets("stock").Cells(i + 5, 5).Value <> Worksheets("stock").Cells(i + 4, 5).Value Then
    frmMouvement.txttraitement.AddItem Worksheets("stock").Cells(i + 4, 5).Value
End If
Next i
End Sub
0
Utilisateur anonyme
17 avril 2009 à 11:01
Bonjour

J'ai noté ces modifications à apporter:

With stock.Range("a5:a100") modif= With Worksheets("stock").Range("a5:a100")


If Not asortie Is Nothing Then modif= If asortie Is Nothing Then (supprimer Not)

Pareil dans les autres tests.

Quant aux calculs, il vaudrait mieux mettre votre fichier sur https://www.cjoint.com/ et coller le lien dans un nouveau post

A+
0
Merci de ta réponse ,

j'ai fait les modification mais il me marque encore des problème :S

Je vous transmet le lien

https://www.cjoint.com/?etaY3BBJlc

Voilà bon courage
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
17 avril 2009 à 18:28
Re

Voila pour le partie calcul et mise à jour!
https://www.cjoint.com/?etifUr4P76

A+
0
Utilisateur anonyme
17 avril 2009 à 19:32
J'avais loupé le post 4
'With Worksheet("stock").Range("a5:a1000")
With Worksheets("stock").Range("a5:a1000")

C'était juste pour signaler qu'il manquait un s à worksheet

'Set asortie = .Find("txtprofilsortie", LookIn:=xlValues)
'la on cherche le text =txtprofilsortie ca peut pas marcher
Set asortie = .Find(txtprofilsortie.Text, LookIn:=xlValues)
End With


si tu écris .Find("txtprofilsortie"...., tu vas chercher le texte "txtprofilsortie" dans tes cellules.
Alors que ce que tu veux , c'est chercher ce qui a été saisi dans ta textbox nommée txtprofilsortie ,
donc txtprofilsortie.Text
0
Bonjour,

Excuse moi de pas t'avoir répondu avant, mais bon avec le week end c'était pas facile :)

Merci pour la partie calcul par contre ca marche pour la première ligne mais pas pour les autres lignes.
Il me marque "produit non trouvé".

Je vais regardé plus en profondeur ton code pour essayer de trouver une faille .

Et juste une aute question crois tu qu'il serait possible de tout regrouper en un seul formulaire au lieu de trois ( nouvel entrée, sortie et entrée d'un produit existant ).

Enfin je sais j'abuse de ta sympathie, comment fait-on pour faire apparaître une liste déroulante dans un formulaire ( ca changerait tous le code dérrière ??? )
0
Ok merci pour la correction,

Pour les deux formulaires, il suffirait donc à mon formulaire entrée rajouter les mêmes recherches que ma sortie et s'il le trouve additionner... je vais essayé et je te dirai si j'y arrive.

Pour la liste déroulante les informations recherchée serait toujours de type texte??
comme txtprofil.txt ou ca changerait?

Je te remercie encore ca avance vite grace à toi
0
génial j'ai réussi à gérer l'entrée ou l'ajout d'un nouveau profil...

reste plus que la liste et essayé de regrouper l'ensemble des deux formulaires en un seul avec comme variable ( "entrée " ou "sortie" ) en dernier dans une liste déroulante...je vais essayé mais je promet rien

je te met le code de ce que j'ai fait dis moi si tu penses qu'il y a un risque de beug.

With Worksheets("stock").Range("a5:a1000")
Set aentree = .Find(txtprofil.Text, LookIn:=xlValues)

End With

If aentree Is Nothing Then
Sheets("stock").Range("A65536").End(xlUp).Offset(1, 0).Value = Me.txtprofil.Text
Sheets("stock").Range("B65536").End(xlUp).Offset(1, 0).Value = Me.txtdimprofil.Text
Sheets("stock").Range("C65536").End(xlUp).Offset(1, 0).Value = Me.txtlong.Text
Sheets("stock").Range("D65536").End(xlUp).Offset(1, 0).Value = Me.txtquant.Text
Sheets("stock").Range("E65536").End(xlUp).Offset(1, 0).Value = Me.txttraitement.Text
Exit Sub
End If

With Worksheets("stock").Range("b5:b1000")
Set bentree = .Find(txtdimprofil.Text, LookIn:=xlValues)
End With

If bentree Is Nothing Then
Sheets("stock").Range("A65536").End(xlUp).Offset(1, 0).Value = Me.txtprofil.Text
Sheets("stock").Range("B65536").End(xlUp).Offset(1, 0).Value = Me.txtdimprofil.Text
Sheets("stock").Range("C65536").End(xlUp).Offset(1, 0).Value = Me.txtlong.Text
Sheets("stock").Range("D65536").End(xlUp).Offset(1, 0).Value = Me.txtquant.Text
Sheets("stock").Range("E65536").End(xlUp).Offset(1, 0).Value = Me.txttraitement.Text
Exit Sub
End If

With Worksheets("stock").Range("c5:c1000")
Set centree = .Find(txtlong.Text, LookIn:=xlValues)
End With

If centree Is Nothing Then
Sheets("stock").Range("A65536").End(xlUp).Offset(1, 0).Value = Me.txtprofil.Text
Sheets("stock").Range("B65536").End(xlUp).Offset(1, 0).Value = Me.txtdimprofil.Text
Sheets("stock").Range("C65536").End(xlUp).Offset(1, 0).Value = Me.txtlong.Text
Sheets("stock").Range("D65536").End(xlUp).Offset(1, 0).Value = Me.txtquant.Text
Sheets("stock").Range("E65536").End(xlUp).Offset(1, 0).Value = Me.txttraitement.Text
Exit Sub
End If

'**************** Vérification et mise à jour stock ****************
For i = 5 To 1000

If Cells(i, 1).Value = aentree And Cells(i, 2).Value = bentree And Cells(i, 3).Value = centree Then

Cells(i, 4).Value = Cells(i, 4).Value + Val(txtquant.Value)
MsgBox "Stock " & aentree & " " & bentree & " " & centree & " Mis à Jour"
frmMouvement.Hide
End If
Exit Sub
Next i


Unload Me
End Sub
0
Utilisateur anonyme
20 avril 2009 à 11:23
Pour la mise à jour du stock tu pourrais en profiter pour créer un profil qui n'existe pas

For i = 5 To 1000

if Cells(i,1)="" then
Cells(i, 1).Value = aentree
Cells(i, 2).Value = bentree
Cells(i, 3).Value = centree
Cells(i, 4).Value = Val(txtquant.Value)

exit sub
end if


If Cells(i, 1).Value = aentree And Cells(i, 2).Value = bentree And Cells(i, 3).Value = centree Then

Cells(i, 4).Value = Cells(i, 4).Value + Val(txtquant.Value)
MsgBox "Stock " & aentree & " " & bentree & " " & centree & " Mis à Jour"
frmMouvement.Hide
End If
Exit Sub
Next i
0
Oui c'est ce que j'ai fait mais dans la partie supérieur du code lorsqu'il cherche

S'il ne trouve pas une information sur les 3 ( profil, dimensions, longueur ) il rajoute une ligne entière;

par contre dans mon code je prend pas en compte le traitement.
La plupart du temps il n'y a rien mais lorsqu'il y quelques choses il faut que mes calcul s'effectue sur celui dont il y a un traitement ( si bien sur j'ai demandé de soustraire un profil traité de mon stock )

SInon j'ai regarder pour la liste je n'y arrive pas.

Je te renvois mon nouveau fichier un peu plus joli ^^

https://www.cjoint.com/?ewbEAqJ18o
0
Utilisateur anonyme
20 avril 2009 à 11:56
Ah oui! la présentation est nettement mieux!

Pour ta list (combobox) tu veux en faire quoi, la mettre où?
0
en fait je veux remplacer ma zone d'écriture profil par la liste des profil ( HEA, HEB, IPE, IPN, UPN, UAP, UPAF, TUBE, Corniere, ROND, CARRE )
0
En complétant un peu mon tableau j'ai remarqué qu'il y avait un beug:

En gros admettons que j'ai déjà rentré les cas suivant

PROFIL DIM PROFIL LONGUEUR
IPE 350 12000
HEA 100 6000
IPE 220 10000

et que je rentre un nouveau profil inexistant dans la liste : HEA 220 de 12000mm

hé bien il ne le rajoute pas puisque lorsqu'il cherche il trouve déjà le "HEA" sur une autre ligne le"220" et on trouve aussi sur une autre ligne le "12000"
Il ne crée ni de nouvelle ligne puisqu'il a trouvé toute les informations mais ne met pas non plus à jours le calcul en additionnant les quantité puisque qu'il faut que tout soit sur une même ligne!!!

Comment faire
0
J'ai réussi à résoudre ce problème j'ai juste rajouter une condition s'il ne trouvait pas la condition pour additionner!!

il ne reste plus qu'a savoir pour les listes déroulantes ensuite je vais le donner en application dans l'atelier et si j'ai des problèmes je te referrais signe

Merci en tout cas
0