Transfert donnees userform vers feuille Excel

Bonjour,

Je suis e train de me faire une application pour gérer la liste de clients et donc je me suis lancer depuis une semaine dans l'userform et vba d'excel, que de grand mot ! Etant novice en la matière, je demande votre concours afin de pouvoir résoudre mon probleme. A l'ouverture de l'userform (bouton "ajout_client" dans feuille "tableau de bord" ), je souhaite créer un nouveau client donc je remplie les combobox et textbox qui compose mon userform et je clique sur ajouter. Les donnees devrait etre copier dans la feuille nommé "base" et dans la première ligne vide qu'il trouve. J'ai ajouté dans le code, lorsque je renseigne les combobox si le nom ou autres données n'apparaissent pas dans une des listes de la feuille "Liste", un message me signale si je veux l'ajouter et le tri se fait automatiquement dans chacunes des listes. J'ai aussi la possibilité de faire des modifications des lignes de la feuille base mais je verrai après.

Pouvez-vous me corriger d'eventuels erreurs, s'il vous plait ?

Voici le code en faisant clique droit de mon userform et je selectionne code :

CODE :

Option Explicit

Dim Ligne As Integer

Dim Feuil As Worksheet

Set Feuil = Worksheets("Base" )

Ligne = Sheets("Feuil" ).[A65536].End(xlUp).Offset(1, 0).Row

Private Sub CmdAjouter_Click()

Me.ComboBox_nom = ""

Me.TextBox_pro = ""

Me.CheckBox_Achat = False

Me.ComboBox_annee = ""

Me.ComboBox_mois = ""

Me.TextBox_CA = ""

Me.ComboBox_connais = ""

Me.ComboBox_parrainage = ""

Me.ComboBox_ville = ""

Me.ComboBox_FAI = ""

Me.ComboBox_antivirus = ""

End Sub

Private Sub CmdAnnuler_Click()

Unload Me

End Sub

Private Sub CmdValider_Click()

Sheets("Base" ).Cells(Ligne, 2) = Application.Proper(Me!ComboBox_nom)

Sheets("Base" ).Cells(Ligne, 3) = Application.Proper(Me.TextBox_pro)

Sheets("Base" ).Cells(Ligne, 4) = Me.CheckBox_Achat 'OuiNon(Me.Achat)

Sheets("Base" ).Cells(Ligne, 5) = Me.ComboBox_annee

Sheets("Base" ).Cells(Ligne, 6) = Me.ComboBox_mois

Sheets("Base" ).Cells(Ligne, 7) = Me.TextBox_CA

If TextBox_CA.Text = "" Then

MsgBox "Le C.A. n'est pas indiqué"

Exit Sub

End If

Sheets("Base" ).Cells(Ligne, 8) = Application.Proper(Me.ComboBox_connais)

Sheets("Base" ).Cells(Ligne, 9) = Me.ComboBox_parrainage

Sheets("Base" ).Cells(Ligne, 10) = Application.Proper(Me.ComboBox_ville)

Sheets("Base" ).Cells(Ligne, 11) = Application.Proper(Me.ComboBox_FAI)

Sheets("Base" ).Cells(Ligne, 12) = Application.Proper(Me.ComboBox_antivirus)

End Sub

Private Sub ComboBox_nom_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If IsError(Application.Match(Me.ComboBox_nom, Range("Listes_clients" ), 0)) And Me.ComboBox_nom <> "" Then

If MsgBox("Etes vous sûr?", vbYesNo) = vbYes Then

Range("Listes_clients" ).End(xlDown).Offset(1, 0) = Me.ComboBox_nom

Range("Listes_clients" ).Sort Key1:=Range("Listes_clients" )(1)

End If

End If

End Sub

Private Sub ComboBox_annee_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If IsError(Application.Match(Me.ComboBox_annee, Range("Listes_annee" ), 0)) And Me.ComboBox_annee <> "" Then

If MsgBox("Etes vous sûr?", vbYesNo) = vbYes Then

Range("Listes_annee" ).End(xlDown).Offset(1, 0) = Me.ComboBox_annee

Range("Listes_annee" ).Sort Key1:=Range("Listes_annee" )(1)

End If

End If

End Sub

Private Sub ComboBox_connais_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If IsError(Application.Match(Me.ComboBox_connais, Range("Listes_connaissances" ), 0)) And Me.ComboBox_connais <> "" Then

