aide sur correction VBA

plecrivain

XLDnaute Nouveau
Bonjour,

je suis novice en la matière et malgré avoir lu tout une full d'exemple, je ne m'en sort pas et je souhaiterais que vous puissiez me dire ce qui ne va pas dans mon code.
d'abord, j'utilise excel 2007.

Ensuite, j'ai créé un formulaire afin que mes gars puisse remplir leur feuilles d'heures via un formulaire de ma fabrication.

voici le code:

Private Sub Cmdajouter_Click()
Dim numLigneVide As Integer
'on active la feuille tableau de relevé d'heures'
Worksheets("Tableau heures").Activate
'on trouve la derniere ligne du tableau et on enregistre la variable Numlignevide'
numLigneVide = ActiveSheet.Columns(1).Find("").Row

'on verifie que les champs obligatoires sont bien remplis'
If Txtnom = "" Then
MsgBox "veuillez indiquer votre Nom", vbCritical, "La ligne est vide!"
TextNom.SetFocus
ElseIf txtDate = "" Then
MsgBox "Veuillez la date du jour", vbCritical, "Champs manquant"
txtDate.SetFocus
ElseIf txtNumdaffaire = "" Then
MsgBox "Veuillez indiquer le N° d'affaire", vbCritical, "Champs manquant"
txtNumdaffaire.SetFocus
ElseIf txtNbrdheurenormale = "" Then
MsgBox "Veuillez le nombre d'heures normales travaillées", vbCritical, "Champs manquant"
txtNbrdheurenormale.SetFocus
ElseIf txtNbrdheuresup = "" Then
MsgBox "Veuillez indiquer le nombre d'heures supplémentaires", vbCritical, "Champs manquant"
txtNbrdheuresup.SetFocus
Else

'on remplit les données du tableau'
ActiveSheet.Cells(numLigneVide, 1) = Txtnom.txt
ActiveSheet.Cells(numLigneVide, 2) = txtDate.txt
ActiveSheet.Cells(numLigneVide, 3) = txtNumdaffaire.txt
ActiveSheet.Cells(numLigneVide, 4) = txtNbrdheurenormale.txt
ActiveSheet.Cells(numLigneVide, 5) = txtNbrdheuresup.txt
ActiveSheet.Cells(numLigneVide, 6) = txtNbrdheurevoyage.txt
ActiveSheet.Cells(numLigneVide, 7) = txtNbrpanier.txt

'on efface le formulaire et on replace le curseur sur le premier champ (nom'
Txtnom.txt = ""
txtDate.txt = ""
txtNumdaffaire.txt = ""
txtNbrdheurenormale.txt = ""
txtNbrdheuresup.txt = ""
txtNbrdheurevoyage.txt = ""
txtNbrpanier.txt = ""
Txtnom.SetFocus
'ComboBoxunite.Text = ""
'workbooks(fichier).close.




End If

End Sub


D'abord, excel ne "voit" jamais lorsque j'écris des lettres dans un champ du formulaire. j'ai toujours le message "remplir le champ" ou qq chose comme ca...
ensuite à la validation, rien ne s'écrit dans le tableau.
Ne pas tenir compte des 2 dernières lignes, c'est simplement un memo pour moi car je devrais intégrer des liste déroulantes dans le formulaire quant cette affaire sera réglée :)

j'ai pourtant suivi scrupuleusement divers post mais rien n'y fait.

Que se passe t-il?

merci de votre aide
 

Pièces jointes

  • heures.zip
    43.6 KB · Affichages: 34
  • heures.zip
    43.6 KB · Affichages: 32
  • heures.zip
    43.6 KB · Affichages: 32
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : aide sur correction VBA

Bonjour plecrivain, bonjour le forum,

C'est normal tes contrôles ont tous un nom différent que celui que tu utilises dans le code...
Txtnom n'existe pas, il s'appelle : TextNom
txtDate n'existe pas, il s'appelle : TextDate
etc...
Un conseil, pour récupérer le nom d'un contrôle sans avoir à le taper, tu tapes : me.
une liste déroulante apparait et si tu tapes juste la première lettre du contrôle tu le vois dans la liste, tu sélectionnes le bon et valides avec [Tab]. Ça t'évitera ce genre de confusion...
 

plecrivain

XLDnaute Nouveau
Re : aide sur correction VBA

Bonjour plecrivain, bonjour le forum,

C'est normal tes contrôles ont tous un nom différent que celui que tu utilises dans le code...
Txtnom n'existe pas, il s'appelle : TextNom
txtDate n'existe pas, il s'appelle : TextDate
etc...
Un conseil, pour récupérer le nom d'un contrôle sans avoir à le taper, tu tapes : me.
une liste déroulante apparait et si tu tapes juste la première lettre du contrôle tu le vois dans la liste, tu sélectionnes le bon et valides avec [Tab]. Ça t'évitera ce genre de confusion...

Bonjour et merci de cette réponse aussi rapide.

Un seul mot, je suis un âne. A force de chercher, on passe a côté de telles erreurs!
j'ai fait les tests avec toutes les motifs nécessaire et tout est OK maintenant.

Mille merci!!!!!

