Charger controles Userform avec derniere ligne non vide

egman

XLDnaute Occasionnel
Bonsoir à tous,

Après plusieurs recherches je n'arrive pas à trouver la solution à mon problème.

J'utilise un Userform pour entrer mes paramètres d'impression
Si je peux me permettre j'ai 3 questions :
1- Pouvoir charger tous les contrôles du userform avec les données de la dernière ligne non vide de ma base qui me sert d'historique, pour ne pas à avoir à retaper tous les paramètres car je n'en change que 2 ou 3 à chaque fois.

2- Pouvoir également visualiser mes dernières modifs en rouge (peu importe la couleur) dans la base et dans les contrôles du userform pour ne pas chercher ce qui a déjà été changé.....si c'est possible

3- Renuméroter les lignes de 1 à la dernière ligne renseignée mais que sur la colonne A sans changer l'ordre du reste des lignes (d'où l'importance de ma TextBox38 au format date + heure)

Je vous joint ci-joint mon fichier qui vous paraitra peut etre plus explicite

D'avance MERCI pour votre aide
 

Pièces jointes

  • _BD_S3D-V02.xlsm
    72.9 KB · Affichages: 87

Modeste

XLDnaute Barbatruc
Bonjour egman,

Pour répondre à ta première demande, je suis parti du principe (à confirmer!?) que le "garnissage des contrôles se faisait dans la Sub IniUsf ... Si c'est bien le cas, ajoutes-y les lignes suivantes:
VB:
tabloZtxt = Array(1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37)
For i = 0 To UBound(tabloZtxt)
    Me.Controls("T" & tabloZtxt(i)) = Ws.Cells(L, i + 1)
Next i
Il reste les 4 comboBox à traiter. Tu vois comment faire?

Pour ta question 2: ça devient déjà moins gai: si tu colores en rouge, à un moment, parce que le champ a été modifié récemment, à quel moment repasses-tu en couleur noire? Pas certain d'être volontaire pour cette partie-là

À la question 3 ... je n'ai rien compris!? Qu'appelles-tu renuméroter toutes les lignes et quel rapport avec la TextBox T38
 

egman

XLDnaute Occasionnel
Bonjour Modeste,

Tout d'abord MERCI de t’être penché sur mes questions.

Pour la question 1 :
- comment définit tu la variable tabloZtxt et où...? dans Option Expllicit ?
Et pour les 4 ComboBox je ne vois pas trop comment faire...

Pour la question 2 :
Tu as raison c'est trop galère à gérer.

Pour la question 3 :
En fait si je souhaite charger tous les contrôles avec la dernière ligne non vide du tableau c'est pour n'avoir que quelques modifs à faire et réenregistrer cette nouvelle ligne modifiée avec le bouton AJOUT.

L’intérêt de la textbox38 :
elle donne le jour et l'heure à laquelle j'ai fait mes modifs, mais je peux faire plusieurs modifs dans la même journée.
La renumérotation n'apporte pas grand chose dans la mesure où c'est toujours la dernière ligne qui est chargée.

Procédons par ordre :
1- Charger la dernière ligne du tableau
2- Modifier celle ci et la rajouter en nouvelle ligne avec mon bouton AJOUT

Encore une fois merci de bien vouloir m'aider

A+
 

Modeste

XLDnaute Barbatruc
Re-bonjour,


Je déclare la variable tabloZtxt ... au moment où je l'initialise :rolleyes:
Comme sa portée est tout à fait locale, tu peux la déclarer dans ta Sub IniUsf, avec: Dim tabloZtxt() As Variant (je ne voudrais pas que tu en fasses des cauchemars ;))
Pour tes ComboBox, comme il n'y en a que 4, pas certain qu'une boucle fasse gagner beaucoup de place. Tu peux, par exemple, écrire:
VB:
cboMat = Ws.Cells(L, 3)
... je te laisse adapter pour les 3 autres?

Pour la question 3 ... je n'ai toujours pas compris? Quand tu écris: "La renumérotation n'apporte pas grand chose dans la mesure où c'est toujours la dernière ligne qui est chargée ", ça veut dire qu'en clair, tu laisses tomber?

Et "Charger la dernière ligne du tableau ", ce n'est pas ce que j'ai proposé tout à l'heure?

