XL 2016 annulé

Staple1600

XLDnaute Barbatruc
Re

Oui mais...
1) je ne suis pas dans ta tête
2) ni dans ton contexte professionnel
3) ne connait pas le mode opératoire d'utilisation du fichier.
et pourtant je ne finis pas mon laïus par un point d'exclamation
:rolleyes:

Si la saisie est manuelle en L9:AI74, on se fiche donc qu'il y ait recopie par le biais de la macro, non ?
Le code VBA initial (et/ou le mien) du bouton Validation
(donc code VBA de la procédure Private Sub lblValid_Click)
fait ce pourquoi il a été écrit.
Ni plus, ni moins.
👨‍💻

[précisions...
Message rédigé avec mon crayon Staple Mine MD
;)
[/précisions]
 

Staple1600

XLDnaute Barbatruc
Re

En ayant compris ce que j'ai compris
J'ai testé ce bout de code
Code:
Sub Test()
Dim DerL&
DerL = Sheets("Coordo").[C:C].Find("*", , xlValues, , xlByRows, xlPrevious).Row
Sheets("Coordo").Cells(DerL, "L").Resize(2, 24).FillDown
End Sub
Que j'appelle dans le code Validation du Userform
Enrichi (BBcode):
Private Sub lblValid_Click()
[...] ' on laisse le code présent au dessus
Call lblQuitter_Click
    'On actualise la requête
    ActiveWorkbook.Connections("Requête - Données").Refresh
    Call Test ' <== dernier rajout de bibi ici
    Sheets("Planning").Activate
    Range("D3").Select
End Sub
NB: Pour tester, j'ai saisi au préalable des données sur la plage Lx:AIx
(et mis la police en noire)
Ces données sont bien recopiés sur la ligne qui a été "ajoutée" par l'userform.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

C'est écrit, non ?
Private Sub lblValid_Click()
Et ce commentaire était explicite
=> on laisse le code présent du dessus
Il suffit retrouver le bout de code que j'ai laisser justement pour identifier l'endroit.

Mais je m'inquiète pour ta santé
(ou plutôt pour ta mémoire)
Car hier normalement tu as remplacé le code initial par celui que je te proposais
Oui, souviens, Barbara, pardon , Luc
ce code "honteusement simplifié" par mes soins, tu l'as bien testé, non ?
Enrichi (BBcode):
Private Sub lblValid_Click()
'Déclaration des variables
Dim LObj As ListObject
Set LObj = Sheets("Data").ListObjects("TAction")
'Test de contrôle du remplissage des différents champs
    If Len(Me.txtService) = 0 Then
        Me.lblMessage = "Veuillez saisir un service."
        Me.txtService.SetFocus
        Exit Sub
    ElseIf Len(Me.txtProd) = 0 Then
        Me.lblMessage = "Veuillez saisir une production."
        Me.txtProd.SetFocus
        Exit Sub
    ElseIf Len(Me.txtAction) = 0 Then
        Me.lblMessage = "Veuillez saisir une action."
        Me.txtAction.SetFocus
        Exit Sub
    ElseIf Len(Me.txtDateDebut) = 0 Then
        Me.lblMessage = "Veuillez saisir le début de l'action."
        Me.txtDateDebut.SetFocus
        Exit Sub
    ElseIf Len(Me.txtDateFin) = 0 Then
        Me.lblMessage = "Veuillez saisir la fin de l'action."
        Me.txtDateFin.SetFocus
        Exit Sub
    Else
'////////////////////////////////Modif à la Staple
    'Si tous les champs sont remplis, on enregistre les données du formulaire dans la base
    LObj.ListRows.Add.Range.Item(1).Resize(, 5) = _
    Array(txtService, txtProd, txtAction, CDate(txtDateDebut), CDate(txtDateFin))
'//////////////////////////Fin modifs à la Staple ////////////////////////////////////
    'On vide le formulaire
    Call lblEffacer_Click
    'On ferme le formulaire
    Call lblQuitter_Click
    'On actualise la requête
    ActiveWorkbook.Connections("Requête - Données").Refresh
   Sheets("Planning").Activate
    Range("D3").Select
    End If