je vais m'attaquer à intégrer dans le formulaire des listes déroulantes préalablement préparées afin que mes techniciens utilisent le clavier le moins possible.

A bientôt je pense.
 

plecrivain

XLDnaute Nouveau
Re : aide sur correction VBA

c'est encore moi et j'ai bien avancé sur le projet, j'ai repris la pêche.....

Juste une chose me manque dans mon formulaire, dans le champ "date", j'aurais souhaité que lors de l'appel du formulaire, la date du jour se mette par défaut formaté comme ceci: 29/10/2010 (par exemple).

Il faut que l'utilisateur puisse la changer si il a besoin mais il faudra qu'il tape la date au même format ou alors que ce soit mon format de référence qui apparaisse.

J'ai vraiment du mal a trouver le code qui va bien. Vous n'auriez pas ca dans vos cartons des fois?

merci d'avance.

ici le fichier revue et corrigé depuis la derniere modif:

zSHARE - heures.zip

48K comme taille max de fichier attaché est vraiment court!...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : aide sur correction VBA

Bonjour plecrivain, bonjour le forum,

Une proposition en pièce jointe avec tout le code commenté :
 

Pièces jointes

  • heures.xlsm
    81.3 KB · Affichages: 82
  • heures.xlsm
    81.3 KB · Affichages: 88
  • heures.xlsm
    81.3 KB · Affichages: 88

plecrivain

XLDnaute Nouveau
Re : aide sur correction VBA

Mille merci Robert, je n'en demandais pas tant, tu as fait un travail extraordinaire et vraiment pro. Cela m'a fait gagner pas mal de temps.

Un petit bug cependant, au niveau de la date, par exemple la date d'aujourd'hui, elle est bien indiquée 01/11/2010 dans le formulaire mais lors du transfert depuis le formulaire vers le tableau, elle se transforme en 11/01/2010.

j'ai vérifié les codes dans VBA mais tt parait correct. J'ai vérifié que j'étais bien en "fr" niveau formatage des dates dans les cellules du tableau final, tt est OK!

Qu'en penses-tu?

Merci

Cordialement
 

plecrivain

XLDnaute Nouveau
Re : aide sur correction VBA

Bonjour Pierrot,

j'ai verifié et c'est déja Cdate.

Voilà le VBA au cas ou. Merci d'avance.

Private dl As Integer 'déclare la variable dl (Dernière Ligne)
Private nl As Long 'déclare la variable nl (Nombre de Lignes)

Private Sub ComboBox6_Change()

End Sub

Private Sub UserForm_Initialize() 'à l'Initialisation de l'UserForm
Dim x As Long 'déclare la variable x (incrément de ligne)
Dim y As Byte 'déclare la variable y (incrément de ComboBox)

dl = Range("A65536").End(xlUp).Row + 1 'définit la dernière ligne
nl = Application.Rows.Count 'définit le nombre de lignes

With Sheets("numaffaire") 'prend en compte l'onglet "numaffaire"
For x = 1 To .Cells(nl, 1).End(xlUp).Row 'boucle sur toutes les lignes éditées de la colonne A
'si la cellule n'est pas vide, rajoute la valeur de la cellule à la ComboBox2 (N° d'affaire)
If .Cells(x, 1).Value <> "" Then Me.ComboBox2.AddItem .Cells(x, 1).Value
Next x 'prochaine ligne de la boucle
End With 'fin de la prise en compte de l'onglet "numaffaire"

With Sheets("Listes") 'prend en compte l'onglet "Listes"
Me.ComboBox1.List = .Range("A2:A" & .Cells(nl, 1).End(xlUp).Row).Value 'alimente la ComboBox1 (Nom du technicien)
For y = 3 To 5 'boucle sur les 3 comboboxes (Nbre d'heures normales, sup. et voyage)
Me.Controls("ComboBox" & y).List = .Range("B2:B" & .Cells(nl, 2).End(xlUp).Row).Value 'alimente la combobox
Next y 'prochaine ComboBox de la boucle
Me.ComboBox6.List = .Range("C2:C3").Value 'alimente la ComboBox6 (Nomnbre de panier)
End With

Me.TextBox1.Value = Format(Date, "dd/mm/yyyy") 'place la date du jour dans la TextBox1
End Sub

Private Sub ComboBox1_Click() 'au click dans la ComboBox1 (Nom du technicien)
Me.TextBox1.SetFocus 'place le curseur dans la TextBox1 (Date)
'sélectionne la date
Me.TextBox1.SelStart = 0 'début de la sélection
Me.TextBox1.SelLength = Len(Me.TextBox1.Value) 'longueur de la sélection
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'à la sortie de la TextBox1 (Date)
On Error Resume Next 'gestion des erreurs : en cas d'erreur va à la lige suivante
TextBox1.Value = Format(CDate(TextBox1.Value), "dd/mm/yyyy") 'réécrit la date au format imposé
If Err > 0 Then 'condition : si il y a une erreur
Cancel = True 'empêche la sortie de la TextBox1
'sélectionne la date
Me.TextBox1.SelStart = 0 'début de la sélection
Me.TextBox1.SelLength = Len(Me.TextBox1.Value) 'longueur de la sélection
MsgBox "Date non valide ! Vous devez éditer une date au format jj/mm/aaa." 'message
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
End Sub

