Erreur sur code VBA - Décalage non voulu

Antho35

XLDnaute Occasionnel
Bonjour,

J'ai un petit souccit avec mon code vba contenu dans "fiches secteur"

Il y a un décalage, théoriquement mon tableau données démographique doit venir juste aprés le tableau 'les communes du secteur" si je met le code indiqué ci-après çà décale de façon anormal.

Qui a un petit idée, je pense que je n'en suis pas loin.

Code:
Dim test As Boolean 'déclare la variable test

Private Sub Worksheet_Change(ByVal Target As Range)
Dim o As Object 'déclare la variable o (Onglet)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim nl As Integer 'décalre la variable nl

If test = True Then Exit Sub 'si test est "vrai", sort de la procédure
If Target.Address <> "$J$2" Then Exit Sub 'si le chamgement a lieu ailleurs qu'en J2, sort de la procédure
Application.ScreenUpdating = False 'masque les raffraîchissements d'écran
test = True 'définit la variable test
'efface les éventuelles anciennes données
If Range("C5") <> "DONNES DEMOGRAPHIQUE" Then Range("C5").CurrentRegion.Resize(Range("C5").CurrentRegion.Rows.Count + 1).EntireRow.Delete
Set o = Sheets("Bases Communes") 'définit l'onglet o
dl = o.Cells(Application.Rows.Count, 1).End(xlUp).Rows 'définit la dernière ligne éditée dl de la colonne 1 (=A)
Set pl = o.Range("A2:D" & dl) 'définit la plage pl
o.Range("A2").AutoFilter Field:=5, Criteria1:=Target.Value 'filte le tableau par rapport au secteur
pl.SpecialCells(xlCellTypeVisible).Copy Range("C8") 'copie le tableau filtrée
nl = Range("C8").CurrentRegion.Rows.Count
o.Range("A2").AutoFilter 'supprime le filtre
Range("C5:G7").Cut
Range("C5:G7").Offset(nl + 4, 0).Insert Shift:=xlDown
test = False 'redéfinit la variable test
Application.ScreenUpdating = True 'affiche les raffraîchissements d'écran
End Sub

Et voici le fichier.

Merci
 

Pièces jointes

  • Test 01.xlsx
    25.6 KB · Affichages: 75
  • Test 01.xlsx
    25.6 KB · Affichages: 83
  • Test 01.xlsx
    25.6 KB · Affichages: 81
Dernière édition:

Antho35

XLDnaute Occasionnel
Re : Erreur sur code VBA - Décalage non voulu

Autre test avec ce code

Dim test As Boolean 'déclare la variable test

Private Sub Worksheet_Change(ByVal Target As Range)
Dim o As Object 'déclare la variable o (Onglet)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim nl As Integer 'décalre la variable nl

If test = True Then Exit Sub 'si test est "vrai", sort de la procédure
If Target.Address <> "$J$2" Then Exit Sub 'si le chamgement a lieu ailleurs qu'en J2, sort de la procédure
Application.ScreenUpdating = False 'masque les raffraîchissements d'écran
test = True 'définit la variable test
'efface les éventuelles anciennes données
If Range("A5") <> "DONNES DEMOGRAPHIQUE" Then Range("A5").CurrentRegion.Resize(Range("A5").CurrentRegion.Rows.Count + 1).EntireRow.Delete
Set o = Sheets("Bases Communes") 'définit l'onglet o
dl = o.Cells(Application.Rows.Count, 1).End(xlUp).Rows 'définit la dernière ligne éditée dl de la colonne 1 (=A)
Set pl = o.Range("A2:D" & dl) 'définit la plage pl
o.Range("A2").AutoFilter Field:=5, Criteria1:=Target.Value 'filte le tableau par rapport au secteur
pl.SpecialCells(xlCellTypeVisible).Copy Range("C8") 'copie le tableau filtrée
nl = Range("C8").CurrentRegion.Rows.Count
o.Range("A2").AutoFilter 'supprime le filtre
Range("A5:H7").Cut
Range("A5:H7").Offset(nl + 4, 0).Insert Shift:=xlDown
test = False 'redéfinit la variable test
Application.ScreenUpdating = True 'affiche les raffraîchissements d'écran
End Sub
 

Paf

XLDnaute Barbatruc
Re : Erreur sur code VBA - Décalage non voulu

Bonjour

Le code pour ce que j'ai compris :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim o As Object 'déclare la variable o (Onglet)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim nl As Integer 'décalre la variable nl

If test = True Then Exit Sub 'si test est "vrai", sort de la procédure

If Target.Address <> "$J$2" Then Exit Sub 'si le chamgement a lieu ailleurs qu'en J2, sort de la procédure
        
Application.ScreenUpdating = False 'masque les raffraîchissements d'écran
test = True 'définit la variable test