End Sub

PS: message avec des morceaux d'ironie (mais qui reste amicale)
Mais tu es vacciné, désormais ;)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Le gras, c'est simplement pour identifier le nom de la procédure
Et c'est simple pour la trouver : il n'y a en qu'une qui porte ce nom sur l'Userform
Et tout comme dans Excel, le raccourci CTRL+H fonctionne dans VBE.
Donc
1) Sélection de lblValid_Click
2) CTRL+C
On quitte XLD
Pour aller dans XL
3) ALT+F11
4) Clic-droit sur usfAction
5) CTRL+H puis CTRL+V​
on coche Module en cours et on clique sur OK

NB: Sans faire tout cela, un simple clic droit sur l'Userform
=>et un clic sur Code
permet de voir la procédure en question s'afficher en 5ième position.


NB: Je ne comprends pas comment tu as fait pour tester les codes que je t'ai proposé hier
Si tu n'arrives pas à tester ceux d'aujourd'hui ??

NB: La procédure Test sera copiée dans un module standard (le module3 par exemple), là on aurait pu trouver ma simplification de masquage que tu cites dans le message#10
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil

A la réflexion et pour aller faire un tour dans VBE, je simplifie le bousin
Au fond, je mets tout dans la forme.
VB:
Private Sub lblValid_Click()
'Déclaration des variables
Dim LObj As ListObject, DerL&
Set LObj = Sheets("Data").ListObjects("TAction")
'Test de contrôle du remplissage des différents champs
    If Len(Me.txtService) = 0 Then
        Me.lblMessage = "Veuillez saisir un service."
        Me.txtService.SetFocus
        Exit Sub
    ElseIf Len(Me.txtProd) = 0 Then
        Me.lblMessage = "Veuillez saisir une production."
        Me.txtProd.SetFocus
        Exit Sub
    ElseIf Len(Me.txtAction) = 0 Then
        Me.lblMessage = "Veuillez saisir une action."
        Me.txtAction.SetFocus
        Exit Sub
    ElseIf Len(Me.txtDateDebut) = 0 Then
        Me.lblMessage = "Veuillez saisir le début de l'action."
        Me.txtDateDebut.SetFocus
        Exit Sub
    ElseIf Len(Me.txtDateFin) = 0 Then
        Me.lblMessage = "Veuillez saisir la fin de l'action."
        Me.txtDateFin.SetFocus
        Exit Sub
    Else
'////////////////////////////////Modif à la Staple (a)
    'Si tous les champs sont remplis, on enregistre les données du formulaire dans la base
    LObj.ListRows.Add.Range.Item(1).Resize(, 5) = _
    Array(txtService, txtProd, txtAction, CDate(txtDateDebut), CDate(txtDateFin))
'//////////////////////////Fin modifs à la Staple ////////////////////////////////////
    'On vide le formulaire
    Call lblEffacer_Click
    'On ferme le formulaire
    Call lblQuitter_Click
    'On actualise la requête
ActiveWorkbook.Connections("Requête - Données").Refresh
'///////////////// Modif Staple (b) ////////////////////////////////////////////////////////
DerL = Sheets("Coordo").[C:C].Find("*", , xlValues, , xlByRows, xlPrevious).Row
Sheets("Coordo").Cells(DerL, "L").Resize(2, 24).FillDown
'/////////////////////////////////////////////////////////////////////////////////////
Sheets("Planning").Activate
Range("D3").Select
End If
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

