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

Voici un exemple de tatonnement.

Pas d'erreur d'execution, mais pas concluent.

Le premier tableau se filtre bien avec le numéro secteur. Le deuxiéme tableau va en A40 (j'ai mis large, l'idéal serai qu'il commence deux ligne aprés la fin du premier) sauf qu'il ne filtre pas, il me renvoi tout les donné quand je met 0 en K2.

Private Sub worksheet_Change(ByVal target As Range)

'Déclaration des variables

Dim pl As Range, derl&, nl&, dl&
If target.Address <> "$K$2" Then Exit Sub
Application.ScreenUpdating = False
test = True
Rows(3).Resize(1000).Clear
With Sheets("Bases Communes")
dl = .Range("A" & .Rows.Count).End(xlUp).Row
Set pl = .Range("A1:H" & dl)
.Range("A3").AutoFilter field:=9, Criteria1:=Sheets("Fiche Secteur").[K2] 'Filtre le tableau par rapport au secteur
nl = Range("A3:A" & .Range("A65536").End(xlUp).Row).SpecialCells(12).Count
pl.SpecialCells(12).Copy Range("A4") 'Copie le tableau filtré
.Range("A3").AutoFilter 'suprime le filtre
End With

With Sheets("Bases Donnée Démographique")
dl1 = .Range("A" & .Rows.Count).End(xlUp).Row
Set pl1 = .Range("A1:H" & dl)
.Range("A3").AutoFilter field:=9, Criteria1:=Sheets("Fiche Secteur").[K2] 'Filtre le tableau par rapport au secteur
nl1 = Range("A3:A" & .Range("A65536").End(xlUp).Row).SpecialCells(12).Count
pl1.SpecialCells(12).Copy Range("A40") 'Copie le tableau filtré
.Range("A3").AutoFilter 'suprime le filtre
End With

test = fasle
Application.ScreenUpdating = True
End Sub
 

Staple1600

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

Re

Antho35
Tout à l'heure tes entêtes étaient en ligne 4
Set pl = .Range("A4:H" & dl)
Maintenant c'est en ligne 3 !
Pourquoi ce changement?
C'est source d'erreur dans le futur!
Figes la structure de ton classeur une fois pour toutes.

Tout à l'heure je te conseillais également de chercher à comprendre ce que fait chaque ligne, tu te souviens?
Tu as donc compris ce que fait celle-ci
Rows(3).Resize(1000).Clear

Si oui, tu comprendras alors d’où vient le problème ;)
 
Dernière édition:

Antho35

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

Oui c'est mon côté tétu qui ressort, je fige une bonne foi pour tout les entêtes sur les 4 tableaux en ligne 3.

Par contre je n'ai pas encor tout compris à quoi ser
Code:
Rows(3).Resize(1000).Clear
 

Staple1600

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

Re

Antho35
Pour le comprendre il suffisait de bien lire mon message de 16h51
(en premier lieu, dans Excel: faire ALT+F11 puis F1)

En clair, voir ce que dit l'aide VBA quand on ne sait pas trop ce qu'un code est censé faire :rolleyes:

PS1: Si tu suivais attentivement mes conseils, les choses iraient plus vite ;)

Quoique j'oubliais ta maxime dans ta signature;)

Alors repartons pour longtemps pour des aventures vbaistiques ;)

PS2: Pour voir à quoi cela sert, tu peux aussi mettre la ligne en commentaire en ajoutant au début un '
ensuite tu testes et tu observes ce qui se passe
puis tu supprimes ce ' et tu testes à nouveau pour voir la différence.
 
Dernière édition:

Antho35

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

Le deuxiéme tableau marche, il faut juste que je trouve une solution pour venir foute mon tableau 2 deux ligne aprés la fin du 1er.

Je vais pouvoir m'attaquer au reste des deux autres tableaux.
 

Staple1600

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

Re


Ok je laisse tomber (pour le moment)

