Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

correction ou modi du code

  • Initiateur de la discussion Initiateur de la discussion Ilino
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Ilino

XLDnaute Barbatruc
Forum Bonsoir
je souhaite avoir plus de eclaircissement concernant ce Code ci dessous
Code:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, c As Range
Set r = Intersect(Target, Range("J11:J" & Rows.Count), Me.UsedRange)
If r Is Nothing Then Exit Sub
With Feuil1 'Codename de la feuille FGP 2014
  .[AX:BG].EntireColumn.Hidden = False 'affiche le tableau modèle
  For Each r In r 'en cas d'entrées multiples
    If IsDate(r) Then
      If IsError(Application.Match(r, .Rows(28), 0)) Then
         Set c = .Cells(27, .Columns.Count).End(xlToLeft)(2, 3)
        .[AX:BG].Copy c.EntireColumn
        c.EntireColumn.Resize(26, 10).Clear
        
        c = r 'entrée de la date
      End If
    End If
  Next
  .[AX:BG].EntireColumn.Hidden = True 'masque
End With
End Sub

A quel niveau je modifier le code pour afficher la date (titre du tableau) a la ligne 26 ?
j'ai testé la ligne suivante du code et ça n a pas marché

If IsError(Application.Match(r, .Rows(26), 0)) Then

Merci pour votre aide
Edit: ce code est elaboré par Notre AMI JOB (grazie)😱
 

Pièces jointes

Dernière édition:
Re : correction ou modi du code

Re,

Dans ce cas, vraiment, tu pouvais adapter tout seul 🙄

On revient au fil d'origine avec juste la date comme référence en ligne 26 :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, c As Range
Set r = Intersect(Target, Range("J11:J" & Rows.Count), Me.UsedRange)
If r Is Nothing Then Exit Sub
With Feuil1 'Codename de la feuille FGP 2014
  .[AY:BG].EntireColumn.Hidden = False 'affiche le tableau modèle
  For Each r In r 'en cas d'entrées multiples
    If IsDate(r) Then
      If IsError(Application.Match(r, .Rows(26), 0)) Then
        Set c = .Cells(27, .Columns.Count).End(xlToLeft)(0, 3)
        .[AY:BG].Copy c.EntireColumn
        c = r 'entrée de la date
      End If
    End If
  Next
  .[AY:BG].EntireColumn.Hidden = True 'masque
End With
End Sub
Pas question d'entrer à la fois le ou les numéros et la date, ce serait inutilement compliqué.

Fichier (3).

A+
 

Pièces jointes

Re : correction ou modi du code

Re,

MERCI DONC JE N AI PAS DE CHOIX?

Avec toi on ne sait jamais ce que tu veux ni quand tu vas t'arrêter, ce n'est plus la question initiale !

Mais comme je suis dans un bon jour voici la macro qui crée une liste de validation pour choisir les N° dans la feuille "FGP 2014" :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim F1 As Worksheet, F2 As Worksheet, c As Range
Set F1 = Feuil2: Set F2 = Feuil3 'CodeNames des feuilles Facturation et Liste
Columns("BJ").Resize(, Columns.Count - Columns("BJ").Column + 1).Validation.Delete
Set c = Cells(26, ActiveCell.Column)
If ActiveCell.Row > 28 And IsDate(c) And ActiveCell.Interior.ColorIndex = xlNone Then
  F2.Cells.Delete 'RAZ
  With Intersect(F1.[A10].CurrentRegion, F1.[A:N])
    .Cells(2, .Columns.Count + 1) = "=J11=" & c.Value2
    .AdvancedFilter xlFilterInPlace, .Cells(1, .Columns.Count + 1).Resize(2)
    .SpecialCells(xlCellTypeVisible).Copy F2.[A1]
    .Cells(2, .Columns.Count + 1) = ""
    .AdvancedFilter xlFilterInPlace, ""
  End With
  F2.UsedRange.Columns(1).Name = "Liste"
  ActiveCell.Validation.Add xlValidateList, Formula1:="=Liste"
  F2.Rows(1).Delete