En partant du principe que l'utilisateur final n'est pas un candidat des Anges 12 O que c'est vilain et réducteur ;)], je m'autorise à le considérer comme étant un un "être sachant".
Donc fidèle à mon K.I.S.S, je vire la palanquée de MsgBox et je me contente de
VB:
Private Sub lblValid_Click()
'Déclaration des variables
Dim LObj As ListObject, DerL&, ctrl As Control, k
Set LObj = Sheets("Data").ListObjects("TAction")
'Test de contrôle du remplissage des différents champs
For Each ctrl In Me.Controls
If TypeName(ctrl) = "TextBox" Then
If ctrl.Text = Empty Then
ctrl.SetFocus
Exit For
End If
k = k + 1
End If
Next ctrl
If k = 5 Then
'////////////////////////////////Modif à la Staple (a)
'    Si tous les champs sont remplis, on enregistre les données du formulaire dans la base
   LObj.ListRows.Add.Range.Item(1).Resize(, 5) = _
    Array(txtService, txtProd, txtAction, CDate(txtDateDebut), CDate(txtDateFin))
'//////////////////////////Fin modifs à la Staple ////////////////////////////////////
'    On vide le formulaire
Call lblEffacer_Click
'On ferme le formulaire
Call lblQuitter_Click
'On actualise la requête
ActiveWorkbook.Connections("Requête - Données").Refresh
'///////////////// Modif Staple (b) ////////////////////////////////////////////////////////
DerL = Sheets("Coordo").[C:C].Find("*", , xlValues, , xlByRows, xlPrevious).Row
Sheets("Coordo").Cells(DerL, "L").Resize(2, 24).FillDown
'/////////////////////////////////////////////////////////////////////////////////////
Sheets("Planning").Activate: Range("D3").Select
End If
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Chez moi, c'est ton fichier qui est sur mon disque dur.
Et comme je suis maitre chez moi, chez moi mon Excel ne me cache aucune feuille. ;)

Par acquis de conscience et parce que comme tu le constates, je ne suis pas en partance pour la messe pascale, je vais retelecharger ton fichier exemple et faire le test en changeant juste le code du bouton Validation avec le dernier code soumis.
 

Staple1600

XLDnaute Barbatruc
Re

J'ai parlé d'utilisateur final.
(C'est donc une personne lamba, pas un individu donné)
Donc ma conscience étant désormais acquise, j'avais le même message d'erreur.
Que je n'ai plus désormais
VB:
Private Sub lblValid_Click()
'Déclaration des variables
Dim LObj As ListObject, DerL&, ctrl As Control, k
Set LObj = Sheets("Data").ListObjects("TAction")
'Test de contrôle du remplissage des différents champs
For Each ctrl In Me.Controls
If TypeName(ctrl) = "TextBox" Then
If ctrl.Text = Empty Then
ctrl.SetFocus
Exit For
End If
k = k + 1
End If
Next ctrl
If k = 5 Then
'////////////////////////////////Modif à la Staple (a)
'    Si tous les champs sont remplis, on enregistre les données du formulaire dans la base
   LObj.ListRows.Add.Range.Item(1).Resize(, 5) = _
    Array(txtService, txtProd, txtAction, CDate(txtDateDebut), CDate(txtDateFin))
'//////////////////////////Fin modifs à la Staple ////////////////////////////////////
'    On vide le formulaire
Call lblEffacer_Click
'On ferme le formulaire
Call lblQuitter_Click
'On actualise la requête
ThisWorkbook.RefreshAll
'///////////////// Modif Staple (b) ////////////////////////////////////////////////////////
DerL = Sheets("Coordo").[C:C].Find("*", , xlValues, , xlByRows, xlPrevious).Row
Sheets("Coordo").Cells(DerL, "L").Resize(2, 24).FillDown
'/////////////////////////////////////////////////////////////////////////////////////
Sheets("Planning").Activate: Range("D3").Select
End If
End Sub
NB: Et pour ne plus l'avoir, voir toutes les feuilles du classeur m'a été bien utile. ;)
 

Staple1600

XLDnaute Barbatruc
Re

Donc voici ce qui se passe en ma demeure, sur mon écran, avec ton fichier.
TESTOK.png
 

Staple1600

XLDnaute Barbatruc
Re

