Microsoft 365 Variable qui perd sa valeur dans une procédure

bioteau

XLDnaute Nouveau
Bonjour à tous,
Dans une macro, j'ai une variable qui doit perdre sa valeur. Je ne comprends pas.
Voici la macro en question
les variable "Fournisseur", "PA" et "PV" sont définies en amont en VARIANT
la variable "Lig" est définie en amont en LONG

La variable "Fournisseur" issue du premier InputBox se recopie bien sur la colonne A de la ligne par contre rien ne se passe pour les variables PA et PV.
Si je remplace la variable "Lig" par un numéro de ligne précis, la valeur issue des InputBox s'affiche.....

Avez-vous une idée ?

VB:
Sub worksheet_change(ByVal target As Range) 'Demande automatiquement le nom du fournisseur si
                                            'la valeur entrée dans la colonne A est "AUTRE"
  
    
    For Lig = 3 To 100
  
    If Not Intersect(target, Range("F" & Lig & ":" & "F" & Lig)) Is Nothing Then
        If Range("A" & Lig) = "AUTRE" Then
            Fournisseur = InputBox("Saisie du Nom du fournisseur : ", "Fournisseur")
            Range("A" & Lig) = UCase$(Fournisseur)
            PA = InputBox("Prix d'achat : ", "Prix d'achat")
            Range("H" & Lig).Value = PA
            PV = InputBox("Prix de vente : ", "Prix de vente")
            Range("I" & Lig).Value = PV
        End If
    End If
  
    Next
End Sub
 
Solution
re
tiens je te donne même la possibilité d'annuler des l'input fournisseur
VB:
Dim boul As Boolean
Sub worksheet_change(ByVal target As Range)    'Demande automatiquement le nom du fournisseur si
'la valeur entrée dans la colonne A est "AUTRE"
    Dim R&, PV, PA
    If boul Then boul = False: Exit Sub
    If Not Intersect(target, Range("F3:F100")) Is Nothing Then
        If Range("A" & target.Row) = "AUTRE" Then
            R = target.Row
            fournisseur = InputBox("Saisie du Nom du fournisseur : ", "Fournisseur")
            If StrPtr(fournisseur) = 0 Then MsgBox "annulation": With Application: .EnableEvents = False: .Undo: boul = True: .EnableEvents = True: End With: Exit Sub
            Range("A" & R) = UCase$(fournisseur)...

patricktoulon

XLDnaute Barbatruc
bonjour
perso je suis perplexe
je ne suis pas sur que tu ai compris ce que tu faisais
qu'elle est ton intention avec ceci
VB:
Sub worksheet_change(ByVal target As Range) 'Demande automatiquement le nom du fournisseur si
                                            'la valeur entrée dans la colonne A est "AUTRE"
 
   
    For Lig = 3 To 100
 
    If Not Intersect(target, Range("F" & Lig & ":" & "F" & Lig)) Is Nothing Then
        If Range("A" & Lig) = "AUTRE" Then
serais tu capable de m'expliquer pour quoi tu boucle de 3 jusqu'à 100

réfléchi bien

de ce que je crois comprendre:
le intersect min/maxi est est de la ligne 3 à 100 en colonne "F"
si une cellule change dans cette colonne tu lance les input pour remplir la "A" ,"H","I" de la même ligne

est ce bien ça ?
 

patricktoulon

XLDnaute Barbatruc
re
tiens je te donne même la possibilité d'annuler des l'input fournisseur
VB:
Dim boul As Boolean
Sub worksheet_change(ByVal target As Range)    'Demande automatiquement le nom du fournisseur si
'la valeur entrée dans la colonne A est "AUTRE"
    Dim R&, PV, PA
    If boul Then boul = False: Exit Sub
    If Not Intersect(target, Range("F3:F100")) Is Nothing Then
        If Range("A" & target.Row) = "AUTRE" Then
            R = target.Row
            fournisseur = InputBox("Saisie du Nom du fournisseur : ", "Fournisseur")
            If StrPtr(fournisseur) = 0 Then MsgBox "annulation": With Application: .EnableEvents = False: .Undo: boul = True: .EnableEvents = True: End With: Exit Sub
            Range("A" & R) = UCase$(fournisseur)
            PA = InputBox("Prix d'achat : ", "Prix d'achat")
            Range("H" & R).Value = PA
            PV = InputBox("Prix de vente : ", "Prix de vente")
            Range("I" & R).Value = PV
        End If
    End If