Je t'invite à consulter l'aide VBA et tu dédaignes le faire.

A quoi bon te donner des conseils, si tu t'obstines à ne pas les suivre ???

Pour ta gouverne:
Code:
Rows(3).Resize(1000).Clear
'efface tout de la ligne 3 à la ligne 1002
Chose aisément compréhensible en mettant à profit tout ce que je t'ai dis jusque là dans ce fil ....
Car tu pouvais tester toi-même tout ceci pour comprendre cette simple ligne
Code:
Msgbox Rows(3).Address
Code:
MsgBox Rows(3).Resize(1000).Address
Code:
Range("A1")="Test"
Range("A1").Clear
En ces quelques tests, on comprenait alors qu'on effaçait les données existantes avant de recevoir les données issues du filtre.
 

Antho35

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

Oui je vient de tester j'ai modifié le code de cette ligne 2 au lieu de 3 et effectivment çà m'a virer la ligne 2 donc k2.

le clear me disait quelque chose c'est le reste qui me disais rien.

Cependant reste juste à position les tableaux les un en dessous des autres (2 lignes)

Avec l'autre partie du code, il ne le fait pas puisuqe je lui dit d'aller coller le tableau en a40, si je met à a20, il se met en a 20 mais la fin du 1er tableau n'apparait plus, c'est logique.

Donc comment contrer ???
 

Antho35

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

Voila l'intégralité du code avec l'ensemble de mes tableaux.

Il me reste la dernière étapes, c'est à dire améliorer le code pour ne pas avoir des lignes vides. Actuellement le code fait copier le tableau a t - elle et t-elle endroit, je cherche juste à ce que chaque tableau vient deux ligne après le dernier.

Merci

Private Sub worksheet_Change(ByVal target As Range)

'Déclaration des variables

Dim pl As Range, derl&, nl&, dl&
If target.Address <> "$K$2" Then Exit Sub
Application.ScreenUpdating = False
test = True
Rows(3).Resize(1000).Clear

With Sheets("Bases Communes")
dl = .Range("A" & .Rows.Count).End(xlUp).Row
Set pl = .Range("A1:H" & dl)
.Range("A3").AutoFilter field:=10, Criteria1:=Sheets("Fiche Secteur").[K2] 'Filtre le tableau par rapport au secteur
nl = Range("A3:A" & .Range("A65536").End(xlUp).Row).SpecialCells(12).Count
pl.SpecialCells(12).Copy Range("A4") 'Copie le tableau filtré
.Range("A3").AutoFilter 'suprime le filtre
End With


With Sheets("Bases Donnée Démographique")
dl1 = .Range("A" & .Rows.Count).End(xlUp).Row
Set pl1 = .Range("B1:I" & dl)
.Range("A3").AutoFilter field:=10, Criteria1:=Sheets("Fiche Secteur").[K2] 'Filtre le tableau par rapport au secteur
nl1 = Range("A3:A" & .Range("A65536").End(xlUp).Row).SpecialCells(12).Count
pl1.SpecialCells(12).Copy Range("A40") 'Copie le tableau filtré
End With

With Sheets("Bases Résultat 2013")
dl2 = .Range("A" & .Rows.Count).End(xlUp).Row
Set pl2 = .Range("C1:J" & dl)
.Range("A3").AutoFilter field:=1, Criteria1:=Sheets("Fiche Secteur").[K2] 'Filtre le tableau par rapport au secteur
nl2 = Range("A3:A" & .Range("A65536").End(xlUp).Row).SpecialCells(12).Count
pl2.SpecialCells(12).Copy Range("A75") 'Copie le tableau filtré
test = fasle
Application.ScreenUpdating = True
End With


