Problème dans écriture de macro

mathieu.cxp

XLDnaute Nouveau
Bonjour à tous.

Je suis en train d'écrire une macro pour mon fichier de suivit d'offres, et je rencontre un soucis dans son écriture. J'ai fouiné sur le net, mais j'ai pas trouvé où se situe mon erreur. J'ai cherché sur le forum, idem :-/

Je pense qu'il s'agit d'une erreur d'inatention, ou de quelque chose de basic, mais je coince, et quand ça veut pas... ça veut pas.

Je vous explique, c'est somme toute assez simple :
J'ai des données enregistrée en ligne (et pas en colones...), qui comportent la date de l'offre, le pays, le client, l'application...etc.
J'ai donc fait un formulaire de saisie, avec des textbox, et des listes déroulantes.

Lorsque je clique sur le bouton valider, il bloque à la première ligne, et je vois vraiment pas pourquoi ???

Code:
Private Sub VALIDQUOTE_Click()
APPLICATION.ScreenUpdating = True

'on sélectionne la feuille de suivit des commandes
Sheets("OFFRES").Select
'on repère quelle est la dernière ligne vide, et on s'y place
derligne = Sheets("OFFRES").Range("A65000").End(xlUp).Row + 1

'on met les valeurs des textbox dans les cellules correspondantes
Range("A" & derligne).Value = QUOTE_NUMBER.Value
Range("c" & derligne).Value = DTPicker2.Value
Range("e" & derligne).Value = COUNTRY.Value
Range("g" & derligne).Value = CUSTOMER.Value
Range("h" & derligne).Value = APPLICATION.Value
Range("i" & derligne).Value = FAMILLE.Value
Range("j" & derligne).Value = P_TYPE.Value
Range("k" & derligne).Value = DESCRIPTION.Value
Range("l" & derligne).Value = CODE.Value
Range("m" & derligne).Value = QUANTITE.Value
Range("p" & derligne).Value = ICP_PRICE.Value
Range("q" & derligne).Value = CUSTOMER_PRICE.Value

QUOTE_NUMBER.Value = ""
COUNTRY.Value = ""
CUSTOMER.Value = ""
APPLICATION.Value = ""
FAMILLE.Value = ""
P_TYPE.Value = ""
DESCRIPTION.Value = ""
CODE.Value = ""
QUANTITE.Value = ""
ICP_PRICE.Value = ""
CUSTOMER_PRICE.Value = ""
        
APPLICATION.ScreenUpdating = True
Sheets("OFFRES").Select
VALID_QUOTE.Caption.Value = True
NEW_QUOTE.Hide
End Sub

Private Sub CANCELQUOTE_Click()
NEW_QUOTE.Hide
End Sub
Private Sub Userform_QueryClose(Cancel As Integer, CloseMode As Integer)
      If CloseMode = vbFormControlMenu Then Cancel = True
End Sub

Je vous joint le fichier excel, complètement épuré pour que vous soyez pas perturbés par des données à coté. Si je pige le principe, je pourrais me débrouiller pour faire la suite :yes:

Question complémentaire :
Dans la première colonne (ou une autre d'ailleurs, peut importe...), je voudrais mettre un numéro d'offre automatique :
Année / Abréviation Pays / abréviation Utilisateur / numéro incrémenté

Est-ce que vous pourriez m'expliquer comment faire celà ?

Pour lancer la macro : double clic dans une des case de la colonne A :)
 

Pièces jointes

  • exemple mathieu.zip
    24.2 KB · Affichages: 30
  • exemple mathieu.zip
    24.2 KB · Affichages: 31
  • exemple mathieu.zip
    24.2 KB · Affichages: 33
G

Guest

Guest
Re : Problème dans écriture de macro

Re Mathieu,

Petit conseil:

Ajouter un CommandBouton sur le UserFrom avec propriété caption ="Enregistrer modifications" par exemple.

Et Sur son évènement Click() tu renseignes tous les changements dans ta feuille, d'un seul coup plutôt qu'au coup par coup.

Ex:
Sub CommandButtonN_Click() 'N est le numero du bouton
Dim DerLigne as Long
With sheets("OFFRES")
DerLigne=..... 'Calcul de la dernière ligne
Range("A" & Derligne)= LeControl.value
Range("B" & Derligne)= AutreControl.Value
Etc....
........
End With
End sub

Ce qui te donnera un code plus clair et plus facile à debugger en cas de problème.
De plus tu peux rajouter tous les tests nécessaires à la validation des données de la fiche.

A bientôt

End Sub
 

mathieu.cxp

XLDnaute Nouveau
Re : Problème dans écriture de macro

je comprend pour ce qui est de faire un code plus propre, par contre, je vois pas pourquoi tu me dis "faire des changement au coup par coup" ???

En fait, une offre est enregistré à un instant T
Si je dois la modifier, ce sera plusieurs jours / semaines /mois plus tard (pour rajouter un paramètre par exemple :yes:)
Donc je comprends pas l'utilité ??? :??:

Je pense faire un second formulaire pour les ofres qui seront gagnées :)
 
G

Guest

Guest
Re : Problème dans écriture de macro

Mathieu,

Dans ton code (pour ce que tu m'a donné à voir), un control change et tout suite, tu enregistre le changement dans la cellule correspondante. (C'est ce que j'appelait au coup par coup).

Ce que je suggère, c'est d'enregistrer les changements de ta fiche(userform), en une seule fois, lorsque celle-ci est complétement renseignée et ou modifiée. C'est pour cela que je proposais de créer un bouton spécial.

En tous cas, je veux souligner, parce que c'est de plus en plus rare, la qualité de ton travail et de ta recherche. Tu cherches, essaies, testes, te trompes, recommences, et tu poses des questions précises et concètes, sans exiger une réponse absolue; tout ça sans t' énerver et en restant courtois. Chapeau, il n' y a que comme cela qu'on apprend.

A+
 
Dernière modification par un modérateur:

mathieu.cxp

XLDnaute Nouveau
Re : Problème dans écriture de macro

oui oui, je suis beau je suis fort, tu peux le redire :D

Merci en tout cas.
Je fait partie d'un forum moi aussi (mais rien à voir avec excel :) ) et je supporte pas les gens qui attendent du tout cuit dans les mains, on est plus des gamins.
Si j'essaye pas par moi-même, comment veux-tu que j'apprène à le faire tout seul :)

Merci en tout cas pour tes précieux conseils :)

Je bute sur un truc là, si je trouve pas, je repasserai demander sur ce même topic :)

Pour ton explication .... haaaaa
Tout faire à la fin, lors de la validation en fait ?
Est-ce que par la même occasion, ce serait pas aussi bien de fair eles chose avec des sous-fonction ? genre j'appelle une fonction que je vais réutiliser plus tard (ce qui m'éviterai d'avoir à les faire 3 fois de suite :) )
 
G

Guest

Guest
Re : Problème dans écriture de macro

Mathieu,

Est-ce que par la même occasion, ce serait pas aussi bien de fair eles chose avec des sous-fonction ? genre j'appelle une fonction que je vais réutiliser plus tard (ce qui m'éviterai d'avoir à les faire 3 fois de suite :) )

tu trouves tout seul en plus, à quoi va-t-on servir??????????????:D

A+++
 

mathieu.cxp

XLDnaute Nouveau
Re : Problème dans écriture de macro

arf...
Je bloque ! ! !

J'ai tenté de trouver comment mettre la date uniquement année...
Mais rien à faire !
J'ai testé :
Code:
tbDATE = Date (année) 
tbDATE = Date (annee)
tbDATE = Date (annee:"":"")
tbDATE = Date (annee;;)

Mais à chaque fois ça plante, il me dis
Code:
:)
attendu... ???

Je vois vraiment pas comment faire ça.
En fait, je voudrais récupérer l'année uniquement, sous le format 08 ou 09 ... (pour 2008 et 2009)

Pour ta question de "à quoi va-t-on te servir" : à me dire comment faire pour faire appel à une fonction externe, et si il faut la déclarer de façon différente.
Je me souvient de mes cours de C++ ou il fallait pas les appeller de la même façon (de mémoire hein ! )
Idem pour les variable, est-ce qu'il vaut mieux les déclarrer en locales ou en globales ?
 
Dernière édition:
G

Guest

Guest
Re : Problème dans écriture de macro

Re,

Pour l'année tu as la fonction VB YEAR(Date) ex: year("12/12/2008")

Pour les fonctions et procédures.

1 - Les fonctions retournent une valeur, les procédures non

2 - Public ou privée? Si tu ne les utilise que dans ton UserForm tu peux les écrire dans le module de code du UserForm en privée. Si tu les utilise ailleurs tu peux les écrire dans un module de code normal (Dans VBE Insertion/Module) en Public

3 - Les appels
A -Pour les fonctions (Privées et ou publiques) le resultat doit être retourné dans une variable ou par exemple avec un test
Supposons la fonction suivante:

Private Function FicheOk() as Boolean
FicheOk=TextBox1<>"" and TextBox2<>""
End Function

CommandButtonN_Click()
If FicheOk() then
'..........Enregistrement fiche
Else
Msgbox "ça va pas Non! vous faites à rien que des bêtises"
Exit sub
End if
end Sub

B - Pour les procédures il suffit de les appeler par leur nom:
MaProcédure
Ou
Call MaProcédure() 'Avec Call les parenthèses sont obligatoires
Call Module1.MaProcedure() 'Procédure publique dans Module1

Si tu as des paramètres
MaProcédure Paramètre1, paramètre2
Ou
Call MaProcédure(Paramètre1,Paramètre2)
etc..

Voili.
 
Dernière modification par un modérateur:

mathieu.cxp

XLDnaute Nouveau
Re : Problème dans écriture de macro