If MsgBox("Etes vous sûr?", vbYesNo) = vbYes Then

Range("Listes_connaissances" ).End(xlDown).Offset(1, 0) = Me.ComboBox_connais

Range("Listes_connaissances" ).Sort Key1:=Range("Listes_connaissances" )(1)

End If

End If

End Sub

Private Sub ComboBox_ville_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If IsError(Application.Match(Me.ComboBox_ville, Range("Listes_villes" ), 0)) And Me.ComboBox_ville <> "" Then

If MsgBox("Etes vous sûr?", vbYesNo) = vbYes Then

Range("Listes_villes" ).End(xlDown).Offset(1, 0) = Me.ComboBox_ville

Range("Listes_villes" ).Sort Key1:=Range("Listes_villes" )(1)

End If

End If

End Sub

Private Sub ComboBox_FAI_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If IsError(Application.Match(Me.ComboBox_FAI, Range("Listes_FAI" ), 0)) And Me.ComboBox_FAI <> "" Then

If MsgBox("Etes vous sûr?", vbYesNo) = vbYes Then

Range("Listes_FAI" ).End(xlDown).Offset(1, 0) = Me.ComboBox_FAI

Range("Listes_FAI" ).Sort Key1:=Range("Listes_FAI" )(1)

End If

End If

End Sub

Private Sub ComboBox_antivirus_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If IsError(Application.Match(Me.ComboBox_antivirus, Range("Listes_antivirus" ), 0)) And Me.ComboBox_antivirus <> "" Then

If MsgBox("Etes vous sûr?", vbYesNo) = vbYes Then

Range("Listes_antivirus" ).End(xlDown).Offset(1, 0) = Me.ComboBox_antivirus

Range("Listes_antivirus" ).Sort Key1:=Range("Listes_antivirus" )(1)

End If

End If

End Sub

Private Sub CheckBox_Achat_Click()

'Si casse cocher, la valeur 1 sera renvoyer sur la ligne active dans la colonne D de la feuille Base sinon rien

If CheckBox_Achat.Value Then

Range("D" ).Value = 1

Else

Colunms("D" ).Value = ""

End If

End Sub

Private Sub UserForm_Activate()

If Range("E3" ).Value Then

Me.CheckBox_Achat.Value = True

Else: Me.CheckBox_Achat.Value = False

End If

End Sub

Private Sub CmdPremier_Click()

ComboBox1.ListIndex = 0

End Sub

Private Sub ComboBox1_Change()

If ComboBox1.ListIndex = -1 Then Exit Sub

Me.CmdPremier.Enabled = True

Me.CmdPrecedent.Enabled = True

Me.CmdSuivant.Enabled = True

Me.CmdDernier.Enabled = True

Select Case ComboBox1.ListIndex

Case -1

Me.CmdPremier.Enabled = False

Case 0

Me.CmdPrecedent.Enabled = False

Me.CmdPremier.Enabled = False

Case ComboBox1.ListCount - 1

Me.CmdSuivant.Enabled = False

Me.CmdDernier.Enabled = False

End Select

Worksheets("Base" ).Cells(ComboBox1.ListIndex + 1, 1).Select

Navigue ActiveCell.Row

End Sub

Private Sub CmdPrecedent_Click()

ComboBox1.ListIndex = ComboBox1.ListIndex - 1

End Sub

Private Sub CmdSuivant_Click()

ComboBox1.ListIndex = ComboBox1.ListIndex + 1

End Sub

Private Sub CmdDernier_Click()

ComboBox1.ListIndex = ComboBox1.ListCount - 1

End Sub

Private Sub Navigue(L As Long)

Dim i As Byte

With Worksheets("Base" )

For i = 2 To 12

Me("TextBox" & i) = .Cells(L, i)

Next

End With

End Sub

Private Sub UserForm_Initialize()

ComboBox_mois.ListIndex = Month(Now()) - 1

ComboBox_annee = Year(Now)

With Worksheets("Base" )

Me.ComboBox1.List = .Range("b2:B" & .Range("A65536" ).End(xlUp).Row).Value

Me.ComboBox1.ListIndex = ActiveCell.Row - 1

End With

End Sub

En vous remerciant à l'avance,

Frédérique

PS : si vous pouvez etre precis dans les changements a apporter du "mon code remplacer par ..."