Private Sub CommandButton2_Click() 'bouton "Valider

Dim ctr As Control 'déclare la variable ctr (ConTRôle)
Dim os As Byte 'déclare la variable os (OffSet)

'****************************************
'obligation de renseigner tous les champs
'****************************************
For Each ctr In Me.Controls 'bouce sur tous les contrôles de l'UserForm
'condition 1 : si le contrôle est une ComboBox ou une TextBox
If TypeOf ctr Is MSForms.ComboBox Or TypeOf ctr Is MSForms.TextBox Then
If ctr.Value = "" Then 'condition 2 : si le controle est vide
ctr.SetFocus 'place le curseur dans le controle
MsgBox "Vous devez renseigner toutes les lignes du formulaire sans exception !" 'message
Exit Sub 'sort de la procédure
End If 'fin de la condition 2
End If 'fin de la condition 1
Next ctr 'prochain contrôle de la boucle

'*********************
'Placement des données
'*********************
For Each ctr In Me.Controls 'bouce sur tous les contrôles de l'UserForm
'condition 1 : si le contrôle est une ComboBox ou une TextBox
If TypeOf ctr Is MSForms.ComboBox Or TypeOf ctr Is MSForms.TextBox Then
Cells(dl, 1).Offset(0, os).Value = ctr.Value 'place la valeur du controle dans la colonne 1 décalé de os colonnes
os = os + 1 'définit os
End If 'fin de la condition 1
Next ctr 'prochain contrôle de la boucle

'*********************************
'réouverture sur formulaire vierge
'*********************************

Unload Me 'vide et ferme l'Userform
UserForm1.Show 'affiche l'UserForm1
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : aide sur correction VBA

Bonjour le fil, bonjour le forum,

Je rencontre ce problème assez souvent. Chez moi ça marche car mon clavier est configuré USA International et langue Portugais (Brésil). Je pense avoir contourné le problème avec le code ci-dessous (les modifs sont en rouge) :
Code:
[COLOR=black]Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'à la sortie de la TextBox1 (Date)[/COLOR]
[COLOR=red]Dim j As Byte[/COLOR]
[COLOR=red]Dim m As Byte[/COLOR]
[COLOR=red]Dim a As Long[/COLOR]
 
[COLOR=red]j = Split(Me.TextBox1, "/", -1)(0) 'récupère les premiers caractères avant le prenier slash (Jour)[/COLOR]
[COLOR=red]m = Split(Me.TextBox1, "/", -1)(1) 'récupère les caractères entre les deux slashs (Mois)[/COLOR]
[COLOR=red]a = Split(Me.TextBox1, "/", -1)(2) 'récupère les caractères àprès le deuxième slash (Année)[/COLOR]
On Error Resume Next 'gestion des erreurs : en cas d'erreur va à la lige suivante
TextBox1.Value = Format(CDate([COLOR=red]j & "/" & m & "/" & a[/COLOR]), "dd/mm/yyyy") 'réécrit la date au format imposé
If Err > 0 Then 'condition : si il y a une erreur
    Cancel = True 'empêche la sortie de la TextBox18
    'sélectionne la date
    Me.TextBox1.SelStart = 0 'début de la sélection
    Me.TextBox1.SelLength = Len(Me.TextBox1.Value) 'longueur de la sélection
    MsgBox "Date non valide ! Vous devez éditer une date au format jj/mm/aaa." 'message
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
End Sub

Mais il faudra impérativement que la date soit enrtrée avec le slash / comme séparateur sinon le code va planter...
 

Pièces jointes

  • heures_v02.xlsm
    98 KB · Affichages: 60
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : aide sur correction VBA

Bonsoir le fil, bonsoir le forum,

Un version 3 ou la date est rentrée séparément dans 3 textboxes distinctes (jour, mois et année). Chez moi ça marche, à tester chez toi !
 

Pièces jointes

  • heures_v03.xlsm
    101.7 KB · Affichages: 58

kjin

XLDnaute Barbatruc
Re : aide sur correction VBA

Bonsoir, Adiou Robert :),
j'ai verifié et c'est déja Cdate.
Faut-il consulter l'ophtalmo ?
Comme te l'as suggérer Pierrot, remplacer
Code:
For Each ctr In Me.Controls
If TypeOf ctr Is MSForms.ComboBox Or TypeOf ctr Is MSForms.TextBox Then
Cells(dl, 1).Offset(0, os).Value = ctr.Value
os = os + 1
End If
Par
Code:
Cells(dl, 1) = ComboBox1
Cells(dl, 2) = [COLOR="Blue"]CDate(TextBox1)[/COLOR]
Cells(dl, 3) = ComboBox2
Cells(dl, 4) = ComboBox3
Cells(dl, 5) = ComboBox4
Cells(dl, 6) = ComboBox5
Cells(dl, 7) = ComboBox6
A+
kjin
 

Statistiques des forums

Discussions
312 206
Messages
2 086 222
Membres
103 158
dernier inscrit
laufin