ok ça marche, je vois bien comment faire.

Dernière dernière chose ( je pense...)

J'ai une chaine de caractère, dont je voudrais récupérer les 2 dernier chiffres.

Est-ce que la fonction
Code:
Range("m" & derligne).Value=CNUM(STXT(Range("A" & derligne));3;3))
peut fonctionner ???

En fait, c'est le numéro d'offre, que je construit en live à chaque fois. Je voudrais qu'en fonction du numéro d'offre précédent, il puisse me calculer le suivant. (ou alors, stocker cette valeur en dur quelque part, mais je pense qu'à la fermeture ouverture du fichier, cette valeur sera perdue :desole:
 
G

Guest

Guest
Re : Problème dans écriture de macro

Re,

Range("m" & derligne).Value=CNUM(STXT(Range("A" & derligne));3;3))

Range("m" & derligne).Value=Val(Right(Range("m" & derligne).offset(-1),2))+1

Range("m" & derligne).offset(-1) décale la dernière cellule de colonne M d'une cellule au dessus

Mais, cela reste fragile. Car si tes lignes ne sont pas ordonnées par ordre croissant sur la colonne "m" -> Problème. Et le tri sur des chaines de caractères n'est pas le même que sur les numériques.

Je ne saurais que trop te conseiller de rajouter une feuille nommée 'Variables' (ou autre), que tu caches et dans laquelle par exemple en A1 tu sauvegardes le dernier numérique créé. auquel tu pourras te référer au besoin.

Tu peux également créer une colonne 'NUM' à côté de tes données qui te servira à calculer ta prochaine référence et à trier ton tableau.

Dans ce cas ta ligne de code serait:

ProchainNum= Application.MAX(Range("A:A"))+1 'si ta colonne NUM est A
Range("m" & derligne).Value=Machaine & format(ProchainNum,"00")


A plus
 
Dernière modification par un modérateur:

mathieu.cxp

XLDnaute Nouveau
Re : Problème dans écriture de macro

super, je vais tester tout ça ! :)

ça me conviens parfaitement, ça a l'air de fonctionner :)

De toute fçaon, tous les paramètres sont stockés sur une feuille indépendante :)

Dernière chose et pour moi ce sera fini :
J'ai testé pour mettre la date avec la fonction que tu m'a donnée : year(now) mais la date est au format 2008 au lieu de 08...
Faut-il déclarer le format au préalable, en même temps ou par la suite ???
J'ai essayé de faire year.format ("yy") mais ça n'a pas l'air de fonctionner.
L'aide de VB n'est pas très bien faite là dessus :-/

Merci encore pour ton aide.
 

mathieu.cxp

XLDnaute Nouveau
Re : Problème dans écriture de macro

Grrrrr.....

Où peut-on trouver la syntaxe pour formater les chiffre des la façon que l'on souhaite ?

Je voudrais faire un nombre avec 4 chiffres significatifs...
Code:
Sheets("PARAMETERS").Select
ProchainNum = Format(APPLICATION.Max(Range("B27")) + 1, [#### 0000])

J'ai testé [####] ; #### ; '####' ; etc... mais vraiment pas trouvé, et pas nom plus sur le net ??? (google n'a pas été mon ami cette fois-ci :-/ )

Du genre 0002 au lieu de 02 ou 2
 
G

Guest

Guest
Re : Problème dans écriture de macro

Mathieu,

Je me souviens avoir également tâtonner, parfois c'est énervant surtout lorsque l'aide en ligne est incompréhensible.

Pour le formatage en VBA faire beaucoup plus simple que dans les feuille de calcul.

1 - Inutile de sélectionner la feuille Paramètres VBA sait aller chercher au bon endroit les valeurs pour peu qu'on lui indique des feuilles existantes.

2 - Si ton dernier numéro est toujours dans B27 de la feuille "PARMETERS" tu n'as pas besoin de Application.MAX (qui est l'équivalent de la fonction Max de feuille de calcul)

ProchainNum = Format(Sheets("PARAMETERS").Range("B27")) + 1, "#### 0000")

Les codes de formatage VBA doivent être entourés de guillemets.

Tu as besoin de application.Max que si tu gardes tous les numéros dans une colonne. Mais cela me semble inutile. Gardes uniquement le dernier validé.

A+
 

mathieu.cxp

XLDnaute Nouveau
Re : Problème dans écriture de macro

J'avais essayé avec les guillemets, désolé de ne pas l'avoir précisé, ça t'aurrait évité une perte de temps.
J'ai pas retenu, car avec les guillemets, j'obtient une erreur...
J'ai fait un copier-coler de ta ligne, et j'ai : "erreur de compilation . Attendu : fin d'instruction)...
Et j'avoue que je ne sais pas pourquoi ???

En attendant ta "réponse magique" :) je continu ma macro, qui avance à petit pas :)
 

Statistiques des forums

Discussions
312 304
Messages
2 087 059
Membres
103 445
dernier inscrit
LOLKFR