userform ajoutclient 640x480

Bonsoir

Beaucoup de monde voudrait t'aider mais sans fichier pas facile de traquer des erreurs

Bonne soirée

Bonjour,

Effectivement un fichier vaux mieux qu'un long discours.

En vous remerciant de la précieuse aide que vous pouvez m'apporter

Frederique

1'376base-de-clients.zip (57.08 Ko)

Salut fredoud et le forum

Bienvenue

Utilises les balises de code !

C'est bien de faire plus de 150 lignes de code sur 18 macros sans aucune vérification. c'est un bon moyen de passer des nuits en restant éveillé

Comme c'est ton code, pas besoin de préciser, tu reconnaîtras

  • Déclarer une feuille en variable globale est ne pas l'utiliser, mais réécrire toute la définition me semble une perte de temps.
  • tu possède une version 2007, alors évites les limitations de 2003 => Cells(Rows.Count, "A").End(xlUp)
  • Il vaut mieux déclarer tes variables entières en Long. D'après ce que j'ai lu, Excel les recode en long pour les calculs, mais en tenant compte de leurs limites.
  • CmdAjouter ne fait qu'une RAZ des contrôles (mais c'est peut-être voulu) ?
  • CmdValider : tu commences à écrire, puis tu testes et en cas de mauvaises réponses tu sorts ??? Je te conseillerais de tester avant de commencer à écrire, ou de t'acheter une perruque pour cacher les tous des cheveux que tu vas t'arracher !
  • Personnellement j’évite, autant que possible, de mélanger fonctions de feuilles de calcul et code VBA.
  • CheckBox_Achat Excel va faire un KK nerveux si tu ne lui indique pas clairement quelle est la ligne ! À ma connaissance, Range("D").Value ne lui suffit pas !
  • UserForm_Activate => ça suppose qu'il n'est pas en modal, puisque tu l'initialises, ce n'est pas forcément une bonne idée.
  • ComboBox1_Change => c'est bien de gérer complètement premier et précédent... mais, en toute logique, faudrait faire de même avec suivant et dernier.

Il y a une contradiction flagrante entre :

Sheets("Base").Cells(Ligne, 2) = Application.Proper(Me!ComboBox_nom)

et

Application.Match(Me.ComboBox_nom, Range("Listes_clients"), 0)

Tu vérifies que "aa" n'existe pas, alors que tu veux écrire "Aa" ? Utilises plutôt la méthode Find en VBA, que tu peux définir avec MatchCase à False.

Petit rappel : on n'est pas des génies d'Excel au point de détecter les erreurs, autres que flagrantes, sans essais. Et comme on n'est ni devin ni télépathe, fournit un minimum !

Un petit conseil : quand on code une macro, on la teste individuellement, puis dans l'ensemble. Je sais, c'est long, mais moins que de rectifier une base de données.

A+

Edit : Pendant que je m'éditais (méditais ?) un fichier d'essai à fait son apparition.

Bonjour,

Au début du projet, j'ai essayé me dépatouiller seule et en faisant des tests au fur et à mesure. Certaines fonctions étaient concluantes mais plus j'avance et plus je mis perds et moins ça marche. Le bouton "ajouter" me permet d'ajouter un client, et vérifie en même temps si l'info (nom, ville, FAI, etc.) que j’écris se trouve sur les listes respectives de la feuille "Listes", on aurait deviner . Celui de "valider" sert a prendre en compte la modification d'une ligne en mode visualisation. Questions :

- Comment signaler que je souhaite ajouter des informations dans la base et sur la première ligne vide ?

Option Explicit 
Dim Ligne As Integer 
Dim Feuil As Worksheet 
Set Feuil = Worksheets("Base" ) 
Ligne = Sheets("Feuil" ).[A65536].End(xlUp).Offset(1, 0).Row 

- Le projet bloquait sur la ligne "Sheets("Base" ).Cells(Ligne, 2) = Me.ComboBox_nom" souligne en jaune avant que je modifie le code précèdent qui contient lui même apparemment des erreurs, pourquoi ?