End Sub
et tu peux même faire pour les deux autres input moyennant la mémorisation des données ou faire deux undo au 2d input et 3 undo au 3eme input comme tu veux ;)
là je te l'ai fait pour le 1er input

a+
 

bioteau

XLDnaute Nouveau
Oups, j'ai parlé un peu trop vite... J'ai un problème d'erreur sur la ligne :
If Not Intersect(target, Range("F3:F100")) Is Nothing Then
Je fais appel à une saisie semi-auto sur liste déroulante lorsque je choisis un nom de fournisseur (Colonne A) et un nom de client (colonne B).
L'erreur se produit immédiatement à l'ouverture de la liste déroulante après avoir tapé la première lettre. Pourtant je n'ai pas encore été jusqu'à la colonne F qui doit déclencher la macro.
Avez-vous une idée ?
 

patricktoulon

XLDnaute Barbatruc
re
Je fais appel à une saisie semi-auto sur liste déroulante lorsque je choisis un nom de fournisseur (Colonne A) et un nom de client (colonne B).
tu m'expliquera alors pourquoi un interface avec un textbox pour le fournisseur

d'autant plus que je ne pige pourquoi tu déclenche quelque chose sachant que mon code s’exécute uniquement dans la colonne "F"
au pire ta liste déroulante met la dans le userform on supprime même le input si tu veux
bref c'est bien confu tout ca pour moins de 15 lignes de code
peut être un fichier exemple serait le bien venu afin que je n'ai pas a tout me taper pour avancer le schmilblick
 

Valtrase

XLDnaute Occasionnel
Salut,
C'est clair pourquoi faire simple quand on peut faire compliqué.
@patricktoulon tu utilises une variable publique au niveau module
VB:
Dim boul As Boolean
ne serait-il pas plus judicieux de la passer en Static (code plus clair) ou bien tout simplement de stopper les évènements Excel pour éviter de reboucler. 🤔
 

patricktoulon

XLDnaute Barbatruc
re
bonjour @Valtrase
déjà la variable n'est pas public mais globale module c'est pas la même chose
et ce serait la même chose donc aucun intérêt et les events sont déjà déconnecte
en quoi le code serait plus clair dis moi ?
la charge mémoire reste la même puisque static ou globale module la variable est toujours en mémoire false ou true
réfléchissez avant d'intervenir ;) et révisez les bases des variable le type et contexte

cordialement
 

Valtrase

XLDnaute Occasionnel
Re
Désolé pour le Public j'ai péché effectivement, mais j'ai spécifié au niveau module. 🙄
Pourquoi plus simple et tu constateras que je n'ai pas parlé de charge mémoire ou quoi que ce soit, donc plus simple pour moi,car si ton code comprends beaucoup de Sub et Function on n'est pas obligé de remonter en tête de module pour voir à quoi correspond Boul. Mais encore une fois c'est ma manière de penser et pas une critique en quoi que ce soit.
j'espère que tu n'a pas pris le : C'est clair pourquoi faire simple quand on peut faire compliqué. pour toi ce n'était pas le cas, je parlais bien du code de @bioteau.
 

bioteau

XLDnaute Nouveau
Je viens de modifier mon fichier pour vous envoyer que la partie qui bloque.
Je précise mais vous l'avez certainement remarqué que je suis débutant en VBA. La construction de mon projet n'est pas forcément la plus vertueuse mais j'essaye de partir d'un point A pour arriver au Point B.
Voici le un classeur "TEST" qui comprend une feuille bdd sur laquelle je fais mes saisies et une feuille Données Fsseur qui me sert de regroupement des différentes données utiles à mon projet (attention les données non utiles pour cette partie ont été supprimées).
 

Pièces jointes

  • TEST.xlsm
    110.3 KB · Affichages: 5

bioteau

XLDnaute Nouveau
???? :rolleyes:
Effectivement pas de soucis, j'ai redémarré Excel et plus de problème.
Vraiment désolé du dérangement. La prochaine fois (il y en aura certainement une) je ferai le redémarrage avant de vous solliciter pour rien.
Merci pour votre temps et votre patience ;)
 

Discussions similaires

Réponses
7
Affichages
163

Statistiques des forums

Discussions
311 730
Messages
2 081 991
Membres
101 856
dernier inscrit
Marina40