De mémoire, il me semble que le code initial du bouton insère les données à la fin du tableau TAction.
(en insérant une ligne vide dans laquelle le code VBA du bouton Validation vient mettre les données des 5 TextBox de l'userform)
(Donc mon code simplifié s'est évertué de faire rigoureusement la même chose.)
 

Staple1600

XLDnaute Barbatruc
Re

Comme dirait Jean Moncorgé
=>https://www.youtube.com/watch?v=OEkJ45ZXK-o
"Tout ce je sais, c'est que je ne sais rien, mais cela je le sais"
Moi, j'ai vu de la lumière (pardon du code VBA)
J'ai pris l'existant pour le mettre à ma sauce mais en le laissant faire ce qu'il faisait à l'origine.

Comme je disais précédemment en déconstruisant la question en N petit problème n c'est plus simple.
C'est donc ce je viens de faire avec ce petit exemple
(A lancer sur un classeur vierge)
VB:
Sub Insérer_et_Recopier()
Dim L_Obj As ListObject, rng As Range, nomTAB$, vArr, oNewRow As ListRow
Set rng = ActiveCell
On Error GoTo To_Go
nomTAB = rng.ListObject.Name
Set L_Obj = ActiveSheet.ListObjects(nomTAB)
On Error GoTo 0
vArr = L_Obj.ListRows(rng.Row - 1).Range.Value2
Set oNewRow = L_Obj.ListRows.Add(rng.Row)
oNewRow.Range = vArr
Exit Sub
To_Go:
MsgBox "Cellule active hors du tableau!", vbCritical
End Sub
Sub CreaTEST()
[A1] = "ITEM_1": Cells(1).AutoFill Destination:=Range("A1:E1"), Type:=xlFillDefault
[A2:E20] = "=ADDRESS(ROW(),COLUMN(),4)": [A2:E20] = [A2:E20].Value
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$E$20"), , xlYes).Name = "Staple"
End Sub
1) On lance la macro qui créé le tableau
2) On sélectionne une cellule dans le tableau et on lance la macro Insérer_et_Recopier

Question: Est-ce que tu voulais faire dans le tableau TAction
Si oui, il faudra donc changer le code existant.
 

Staple1600

XLDnaute Barbatruc
Re

Le précédent interlude était d'abord un hommage
(puis une petite piqure de rappel pour ISBN:9781782273691 ;))
Histoire de poser le cadre ;)

Ensuite pour rester sur ma dynamique "déconstrutive", si j'étais moi, j'appellerai de mes vœux la mise en pratique la chose par le demandeur.
=> partir d'un fichier exemple simplifié
(donc ici : l'étape suivante : ajout d'un userform avec 5 textbox)
et brique par brique, on ajoute N fonctionnalité avec N ligne de code VBA.

L'autre voie, c'est d'attendre le support d'un autre XLDnaute ou d'attendre que je propose du code selon mon rythme

Ce qui boucle la boucle et légitime le pourquoi de l'interlude du message avec le petit train ;)
 

Staple1600

XLDnaute Barbatruc
Re

[aparté]
même si je pourrai apporter mon droit de réponse sur cette notion de "légitimité"
Pour ce faire, il eut fallut ne point supprimer tes messages ;)
Notamment celui qui motive l'apparition du petit train ;)
[/aparté]

Pour avoir de beaux fruits, il faut de belles graines ;)

Je t'ai présenter mon point de vue.
A toi de voir. ;)

Je trouve plus simple de procéder comme je l'ai indiqué plutôt que de pondre N code VBA que tu m'indiqueras non fonctionnel chez toi.

Donc j'attends ton fichier "simplifié" pour me remettre sur la question.
(avec en bonus un mode opératoire sur son fonctionnement)