Private Sub CmdValider_Click() 
Sheets("Base" ).Cells(Ligne, 2) = Me.ComboBox_nom
Sheets("Base" ).Cells(Ligne, 3) = Me.TextBox_pro)
Sheets("Base").Cells(Ligne, 4) = Me.TextBox_km
Sheets("Base" ).Cells(Ligne, 5) = Me.CheckBox_Achat
Sheets("Base" ).Cells(Ligne, 6) = Me.ComboBox_annee 
Sheets("Base" ).Cells(Ligne, 7) = Me.ComboBox_mois 
Sheets("Base" ).Cells(Ligne,8) = Me.TextBox_CA 
If TextBox_CA.Text = "" Then 
MsgBox "Le C.A. n'est pas indiqué" 
Exit Sub 
End If 
Sheets("Base" ).Cells(Ligne, 9)= Application.Proper(Me.ComboBox_connais) 
Sheets("Base" ).Cells(Ligne, 10) = Me.ComboBox_parrainage 
Sheets("Base" ).Cells(Ligne, 11) = Application.Proper(Me.ComboBox_ville) 
Sheets("Base" ).Cells(Ligne, 12) = Application.Proper(Me.ComboBox_FAI) 
Sheets("Base" ).Cells(Ligne, 13) = Application.Proper(Me.ComboBox_antivirus) 
End Sub 

Private Sub ComboBox_nom_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
If IsError(Application.Match(Me.ComboBox_nom, Range("Listes_clients" ), 0)) And Me.ComboBox_nom <> "" Then
 If MsgBox("Etes vous sûr?", vbYesNo) = vbYes Then 
Range("Listes_clients" ).End(xlDown).Offset(1, 0) = Me.ComboBox_nom 
Range("Listes_clients" ).Sort Key1:=Range("Listes_clients" )(1) 
End If 
End If 
End Sub 

- Ce que je souhaite pour ce checkbox, c'est qu'il affiche dans la colonne E le chiffre 1 si case cocher donc sur la nouvelle ligne et sur la première ligne vide de la feuille base sinon rien inscrire. Je me répète en espérant me faire comprendre !

Private Sub CheckBox_Achat_Click()
 If CheckBox_Achat.Value Then
 Range("E").Value = 1
 Else
 Colunms("E").Value = ""
 End If
 End Sub

Private Sub UserForm_Activate()
 If Range("E2").Value Then
 Me.CheckBox_Achat.Value = True
 Else: Me.CheckBox_Achat.Value = False
 End If
 End Sub

Je n'est pas compris ce que vous voulez dire avec "Personnellement j’évite, autant que possible, de mélanger fonctions de feuilles de calcul et code VBA"

Merci du cout de main. Je suis débutante depuis une semaine et vous remercie de votre patience et compréhension.

Frederique

Bonjour,

en voyant ton code ci-avant, je vois un truc qui ne peux fonctionner

Set Feuil = Worksheets("Base" ) 
Ligne = Sheets("Feuil" ).[A65536].End(xlUp).Offset(1, 0).Row

Ces deux lignes ne doivent pas se trouver dans la déclaration des variables mais bien dans une macro. Donc à supprimer de là.

Sinon dans le code je ferais ceci plutôt

Dim ligne as long
Ligne = Sheets("Base" ).Range("A" & rows.count).End(xlUp).Row +1

Amicalement

re,

En respectant ce que je viens de t'expliquer avant, le code pour valider les données à essayer

Private Sub CmdValider_Click()
Dim ligne As Long
With Sheets("Base")
ligne = .Range("A" & Rows.Count).End(xlUp).Row + 1
   .Cells(ligne, 2) = Application.Proper(Me!ComboBox_nom)
   .Cells(ligne, 3) = Application.Proper(Me.TextBox_pro)
   .Cells(ligne, 4) = Me.TextBox_km
   .Cells(ligne, 5) = Me.CheckBox_Achat  'OuiNon(Me.Achat)
   .Cells(ligne, 6) = Me.ComboBox_annee
   .Cells(ligne, 7) = Me.ComboBox_mois
   .Cells(ligne, 8) = Me.TextBox_CA
   If TextBox_CA.Text = "" Then
     MsgBox "Le C.A. n'est pas indiqué"
     Exit Sub
    End If
   .Cells(ligne, 9) = Application.Proper(Me.ComboBox_connais)
   .Cells(ligne, 10) = Me.ComboBox_parrainage
   .Cells(ligne, 11) = Application.Proper(Me.ComboBox_ville)
   .Cells(ligne, 12) = Application.Proper(Me.ComboBox_FAI)
   .Cells(ligne, 13) = Application.Proper(Me.ComboBox_antivirus)