Pour ce qui est de l'ajout, si pour charger les contrôles avec le contenu des cellules, on écrit quelque chose comme
VB:
Me.Controls("T" & tabloZtxt(i)) = Ws.Cells(L, i + 1)
'... ou ...
cboMat = Ws.Cells(L, 3)
... tu devrais trouver sans trop de mal ce qu'il faut écrire pour faire l'inverse, non?
Il faudra juste penser à calculer l'emplacement de la première ligne vide!
 

egman

XLDnaute Occasionnel
Re-bonjour,


Je déclare la variable tabloZtxt ... au moment où je l'initialise :rolleyes:
Comme sa portée est tout à fait locale, tu peux la déclarer dans ta Sub IniUsf, avec: Dim tabloZtxt() As Variant (je ne voudrais pas que tu en fasses des cauchemars ;))
Pour tes ComboBox, comme il n'y en a que 4, pas certain qu'une boucle fasse gagner beaucoup de place. Tu peux, par exemple, écrire:
VB:
cboMat = Ws.Cells(L, 3)
... je te laisse adapter pour les 3 autres?

Pour la question 3 ... je n'ai toujours pas compris? Quand tu écris: "La renumérotation n'apporte pas grand chose dans la mesure où c'est toujours la dernière ligne qui est chargée ", ça veut dire qu'en clair, tu laisses tomber?

Et "Charger la dernière ligne du tableau ", ce n'est pas ce que j'ai proposé tout à l'heure?

Pour ce qui est de l'ajout, si pour charger les contrôles avec le contenu des cellules, on écrit quelque chose comme
VB:
Me.Controls("T" & tabloZtxt(i)) = Ws.Cells(L, i + 1)
'... ou ...
cboMat = Ws.Cells(L, 3)
... tu devrais trouver sans trop de mal ce qu'il faut écrire pour faire l'inverse, non?
Il faudra juste penser à calculer l'emplacement de la première ligne vide!
Merci pour ta réponse,
Pour les combobox et la déclaration de la variable tabloZtxt merci.

Par contre j'ai un souci avec la variable i qui ne serait pas définie dans
upload_2016-11-3_14-53-43.png


Pour la renumérotation de la colonne A je laisse tomber.
Pour ce qui est de l'ajout des nouvelles données en dernière ligne je verrai après.

Encore MERCI
 

Modeste

XLDnaute Barbatruc
Par contre j'ai un souci avec la variable i qui ne serait pas définie
Et qu'en dit l'aide d'Excel?
Monsieur Microsoft à dit:
Si l'instruction Option Explicit apparaît dans un module, vous devez déclarer explicitement toutes les variables à l'aide des instructions Dim, Private, Public, ReDim ou Static. Si vous tentez d'utiliser un nom de variable non déclarée, une erreur se produit à la compilation.
En foi de quoi, il ne te reste plus ... qu'à déclarer cette variable: Dim i as Byte devrait suffire
 

egman

XLDnaute Occasionnel
Et qu'en dit l'aide d'Excel?
En foi de quoi, il ne te reste plus ... qu'à déclarer cette variable: Dim i as Byte devrait suffire
Autant pour moi je n'ai pas l'habitude de regarder l'aide Excel....:confused: (mauvaise habitude je sais)

C'est vrai que çà fonctionne tout de suite mieux....
J'ai juste un décalage dans mes textbox à partir du premier combobox cboMat .....au chargement du userform çà me décale tout d'un textbox à l'autre, pourtant la ligne tabloZtxt = Array(1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37) ne tient pas compte des combobox qui sont déclarés à part.....! ! !
 

egman

XLDnaute Occasionnel
Bonsoir,


Oups! Remplacer Me.Controls("T" & tabloZtxt(i)) = Ws.Cells(L, i + 1)
... par Me.Controls("T" & tabloZtxt(i)) = .Cells(L, tabloZtxt(i)) sinon on prend toutes les colonnes (y compris celles qui doivent remplir les ComboBox)
Serait-ce mieux?
Bonsoir Modeste,
Merci pour la réponse, mais j'ai une erreur de compilation sur .Cells dans ta ligne de code...
Désolé...
 

egman

XLDnaute Occasionnel
Bonsoir,


Oups! Remplacer Me.Controls("T" & tabloZtxt(i)) = Ws.Cells(L, i + 1)
... par Me.Controls("T" & tabloZtxt(i)) = .Cells(L, tabloZtxt(i)) sinon on prend toutes les colonnes (y compris celles qui doivent remplir les ComboBox)
Serait-ce mieux?
Je me suis servi de l'AIDE ......il suffisait d'enlever le ( . ) devant Cells et çà fonctionne nickel. :)