With Sheets("Bases Résultat 2012")
dl3 = .Range("A" & .Rows.Count).End(xlUp).Row
Set pl3 = .Range("C1:J" & dl)
.Range("A3").AutoFilter field:=1, Criteria1:=Sheets("Fiche Secteur").[K2] 'Filtre le tableau par rapport au secteur
nl3 = Range("A3:A" & .Range("A65536").End(xlUp).Row).SpecialCells(12).Count
pl3.SpecialCells(12).Copy Range("A108") 'Copie le tableau filtré
test = fasle
Application.ScreenUpdating = True
End With
End Sub
 

Pièces jointes

  • Bases Test VBA 2.xls
    221 KB · Affichages: 41

Staple1600

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

Re

Antho35
Je te laisse tester et mettre la main dans le cambouis pour la dernière feuille
(il suffit de continuer sur le même principe)
PS: Il y a surement moyen d'optimiser la syntaxe de tout ceci (avec un boucle par exemple)
(Pour éviter la redondance de code pour chaque feuille)

Code:
Private Sub worksheet_Change(ByVal target As Range)
'Déclaration des variables
Dim pl As Range, derl&, nl&, dl&, fTab1&, fTab2&, fTab3&
If target.Address <> "$K$2" Then Exit Sub
Application.ScreenUpdating = False
test = True
Rows(3).Resize(1000).Clear

With Sheets("Bases Communes")
    dl = .Range("A" & .Rows.Count).End(xlUp).Row
    Set pl = .Range("A1:H" & dl)
    .Range("A3").AutoFilter field:=10, Criteria1:=Sheets("Fiche Secteur").[K2]   'Filtre le tableau par rapport au secteur
    nl = Range("A3:A" & .Range("A65536").End(xlUp).Row).SpecialCells(12).Count
    pl.SpecialCells(12).Copy Range("A4") 'Copie le tableau filtré
    fTab1 = Range("A6").CurrentRegion.Rows.Count + 5
    .Range("A3").AutoFilter  'suprime le filtre
End With


With Sheets("Bases Donnée Démographique")
    dl1 = .Range("A" & .Rows.Count).End(xlUp).Row
    Set pl1 = .Range("B1:I" & dl)
    .Range("A3").AutoFilter field:=10, Criteria1:=Sheets("Fiche Secteur").[K2]   'Filtre le tableau par rapport au secteur
    nl1 = Range("A3:A" & .Range("A65536").End(xlUp).Row).SpecialCells(12).Count
    pl1.SpecialCells(12).Copy Range("A" & fTab1 + 3) 'Copie le tableau filtré
    fTab2 = Range("a" & fTab1).Offset(5).CurrentRegion.Rows.Count + 5
    fTab3 = Range("a" & fTab1).Offset(fTab2 - 1).Row
End With
'
With Sheets("Bases Résultat 2013")
    dl1 = .Range("A" & .Rows.Count).End(xlUp).Row
    Set pl1 = .Range("C1:J" & dl)
    .Range("A3").AutoFilter field:=1, Criteria1:=Sheets("Fiche Secteur").[K2]   'Filtre le tableau par rapport au secteur
    nl1 = Range("A3:A" & .Range("A65536").End(xlUp).Row).SpecialCells(12).Count
    pl1.SpecialCells(12).Copy Range("A" & fTab3 + 3) 'Copie le tableau filtré
    test = False
Application.ScreenUpdating = True
End With
'
'
'With Sheets("Bases Résultat 2012")
'dl1 = .Range("A" & .Rows.Count).End(xlUp).Row
'Set pl1 = .Range("C1:J" & dl)
'.Range("A3").AutoFilter field:=1, Criteria1:=Sheets("Fiche Secteur").[K2]   'Filtre le tableau par rapport au secteur
'nl1 = Range("A3:A" & .Range("A65536").End(xlUp).Row).SpecialCells(12).Count
'pl1.SpecialCells(12).Copy Range("A108") 'Copie le tableau filtré
'test = False
'Application.ScreenUpdating = True
'End With
End Sub
 

Discussions similaires

Réponses
7
Affichages
328

Statistiques des forums

Discussions
312 111
Messages
2 085 395
Membres
102 882
dernier inscrit
Sultan94