End With
End Sub

Amicalement

Edit dan : Hum, es-tu sûr d'avoir testé ton code là... en gros, as-tu des erreurs qui te sont renvoyées...Si le code est copié au adapté d'un fichier que tu as trouvé ailleurs, ce serait bien de le signaler.

Salut Dan et le forum

Déolé de te critiquer :

Private Sub CmdValider_Click()
Dim ligne As Long
With Sheets("Base")
ligne = .Range("A" & Rows.Count).End(xlUp).Row + 1
   .Cells(ligne, 2) = Application.Proper(Me!ComboBox_nom)
   .Cells(ligne, 3) = Application.Proper(Me.TextBox_pro)
   .Cells(ligne, 4) = Me.TextBox_km
   .Cells(ligne, 5) = Me.CheckBox_Achat  'OuiNon(Me.Achat)
   .Cells(ligne, 6) = Me.ComboBox_annee
   .Cells(ligne, 7) = Me.ComboBox_mois
   .Cells(ligne, 8) = Me.TextBox_CA
   If TextBox_CA.Text = "" Then
     MsgBox "Le C.A. n'est pas indiqué"
     Exit Sub
    End If
   .Cells(ligne, 9) = Application.Proper(Me.ComboBox_connais)
   .Cells(ligne, 10) = Me.ComboBox_parrainage
   .Cells(ligne, 11) = Application.Proper(Me.ComboBox_ville)
   .Cells(ligne, 12) = Application.Proper(Me.ComboBox_FAI)
   .Cells(ligne, 13) = Application.Proper(Me.ComboBox_antivirus)
End With
End Sub

Si on fait ça, on commence à inscrire les données de B à H, puis on teste, et si le test n'est pas bon, on sort => je pense qu'avant de commencer la validation, on doit tester toutes les valeurs (comme le nom, par exemple, et les autres si nécessaire), et si le(s) test(s) sont bon(s), à ce moment seulement, on écrit

C'est plus une question de philosophie que de critique du code.

Pour moi, quand on veut valider :

  • On vérifie la justesse des informations nécessaires
  • On calcule la clef client (ou on va la chercher, si le client existe)
  • idem pour la ligne d'écriture
  • et seulement à ce moment, on écrit, tout d'un coup
après, ça dépend des habitudes de travail : avertissement, mise en forme, RAZ de l'USF, etc...

Dans le cas de ce projet, je ne pense pas qu'il soit judicieux d'utiliser des variables globales. Surtout, du fait que l'USF est Non modal => on risque d'avoir fait des manipulations sur la feuille concernée, et donc d'insérer des données au mauvais endroit. Il me semble préférable de ne calculer la ligne qu'au moment où on en a réellement besoin.

A+

re,

Déolé de te critiquer

Gorfael, je suppose que c'est à moi que tu adresses cette remarque.

Sache que j'ai juste prit le code en place en ajoutant la variable "ligne" qui se trouvait à un mauvais endroit.

Je me suis juste inséré dans ce fil pour faire une ou deux suggestions qui me choquaient sans trop aller plus loin dans l'analyse. Toi et Banzai êtes sur le coup.

Ce qui est sûr c'est que pour ma part, je n'aurais pas procédé de cette manière.

Comme je l'ai dit précédemment, je pense que cette appli est un copié d'un fichier reprit sur le web.

A+

Salut fredoud et le forum

En gardant à l'esprit que la plupart des gens essaie de "critiquer de manière constructive". Enfin, c'est vrai pour moi, même si des fois je semble attaquer

Au début du projet, j'ai essayé me dépatouiller seule et en faisant des tests au fur et à mesure.

À priori, tu es une femme (seule dans le texte), mais je ne vais pas faire les accords, vu que je m'adresse à un programmeur

Une bonne démarche : on écrit un bout de code, on le teste, et on résout chaque problème avant de continuer. Tout faire d'un coup te submerges de problèmes, dont tu ne comprends pas la raison, surtout si tu en as corrigé une partie.

J'ai parcouru ton fichier de test, et pour moi qui suis extérieur, quelques remarques :

- Option Explicit => s'obliger à déclarer ses variables est un atout

