Besoin d'aide en VB

Gwec -  
 Gwec -
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
Configuration: Windows Vista
Firefox 2.0.0.20

11 réponses

  1. Utilisateur anonyme
     
    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
    1. Gwec
       
      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
  2. Utilisateur anonyme
     
    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
  3. Utilisateur anonyme
     
    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
    1. Gwec
       
      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
      1. Gwec > Gwec
         
        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
  4. Utilisateur anonyme
     
    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
    1. Gwec
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    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
    1. Gwec
       
      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
  7. Gwec
     
    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
  8. Gwec
     
    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
  9. Utilisateur anonyme
     
    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
    1. Gwec
       
      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
  10. Utilisateur anonyme
     
    Ah oui! la présentation est nettement mieux!

    Pour ta list (combobox) tu veux en faire quoi, la mettre où?
    0
    1. Gwec
       
      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
      1. Gwec > Gwec
         
        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
  11. Gwec
     
    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