'efface les éventuelles anciennes données
If Range("A5") <> "DONNES DEMOGRAPHIQUE" Then Range("C5").CurrentRegion.Resize(Range("C5").CurrentRegion.Rows.Count + 1).EntireRow.Delete
Set o = Sheets("Bases Communes") 'définit l'onglet o
dl = o.Range("A" & Rows.Count).End(xlUp).Row

Set pl = o.Range("A2:D" & dl) 'définit la plage pl
o.Range("A2").AutoFilter Field:=5, Criteria1:=Target.Value 'filte le tableau par rapport au secteur
nl = o.Range("A1:A" & o.Range("A65536").End(xlUp).Row).SpecialCells(xlVisible).Count
Rows(4).Resize(nl).Insert
pl.SpecialCells(xlCellTypeVisible).Copy Range("C5") 'copie le tableau filtrée
o.Range("A2").AutoFilter 'supprime le filtre
test = False 'redéfinit la variable test

Application.ScreenUpdating = True 'affiche les raffraîchissements d'écran
End Sub

Par ailleurs, a priori la variable test ne sert à rien ?

A+
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Erreur sur code VBA - Décalage non voulu

Bonsoir le fil, bonsoir le forum,

@ Paf,
La variable test, déclarée au niveau module, sert à éviter le EnableEvents = False que je déteste car en cas de plantage il faut écrire une procédure (donc créer un module puis une procédure) avec un EnableEvents = True pour permette à nouveau l'exécution des macros événementielles. Je préfère passer par une booléenne pour éviter cela...

@Antho
moi aussi j'ai un soucis avec ton code...
 

Paf

XLDnaute Barbatruc
Re : Erreur sur code VBA - Décalage non voulu

Bonsoir Robert

c'est très exactement le soucis que j'ai eu (au début): en cas de plantage du code ou de sortie anticipée, la variable restait à true et le code ne s'exécutait plus .
Mais dans le cas précis est-il bien nécessaire d'utiliser une variable ou EnableEvents puisque le code ne modifie pas la cellule "sensible" ?

A+
 

Antho35

XLDnaute Occasionnel
Re : Erreur sur code VBA - Décalage non voulu

Bonsoir, je vais tester tout cela. Je me suis arracher les cheveux hier.

Robert je me suis servit du code d'un précédent

A grand merci à vous deux, je reviens vers vous plus tard dans la soirée.
 

Antho35

XLDnaute Occasionnel
Re : Erreur sur code VBA - Décalage non voulu

Ok super pour le code, du coup j'ai rajouter des infos dans le tableau qui vient sur la fiche comment faire ou intervenir dans le code sans foute la M....

Par ailleur je dois faire la même chose avec d'autre tableau, en faite se son plusieurs tableau qui vont venir les un en dessous des autres en fonction de la saisie du numéro de secteur.

Antho
 

Antho35

XLDnaute Occasionnel
Re : Erreur sur code VBA - Décalage non voulu

Bonsoir Robert, Bonsoir Paf, Bonsoir le forum

Merci à tout les deux, j'ai essayé d'adapter le code avec les modifications sur la structure de ma fiche. J'ai rajouté en A4 (cellule fusionné) le titre, (En A3 çà passe) sauf que quand j'indique en K2 le numéro de secteur, l'actualisation des données fait "sauté" ce titre. Alors qu'elle ne vienne qu'en A7

Autres remarque si ma cellule k2 est fusionné lorsque les données sont récupéré la colonne k2 se colorie jusqu'a la derniére donnée trouvé (ce qui est pas jolie).

Moi qui pensais en voir le bout.

Je met un bout du fichier

Merci
 

Pièces jointes

  • Copy of Classeur1.xlsm
    39.9 KB · Affichages: 60
  • Copy of Classeur1.xlsm
    39.9 KB · Affichages: 63
  • Copy of Classeur1.xlsm
    39.9 KB · Affichages: 65
Dernière édition:

Paf

XLDnaute Barbatruc
Re : Erreur sur code VBA - Décalage non voulu

Re,

dans le code du dernier classeur:
rajouter
Code:
Dim debdemo As Range

remplacer
Code:
If Range("A7") <> "DEMOGRAPHIES" Then Range("A7").CurrentRegion.Resize(Range("A7").CurrentRegion.Rows.Count + 1).EntireRow.Delete
par
Code:
If Range("A7") <> "DEMOGRAPHIE" Then
'efface les éventuelles anciennes données
    derl = Range("A" & Rows.Count).End(xlUp).Row
    Set debdemo = Range("A1:H" & derl).Find("DEMOGRAPHIE", LookIn:=xlValues)
    If debdemo.Row > 7 Then
        plage = "5:" & debdemo.Row - 3
        Rows(plage).Delete Shift:=xlUp
    End If   
End If

remplacer
Code:
Rows(4).Resize(nl).Insert
par
Code:
Rows(6).Resize(nl - 1).Insert

remplacer
Code:
pl.SpecialCells(xlCellTypeVisible).Copy Range("A7") 'copie le tableau filtrée
par
Code:
pl.SpecialCells(xlCellTypeVisible).Copy Range("A5") 'copie le tableau filtré