par contre, Byte... sur un forum (peut-être ici ?) sur une discussion de sur les entiers, il en est ressorti que ça ne servait à rien de traiter en inférieur à Long : Excel ne sait qu'utiliser des Long, et pour les valeurs inférieures, il est obligé de les transformer en long, pour les utiliser, puis de les remettre au format d'origine.

Avant de traiter l'USF, tu as des macros :

Pour les ActiveChart, ne les utilisant pas (ou très peu), je ne peux me prononcer. Pour le reste :

Sub Histo()
' .....
    Sheets("Parametres").Select
    Range("D16").Select
    ActiveCell.FormulaR1C1 = "FALSE"
    Range("D17").Select
    Sheets("tableau de bord").Select
End Sub

On peut faire un peu plus fonctionnel :

Sub Histo()
' .....
    Sheets("Parametres").Range("D16") = FALSE
    Sheets("tableau de bord").Select
End Sub

Ce n'est pas exactement le même code, puisque j'inscris la valeur booléenne FAUX dans la cellule et non le mot. Mais comme je n'ai pas d'idée sur la feuille manquante...

Function PROCHAINANNEE(d As Date) As Date
    PROCHAINANNEE = y + 365 - Year(y, vbJanuary)
End Function

Je ne comprends même pas le but de cette function : on oblige à donner d, une date qu'on exploite pas ? Je suppose que ça a servit de test.

Si je pars du principe que c'est supposé donner la date anniversaire de d l'année prochaine, je mettrais un code de la forme :

Function PROCHAINANNEE(d As Date) As Date
Application.Volatile
PROCHAINANNEE = DateSerial(Year(d) + 1, Month(d), Day(d))
End Function

Volatile => oblige le re-calcul de la function en même temps que la feuille où elle est utilisée.

Sub Recap_client()
Dim Plage As Range, F As Worksheet
Set F = Sheets("Base")
With Sheets("Recapitulatif_client")
    .Rows("1:" & .Range("A1").SpecialCells(xlCellTypeLastCell).Row ).Delete
    F.AutoFilterMode = False
    Set Plage = F.Range("B2:F" & F.Cells(Rows.Count, "A").End(xlUp).Row)
    Plage.AutoFilter 1, [Param_analyse_clients_libelle]
    Plage.SpecialCells(xlCellTypeVisible).Copy .[A2]
    F.AutoFilterMode = False
    .Activate 'facultatif
End With
End Sub

N'ayant pas de feuille "Parametres", je suis dans l'impossibilité de valider le code, mais le raisonnement me semble... bancal. C'est peut-être dû à une méconnaissance de l'usage du fichier ou à mes habitudes concernant les bases de données. Je conserverais la clef, mais on traitera ça plus bas.

Le code : on copie la feuille "Base" filtrée suivant la feuille paramètre, après avoir nettoyé la feuille destination.

Feuille Base :

  • des colonnes sont impérativement remplies : A, F, G et H, ores, on ne teste que la colonne H (CA) pour la validation de l'USF
  • Colonne A : C'est un identifiant (au sens BdD) pour la ligne. Problème : On ne l'inscrit pas à la validation de l'USF ???
  • Colonne B : Par exemple, je vois 7 numéros différents pour MMA ou ou 5 taland P. Donc, ce n'est pas une base client. Je ne sais qu'en penser.
  • Colonnes F, G : Personnellement, je préfère une date avec un format personnalisé : sur des dates, on peut travailler avec la date, le jour, la semaine, le mois, l'année, ou de périodes à périodes (comme le trimestre, par exemple). Mais comme je ne connais pas les besoins...
  • Colonne H : Je sais que ce n'est pas important, mais j'aime mettre l'unité => ça évite de se (faire) poser des questions aux mauvais moments.

Feuille Liste :

  • Utiliser des listes nommées dynamiques est bien
  • À quoi bon faire des listes, si ce n'est pour éviter les doublons ?
  • Au moins la liste de la colonne A n'est pas à jour : Listes : 5 noms distincts => Base : 10 noms distincts
A+

Edit

Salut Dan : j'essaie simplement de ménager la susceptibilité de certaines personnes, et j'avoue ne pas avoir lu tous tes postes. Donc, par habitude, étant pour la paix, je préfère désamorcer tout conflit potentiel, même si je ne pense pas que ça puisse en devenir un : j'ai déjà eu des surprises . De plus, comme je l'explique, ce n'est pas le code qui me pose problème, plutôt la manière de travailler. Et non, moi non plus je ne pense pas que je traiterais le problème de cette manière... sauf que je ne connais pas le but du fichier .