End If
End Sub
Fichier (4).

A+
 

Pièces jointes

Dernière édition:
Re : correction ou modi du code

Re,

Le filtrage précédent prend trop de temps s'il y a beaucoup de lignes.

Il vaut mieux utiliser un tableau VBA (matrice), c'est très rapide :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim F1 As Worksheet, F2 As Worksheet, c As Range, t, dat As Date, i&, n&
Set F1 = Feuil2: Set F2 = Feuil3 'CodeNames des feuilles Facturation et Liste
Columns("BJ").Resize(, Columns.Count - Columns("BJ").Column + 1).Validation.Delete
Set c = Cells(26, ActiveCell.Column)
If ActiveCell.Row > 28 And IsDate(c) And ActiveCell.Interior.ColorIndex = xlNone Then
  t = Intersect(F1.[A10].CurrentRegion, F1.[A:J]) 'matrice, plus rapide
  dat = c
  For i = 1 To UBound(t)
    If t(i, 10) = dat Then n = n + 1: t(n, 1) = t(i, 1)
  Next
  F2.Columns(1).ClearContents 'RAZ
  If n Then F2.[A1].Resize(n) = Application.Index(t, , 1)
  F2.UsedRange.Name = "Liste"
  ActiveCell.Validation.Add xlValidateList, Formula1:="=Liste"
End If
End Sub
Fichier (5).

A+
 

Pièces jointes

Dernière édition:
Re : correction ou modi du code

Bonjour MAITRE, Forum😱
SORRY 😱lors d'execution du code ; j'ai un message d'erreur de type
"Erreur d'execution 1004"
Erreur définie par l'application ou par l'objet"
sur la ligne du code
Code:
ActiveCell.Validation.Add xlValidateList, Formula1:="=Listes"
Grazie
NB: j'ai changé le nom de la liste deroulante de " Liste" au "Listes" avec S
A+
Edit: la feuille "FGP 2014" est verrouiller
 
Dernière édition:
Re : correction ou modi du code

Re Bonjour
ci dessous le code
Code:
Private Sub Worksheet_SelectionChange(ByVal c As Range)  'Déplacer le bouton avec la feuille






If ActiveSheet.Name = "FGP 2014" Then
    With ActiveSheet.Shapes("CommandButton109")
     .Top = c.Top - 25
     .Left = c.Left + 150
    End With
 

    With ActiveSheet.Shapes("CommandButton15")
    .Top = c.Top - 25
    .Left = c.Left + 195
    End With
End If


Dim F1 As Worksheet, F2 As Worksheet, c1 As Range, t, dat As Date, i&, n&
Set F1 = Feuil7: Set F2 = Feuil5 'CodeNames des feuilles Facturation et Liste
Columns("BJ").Resize(, Columns.Count - Columns("BJ").Column + 1).Validation.Delete
Set c1 = Cells(26, ActiveCell.Column)
If ActiveCell.Row > 28 And IsDate(c1) And ActiveCell.Interior.ColorIndex = xlNone Then
  t = Intersect(F1.[A10].CurrentRegion, F1.[A:J]) 'matrice, plus rapide
  dat = c1
  For i = 1 To UBound(t)
    If t(i, 10) = dat Then n = n + 1: t(n, 1) = t(i, 1)
  Next
  F2.Columns(1).ClearContents 'RAZ
  If n Then F2.[A1].Resize(n) = Application.Index(t, , 1)
  F2.UsedRange.Name = "Listes"
  

  ActiveCell.Validation.Add xlValidateList, Formula1:="=Listes"

End If


End Sub
grazie
 
Re : correction ou modi du code

Bonjour Ilino, le forum,

Si tu protèges la feuille "FGP 2014" il faut prendre des précautions :

1) Les cellules non colorées du tableau modèle AY:BG doivent être déverrouillées afin qu'on puisse les modifier dans les tableaux créés.

Cela se fait facilement avec cette macro dans le code de la feuille :