A+
 

Antho35

XLDnaute Occasionnel
Re : Erreur sur code VBA - Décalage non voulu

Bonsoir,

Avec çà il a pas l'air d'aimer

Rows(6).Resize(nl - 1).Insert

Petite erreur je suis envoyé directement sur vba.

Merci
 

Pièces jointes

  • Copy of Classeur1.xlsm
    40.4 KB · Affichages: 49
  • Copy of Classeur1.xlsm
    40.4 KB · Affichages: 55
  • Copy of Classeur1.xlsm
    40.4 KB · Affichages: 57
Dernière édition:

Paf

XLDnaute Barbatruc
Re : Erreur sur code VBA - Décalage non voulu

Re,

Il n'aime pas du tout, parce que vous demandez une aide que vous ne suivez pas !

Dans le post #11:
remplacer
Code :
Rows(4).Resize(nl).Insert
par
Code :
Rows(6).Resize(nl - 1).Insert

signifie seulement qu'il faut remplacer une ligne par une autre, pas que la nouvelle ligne peut être copiée où l'on veut!

Essayez de comprendre ce que vous écrivez:
ce qui aurait dû être:
dl = o.Range("A" & Rows.Count).End(xlUp).Row

Set pl = o.Range("A2:H" & dl) 'définit la plage pl
o.Range("A2").AutoFilter Field:=10, Criteria1:=Target.Value 'filte le tableau par rapport au secteur
nl = o.Range("A1:A" & o.Range("A65536").End(xlUp).Row).SpecialCells(xlVisible).Count
Rows(6).Resize(nl - 1).Insert



devient:

dl = o.Range("A" & Rows.Count).End(xlUp).Row
Rows(6).Resize(nl - 1).Insert
Set pl = o.Range("A2:H" & dl) 'définit la plage pl
o.Range("A2").AutoFilter Field:=10, Criteria1:=Target.Value 'filte le tableau par rapport au secteur
nl = o.Range("A1:A" & o.Range("A65536").End(xlUp).Row).SpecialCells(xlVisible).Count


la variable nl utilisée dans Rows(6).Resize(nl - 1).Insert ne recoit de valeur qu'après son emploi !

merci
 

Antho35

XLDnaute Occasionnel
Re : Erreur sur code VBA - Décalage non voulu

Je ne comprend plus riens du tout.



Private Sub Worksheet_Change(ByVal Target As Range)
Dim deddemo As Range
Dim o As Object 'déclare la variable o (Onglet)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim nl As Integer 'décalre la variable nl

If test = True Then Exit Sub 'si test est "vrai", sort de la procédure

If Target.Address <> "$K$2" Then Exit Sub 'si le chamgement a lieu ailleurs qu'en J2, sort de la procédure

Application.ScreenUpdating = False 'masque les raffraîchissements d'écran
test = True 'définit la variable test

'efface les éventuelles anciennes données
If Range("A7") <> "DEMOGRAPHIE" Then
'efface les éventuelles anciennes données
derl = Range("A" & Rows.Count).End(xlUp).Row
Set debdemo = Range("A1:H" & derl).Find("DEMOGRAPHIE", LookIn:=xlValues)
If debdemo.Row > 7 Then
plage = "5:" & debdemo.Row - 3
Rows(plage).Delete Shift:=xlUp
End If
End If

Set o = Sheets("Bases Communes") 'définit l'onglet o
dl = o.Range("A" & Rows.Count).End(xlUp).Row

Set pl = o.Range("A2:H" & dl) 'définit la plage pl

dl = o.Range("A" & Rows.Count).End(xlUp).Row
Rows(6).Resize(nl - 1).Insert
Set pl = o.Range("A2:H" & dl) 'définit la plage pl
o.Range("A2").AutoFilter Field:=10, Criteria1:=Target.Value 'filte le tableau par rapport au secteur
nl = o.Range("A1:A" & o.Range("A65536").End(xlUp).Row).SpecialCells(xlVisible).Count
o.Range("A2").AutoFilter 'supprime le filtre
test = False 'redéfinit la variable test

Application.ScreenUpdating = True 'affiche les raffraîchissements d'écran
End Sub
 

Staple1600

XLDnaute Barbatruc
Re : Erreur sur code VBA - Décalage non voulu

Bonsoir à tous

Antho35
Si j'étais toi, déjà, je commencerai par ajouter ceci dans les déclarations des variables
Dim derl As Long
pour cela est utilisé dans ton code VBA.
derl = Range("A" & Rows.Count).End(xlUp).Row

Je ne comprend plus riens du tout.
C'est pas grave car comme tu le dis toi même ;)
je comprend vite, mais il faut m'expliquer longtemp

On a tout le week-end pour arriver à nos fins. ;)
 

Discussions similaires

Statistiques des forums

Discussions
311 721
Messages
2 081 929
Membres
101 843
dernier inscrit
Thaly