NB: Comme je l'ai dit précédemment, tel quel ton fichier plante ou ralentit parfois mon Excel, d'où le souhait d'un fichier simplifié.
Sans compter que je n'ai pas abordé cet aspect des choses
Code:
let
    Source = Excel.CurrentWorkbook(){[Name="TAction"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(Source,{{"Service", type text}, {"Produit", type text}, {"Actions", type text}, {"Date début", type date}, {"Date fin", type date}}),
    #"Colonnes permutées" = Table.ReorderColumns(#"Type modifié",{"Service", "Produit", "Actions", "Date début", "Date fin"}),
    #"Soustraction de la date d'insertion" = Table.AddColumn(#"Colonnes permutées", "Durée", each Duration.Days([Date fin] - [Date début])+1),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Soustraction de la date d'insertion", "Date jour", each DateTime.LocalNow()),
    #"Type modifié1" = Table.TransformColumnTypes(#"Personnalisée ajoutée",{{"Date jour", type date}}),
    #"Colonne conditionnelle ajoutée" = Table.AddColumn(#"Type modifié1", "Fin-Jour", each if [Date fin] >= [Date jour] then Duration.Days([Date fin]-[Date jour])+1 else null),
    #"Colonne conditionnelle ajoutée1" = Table.AddColumn(#"Colonne conditionnelle ajoutée", "Solde jours", each if [Date début] >= [Date jour] then [Durée] else if [Date fin] >= [Date jour] then [#"Fin-Jour"] else 0),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Colonne conditionnelle ajoutée1",{"Date jour", "Fin-Jour"}),
    #"Personnalisée ajoutée1" = Table.AddColumn(#"Colonnes supprimées", "Personnalisé", each [Durée]-[Solde jours]),
    #"Personnalisée ajoutée2" = Table.AddColumn(#"Personnalisée ajoutée1", "% réalisé", each [Personnalisé]/[Durée]),
    #"Type modifié2" = Table.TransformColumnTypes(#"Personnalisée ajoutée2",{{"% réalisé", Percentage.Type}}),
    #"Colonnes supprimées1" = Table.RemoveColumns(#"Type modifié2",{"Personnalisé"}),
    #"Semaine de l'année insérée" = Table.AddColumn(#"Colonnes supprimées1", "N° Sem.", each Date.WeekOfYear([Date début]), Int64.Type),
    #"Index ajouté" = Table.AddIndexColumn(#"Semaine de l'année insérée", "Index", 1, 1),
    #"Lignes triées" = Table.Sort(#"Index ajouté",{{"Service", Order.Ascending}, {"Index", Order.Ascending}}),
    #"Colonnes supprimées2" = Table.RemoveColumns(#"Lignes triées",{"Index"}),
    #"Duplication de la colonne" = Table.DuplicateColumn(#"Colonnes supprimées2", "N° Sem.", "N° Sem. - Copier"),
    #"Colonnes supprimées3" = Table.RemoveColumns(#"Duplication de la colonne",{"N° Sem. - Copier"})
in
    #"Colonnes supprimées3"
[/SPOILER]
 

Staple1600

XLDnaute Barbatruc
Re

Concernant PQ, pourquoi toutes ces étapes qui donnent au final des colonnes vides dans Données ???
D'où ma demande d'avoir une version initiale fonctionnelle du classeur.
Car je ne comprends le pourquoi de cette requête qui ne renvoie des données que dans les colonnes A<->F et V<->Y

Je ne parle pas de redémarrer le projet mais de travailler sur un fichier simplifié, étape par étape (pour tester les codes VBA)
Dans ce fil, on teste:
-l'ajout dans un ListObject de données à partir d'un Userform
Et pouvoir faire des tests sur un fichier qui ne plante pas mon Excel c'est mieux.
Et disposer d'un mode opératoire exhaustif pour quelqu'un (qui comme moi) n 'est ni dans le contexte ni utilisateur du fichier, cela serait un plus.

C'est au final ta question, ta problématique.
Plus tu fourniras de matière pour la résoudre, mieux se sera.

Personnellement, cela ne me dérange de pondre du VBA et de le poster dans cette discussion qui fait déjà 4 pages :rolleyes:

Une question au passage: L'auteur du fichier initial est aussi membre d'XLD ?
Et une autre (déjà posée): As-tu dans tes archives une version du fichier antérieure au 09/10/2020 09h43 ?
 

Discussions similaires

Réponses
13
Affichages
474