Code:
Sub Déverrouille()
Dim r As Range
Set r = [AY28:BD1582] 'plage à adapter éventuellement
Me.Unprotect "mdp" 'mot de passe à adapter
For Each r In r
  If r.Interior.ColorIndex = xlNone Then r.Locked = False
Next
Me.Protect "mdp" 'mot de passe à adapter
End Sub
2) Dans les 2 macros événementielles, il faut déprotéger la feuille avant de la modifier et la reprotéger à la fin.

Par ailleurs j'ai vu sur ce fil que tu as un problème :

https://www.excel-downloads.com/threads/fichier-tres-lent-au-demarrage.223439/

Il est dû au fait que le nom défini T utilise la fonction volatile DECALER.

De ce fait les formules avec SOMME.SI en colonne T de la feuille "Facturation" sont toutes recalculées à l'ouverture et chaque fois qu'on modifie une cellule du classeur.

Je vais faire une version (6) pour remédier à cette situation.

A+
 
Re : correction ou modi du code

Re,

Dans ce fichier (6) j'ai juste protégé la feuille "FGP 2014" et fait les adaptations indiquées au post #23.

Il ne pose aucun problème, donc à toi de voir ce qui ne va pas dans ton fichier.

Par ailleurs j'ai testé ce fichier avec 200 tableaux créés donc 200 dates différentes en feuille "Facturation", ce qui n'est pas beaucoup.

Dans la feuille "FGP 2014" la macro SelectionChange s'exécute en 0,7 seconde, ce qui est très acceptable.

Mais le fichier pèse alors 25 Mo et sur Excel 2010 il met 80 secondes à s'ouvrir !

Conclusion : c'est uniquement le poids du fichier qui pose problème, et non pas le recalcul des formules.

C'est la conception de ton projet (la copie d'un tableau modèle) qu'il faudrait revoir.

A+
 

Pièces jointes

Dernière édition:
Re : correction ou modi du code

Re,

Note qu'avec les Application.Calculation on réduit de moitié la durée d'exécution de la SelectionChange :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim F1 As Worksheet, F2 As Worksheet, c As Range, t, dat As Date, i&, n&
Set F1 = Feuil2: Set F2 = Feuil3 'CodeNames des feuilles Facturation et Listes
Set c = Cells(26, ActiveCell.Column)
If ActiveCell.Row > 28 And IsDate(c) And ActiveCell.Interior.ColorIndex = xlNone Then
  Application.Calculation = xlCalculationManual
  Me.Unprotect "mdp" 'mot de passe à adapter
  Columns("BJ").Resize(, Columns.Count - Columns("BJ").Column + 1).Validation.Delete
  t = Intersect(F1.[A10].CurrentRegion, F1.[A:J]) 'matrice, plus rapide
  dat = c
  For i = 1 To UBound(t)
    If t(i, 10) = dat Then n = n + 1: t(n, 1) = t(i, 1)
  Next
  F2.Columns(1).ClearContents 'RAZ
  If n Then F2.[A1].Resize(n) = Application.Index(t, , 1)
  F2.[A1].Resize(IIf(n, n, 1)).Name = "Listes"
  ActiveCell.Validation.Add xlValidateList, Formula1:="=Listes"
  Me.Protect "mdp" 'mot de passe à adapter
  Application.Calculation = xlCalculationAutomatic
End If
End Sub
Fichier (7).

Edit : j'ajoute les Application.Calculation dans la macro Change de la feuille "Facturation".

A+
 

Pièces jointes

Dernière édition:
Re : correction ou modi du code

Re Bonsoir maitre
GRAZIE c'est extra formidable .😱
sur mon fichier et apres avoir adapter ton code sur mon fichier , j'ai trouvé qlq difficulté avec le mem message d'errue "1004"
Si tu supprime le numéro ( colonne N°) dans la feuille FGP 2014 dernier tableau tu auras tjr la même erreur précédente
« Erreur d’exécution 1004 : Erreur définie par l’application ou par l’objet »
GRAZIE ET JE SUIS VRAIMENT SORRY😎
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
476
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…