Bonjour,

Merci pour l'animation qui est intéressante ainsi que les critiques qui me paraissent à mon avis constructive c'est dont le but des forums.

Je vous confirme qu'effectivement que je suis une femme et qui ne connait rien du tout en VBA et à l'userform, rien de grave en cela. Le code de mon projet est de l'adaptation de divers lectures certes la synthèse n'est pas terrible, je vous prie de m' excusé, il faut bien commencer par quelques chose !

J'ai apporté quelques modifications mais j'avoue ne pas comprendre beaucoup de chose, ça vient petit à petit. J'avais caché dans le fichier précédemment joint des feuilles de façon à ce qu'elle ne puisse pas être effacer si toutefois on me renvoyer le fichier avec des modifs.

Ce projet me permets de noter les interventions de mon collègue et de faire des statistiques, plus commode qu'un cahier. L'userform parait pratique pour remplir la base et faire ce que je veux avec les différentes feuilles mais difficile à mettre en place.

Désolé de vous importunés, pouvez-vous m'aidez pour ce projet ?

Encore merci

Frédérique

Salut fredoud et le forum

je vous prie de m' excusé, il faut bien commencer par quelques chose !

On est tous passé par là !

Le seul "reproche", c'est que tu t'attaque directement à une multitude de gros morceaux.

Désolé de vous importunés, pouvez-vous m'aidez pour ce projet ?

Dis-toi bien qu'il n'y a aucune obligation et que si on répond, c'est qu'on veut bien !

Je me sers du dernier fichier envoyé comme support (Base interventions clients .xls)

Malheureusement pour faire un travail aussi ardu, j'ai besoin de comprendre.

On commence par la feuille "Base". Je vais faire des remarques sur ce que j'en comprends :

Un enregistrement = une ligne de 14 champs (colonnes de A à N)

A - Clef : clé secondaire unique : sans autres raison que de raccourcir la clé primaire de plusieurs champs (-)

B - Nom : désignation du client : fait partie de la clé primaire (*)

C - Raison sociale : (**) Je ne sais pas si ça fait partie ou nom de la clé primaire

D - Kilométrage : (**)

E - Achat : renseignements annexes

F/G - Année/Mois : Visualisation plus simple de H

H - Date : fait partie de la clé primaire (*)

I - C.A. : But de la feuille

J/K - comment a été connue le nom (**)

L - Ville : (**)

M/N : renseignements annexes

Personnellement, je ne traiterais pas le problème comme ça, mais c'est pas mon projet et ce n'est que ce que je crois comprendre :

(*) : clé primaire : Nom+date : une clé primaire contient les informations qui définissent un enregistrement. On l'appelle aussi identifiant. Elle ne peut avoir de doublon => pour valider un enregistrement, il faut vérifier qu'aucun des champs ne soient vides, et qu'il n'existe pas déjà cet identifiant.

Il faut peut-être inclure la ville ?

(-) clé secondaire : même caractéristiques qu'une clé primaire, mais sur un seul champs => elle est calculée de manière simple : max(clé secondaire) + 1, à la validation de la ligne. Comme elle est calculée, elle est forcément unique, même si un enregistrement avec les champs (B à N) existe déjà => ne peut pas servir de clé primaire.

(**) : champs, qui à mon sens devraient être remplis automatiquement. On peut peut-être y inclure les renseignements annexes, mais alors, il faudrait reprendre le dernier enregistrement de même nom avec la date la plus récente : un antivirus peut changer sur les enregistrements.

Le but, c'est l'uniformisation des données.

On ne peut conseiller efficacement que si on a les bonnes informations. Et comme l'USF sert à remplir la base...

A+

Bonjour, j'ai résolu mon problème en refaisant différemment le code.

Toutefois, j'ai une question :

Dans mon userform, j'ai 4 boutons pour me déplacer du 1er au dernier et précédent ou suivant, quel syntaxe faut-il utiliser pour ce déplacer par rapport à la "clef" colonne A de la feuille Base ? Le nom dynamique de la colonne "clef" est : "Base_clef"

En vous remerciant d'avance

Bonjour,

Pour la navigation, c'est résolu après des heures et des heures de lectures et de l'aide.

Merci

Rechercher des sujets similaires à "transfert donnees userform feuille"