J'aurai une dernière question peut on imposer sur la feuille BD que les données soient au format nombre sur certaines colonnes ?
Col A = Format nombre "0"
Col B= Format nombre "0,0"
Col D= Format nombre "0,00"
etc....

Encore merci pour tout.
 

Modeste

XLDnaute Barbatruc
il suffisait d'enlever le ( . ) devant Cells et çà fonctionne nickel
Si les instructions étaient inscrites entre With WS ... et End With, ce n'était pas nécessaire :) ... Mais le recours à l'Aide était sans conteste une excellente idée!

Pour la question des formats, le plus simple est d'appliquer le format souhaité à une zone suffisamment étendue de la feuille de calcul.
Attention cependant au fait que les données que tu insères dans les cellules et qui proviennent de zones de texte de ton formulaire seront, par défaut, considérées comme du texte. Si toutes les zones de texte contiennent des données numériques, tu peux écrire, par exemple, quelque chose comme
VB:
WS.Cells(L + 1, i) = 1 * Controls("T" & i)
 

egman

XLDnaute Occasionnel
Si les instructions étaient inscrites entre With WS ... et End With, ce n'était pas nécessaire :) ... Mais le recours à l'Aide était sans conteste une excellente idée!

Pour la question des formats, le plus simple est d'appliquer le format souhaité à une zone suffisamment étendue de la feuille de calcul.
Attention cependant au fait que les données que tu insères dans les cellules et qui proviennent de zones de texte de ton formulaire seront, par défaut, considérées comme du texte. Si toutes les zones de texte contiennent des données numériques, tu peux écrire, par exemple, quelque chose comme
VB:
WS.Cells(L + 1, i) = 1 * Controls("T" & i)
Bonjour Modeste,
Merci pour ta réponse, mais où faut il mettre ce code ?
Dans :
Private Sub IniUsf() ?
Private Sub btnAjout_Click() ?

Comme tu l'as peut etre remarqué j'ai un CheckBox1 dans mon Userform et j'aimerai que par défaut il soit coché avec comme valeur "Auto" et si je le décoche que ce soit le T4 qui prenne la valeur que je lui rentrerai.
Est ce que je peux écrire comme çà ? et où le mettre ?

With Ws
If CheckBox1.Value = True Then
CheckBox1 = "Auto"
.Cells (L + 1, 3) = CheckBox1
Else
T4 = Value
End If
End With

Je pense que j'ai tout faux aussi j'implore ton indulgence.
Merci
 

Modeste

XLDnaute Barbatruc
Re,

Comme le petit bout de code proposé permet de copier dans une cellule, le contenu d'un de tes contrôles, ce serait plutôt dans
la Sub btnAjout_Click() qu'il faudrait l'insérer (et il faudra faire de même avec la procédure de modification)

Pour ton autre question, si la case est cochée, où doit apparaître la valeur "Auto"? Et .Cells (L + 1, 3) ... n'est-ce pas la cellule qui est liée à ta ComboBox "Matériel"?
 

egman

XLDnaute Occasionnel
Re,

Comme le petit bout de code proposé permet de copier dans une cellule, le contenu d'un de tes contrôles, ce serait plutôt dans
la Sub btnAjout_Click() qu'il faudrait l'insérer (et il faudra faire de même avec la procédure de modification)

Pour ton autre question, si la case est cochée, où doit apparaître la valeur "Auto"? Et .Cells (L + 1, 3) ... n'est-ce pas la cellule qui est liée à ta ComboBox "Matériel"?
OK pour l'endroit à copier le code WS.Cells(L + 1, i) = 1 * Controls("T" & i)
Merci

Pour la case à cochée c'est en fait .Cells (L + 1, 4) la cellule correspondant à la TextBox4
 

egman

XLDnaute Occasionnel
OK pour l'endroit à copier le code WS.Cells(L + 1, i) = 1 * Controls("T" & i)
Merci

Pour la case à cochée c'est en fait .Cells (L + 1, 4) la cellule correspondant à la TextBox4
Je viens de tester le code WS.Cells(L + 1, i) = 1 * Controls("T" & i) que j'ai copié dans Private Sub btnAjout_Click() et dans Private Sub btnModif_Click() et çà me met une erreur Objet introuvable......et bizarrement je n'ai pas accès au bouton d'Aide ! ! !
 

Discussions similaires

Réponses
8
Affichages
238

Statistiques des forums

Discussions
312 305
Messages
2 087 091
Membres
103 465
dernier inscrit
Ehoarn_src