[VBA] Effacer une plage qui varie selon les onglets

nat54

XLDnaute Barbatruc
Bonjour,

Dans le fichier ci-joint je souhaiterais effacer les données
se trouvant dans le tableau de l'absentéisme prévisionnel.

Comme vous le voyez les onglets sont différents :
- 3580 : le tableau à effacer se situe de C25 à L72
- 3945 : le tableau à effacer se situe de C21 à L24

Point de départ du tableau : cellule ABScollage + 2 colonnes à droite (toujours colonne C)
Tableau final : dernière ligne complétée jusqu'à la colonne L

Comment réaliser cela ?

ps : cela me permettra tous les mois de repartir sur une trame vierge et de pouvoir y coller les nouveaux éléments

ps2 : il y a un code dans le fichier où je peux coller les nouvelles données
mais je dois d'abord effacer les anciennes !

Merci d'avance,

Nat
 

Pièces jointes

  • demande.xls
    68.5 KB · Affichages: 66
  • demande.xls
    68.5 KB · Affichages: 61
  • demande.xls
    68.5 KB · Affichages: 63

ERIC S

XLDnaute Barbatruc
Re : [VBA] Effacer une plage qui varie selon les onglets

Bonjour le forum, bonjour nat

pour les 2 pbs

le premier, on peut tester avant si le résultat sera non vide par exemple

valid = WorksheetFunction.CountIf(Range("A:A"), "3580")

valid est le nombre de cellules de A égales à 3580
si valid = 0 inutile de masquer et de copier

pour l'autre pb

si la feuille "codepole" existe, sheets(codepole).select doit répondre à ta question
 

nat54

XLDnaute Barbatruc
Re : [VBA] Effacer une plage qui varie selon les onglets

Bonjour Eric,

Merci mais comment dire "passe à l'étape suivante", ici passer à la partie ENTREE PREV
Le then "" bug..

VB:
''' ABSENTEISME PREVISIONNEL
' Filtrer sur le pôle en question dans le fichier Abs prev
Workbooks.Open ("I:\DRH\EFFECTIF\Fiches_synthétiques_par_pôle\Abs_longues_prev_pour_fiche_synth.xls")
validABS = WorksheetFunction.CountIf(Range("A:A"), "3580")
If validABS = 0 Then "" else
Selection.AutoFilter Field:=1, Criteria1:=CodePole 'field 1 = colonne A, pôle XXXX
End If
' Copier cette sélection
Range("c2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
' Coller cette sélection dans le bon tableau
Windows("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Activate
Range("C" & LigneDebut2).Activate
Selection.PasteSpecial Paste:=xlValues
''' ENTREES PREVISIONNELLES
' Filtrer sur le pôle en question dans le fichier Abs prev
Workbooks.Open ("I:\DRH\EFFECTIF\Fiches_synthétiques_par_pôle\Entrées-prev_pour_fiche_synth.xls")
 

ERIC S

XLDnaute Barbatruc
Re : [VBA] Effacer une plage qui varie selon les onglets

re

il faut que tu adaptes mon code à ton fichier d'origine, comme tes infos critères semblent être en A cela devrait donner. 2 possibilités :

1/ si valeur à 0 tu sors totalement du code

Code:
validABS = WorksheetFunction.CountIf(Range("A:A",Codepole)
If validABS=0 then msgbox "Pas de donnée valide pour " & codepole:exit sub

2/ soit tu court-circuites une partie du code

Code:
validABS = WorksheetFunction.CountIf(Range("A:A",Codepole)
If not validABS = 0 Then
.......le filtre et la copie à exécuter
end if
.....suite du code
 
Dernière édition:

nat54

XLDnaute Barbatruc
Re : [VBA] Effacer une plage qui varie selon les onglets

Re,

Wow c'est nickel Eric !

VB:
Sub Construire_fiches()
FinTableauMapping = Sheets("Mapping").Range("A" & "65535").End(xlUp).Row
For i = 2 To FinTableauMapping
Codepole = Workbooks("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Sheets("Mapping").Range("a" & i).Value
' Déterminer les différents tableaux
Sheets("3580").Select
LigneDebut1 = WorksheetFunction.Match("1. Effectifs", Range("C:C"), 0) + 2
LigneFin1 = WorksheetFunction.Match("TOTAL POCPBU", Range("C:C"), 0) - 1
LigneDebut2 = WorksheetFunction.Match("2. Absences longues prévisionnelles (AT/LM/LD/MAT/MPRO)", Range("C:C"), 0) + 2
LigneFin2 = WorksheetFunction.Match("3. Entrées prévisionnelles", Range("C:C"), 0) - 2
LigneDebut3 = WorksheetFunction.Match("3. Entrées prévisionnelles", Range("C:C"), 0) + 2
LigneFin3 = WorksheetFunction.Match("4. Sorties prévisionnelles", Range("C:C"), 0) - 2
LigneDebut4 = WorksheetFunction.Match("4. Sorties prévisionnelles", Range("C:C"), 0) + 2
LigneFin4 = Range("C" & Rows.Count).End(xlUp).Row + 1
' Effacer les anciennes données
Range("C" & LigneDebut2 & ":L" & LigneFin2).ClearContents
Range("C" & LigneDebut3 & ":K" & LigneFin3).ClearContents
Range("C" & LigneDebut4 & ":K" & LigneFin4).ClearContents

''' ABSENTEISME PREVISIONNEL
' Filtrer sur le pôle en question dans le fichier Abs prev
Workbooks.Open ("I:\DRH\EFFECTIF\Fiches_synthétiques_par_pôle\Abs_longues_prev_pour_fiche_synth.xls")
' Vérifier que le pôle a des absences prév sinon le copier/coller du filtre auto plante
ValidABS = WorksheetFunction.CountIf(Range("A:A"), "3580")
If Not ValidABS = 0 Then
Selection.AutoFilter Field:=1, Criteria1:=Codepole 'field 1 = colonne A, pôle XXXX
' Copier cette sélection
Range("c2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
' Coller cette sélection dans le bon tableau
Windows("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Activate
Range("C" & LigneDebut2).Activate
Selection.PasteSpecial Paste:=xlValues
End If

''' ENTREES PREVISIONNELLES
' Filtrer sur le pôle en question dans le fichier Abs prev
Workbooks.Open ("I:\DRH\EFFECTIF\Fiches_synthétiques_par_pôle\Entrées-prev_pour_fiche_synth.xls")
' Vérifier que le pôle a des entrées prév sinon le copier/coller du filtre auto plante
ValidENTREES = WorksheetFunction.CountIf(Range("A:A"), "3580")
If Not ValidENTREESS = 0 Then
Selection.AutoFilter Field:=1, Criteria1:=Codepole 'field 1 = colonne A, pôle XXXX
' Copier cette sélection
Range("c2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
' Coller cette sélection dans le bon tableau
Windows("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Activate
Range("C" & LigneDebut3).Activate
Selection.PasteSpecial Paste:=xlValues
End If


''' SORTIES PREVISIONNELLES
' Filtrer sur le pôle en question dans le fichier Abs prev
Workbooks.Open ("I:\DRH\EFFECTIF\Fiches_synthétiques_par_pôle\Sorties-prev_pour_fiche_synth.xls")
' Vérifier que le pôle a des sorties prév sinon le copier/coller du filtre auto plante
ValidSORTIES = WorksheetFunction.CountIf(Range("A:A"), "3580")
If Not ValidSORTIES = 0 Then
Selection.AutoFilter Field:=1, Criteria1:=Codepole 'field 1 = colonne A, pôle XXXX
' Copier cette sélection
Range("c2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
' Coller cette sélection dans le bon tableau
Windows("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Activate
Range("C" & LigneDebut4).Activate
Selection.PasteSpecial Paste:=xlValues
End If
Next
' Fermer les classeurs d'export
Windows("Abs_longues_prev_pour_fiche_synth.xls").Activate
ActiveWorkbook.Close False
Windows("Entrées-prev_pour_fiche_synth.xls").Activate
ActiveWorkbook.Close False
Windows("Sorties-prev_pour_fiche_synth.xls").Activate
ActiveWorkbook.Close False
End Sub

Il manque juste à variabiliser le 3580 et ça sera terminé !
Ta réponse ne fonctionne pas
pour l'autre pb
si la feuille "codepole" existe, sheets(codepole).select doit répondre à ta question
il n'y a pas une histoire de guillemets ?!

Codepole est en variable au début de mon code
et a la valeur 3580 ici
donc j'aimerai que la macro travaille au début de la boucle sur l'onglet 3580
 

nat54

XLDnaute Barbatruc
Re : [VBA] Effacer une plage qui varie selon les onglets

Re,

Je ne peux pas faire cela car je dois boucler sur la liste d'onglet se trouvant dans l'onglet Mapping.
Cf. le fichier joint
 

Pièces jointes

  • FICHES_SYNTHETIQUES_DRH_par_pôle.xls
    258 KB · Affichages: 40
  • FICHES_SYNTHETIQUES_DRH_par_pôle.xls
    258 KB · Affichages: 42
  • FICHES_SYNTHETIQUES_DRH_par_pôle.xls
    258 KB · Affichages: 42

ERIC S

XLDnaute Barbatruc
Re : [VBA] Effacer une plage qui varie selon les onglets

Re

ta macro réalise déjà cela, par

Code:
FinTableauMapping = Sheets("Mapping").Range("A" & "65535").End(xlUp).Row
For i = 2 To FinTableauMapping
Codepole = Workbooks("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Sheets("Mapping").Range("a" & i).Value

par précaution, avant je placerais

dim Codepole as string (pour gérer du texte et non des nombres)

et ensuite dans les différentes lignes concernées, je remplacerais le "3580", exemple :

Code:
Sheets(Codepole).Select
 

nat54

XLDnaute Barbatruc
Re : [VBA] Effacer une plage qui varie selon les onglets

Re,

J'ai crié victoire trop vite !

Car ça boucle bien sur le pôle suivant (3945) mais ça bug sur la ligne
Code:
Sheets(Codepole).Select
 

Pièces jointes

  • FICHES_SYNTHETIQUES_DRH_par_pôle.xls
    258 KB · Affichages: 46
  • Entrées-prev_pour_fiche_synth.xls
    14 KB · Affichages: 36
  • Abs_longues_prev_pour_fiche_synth.xls
    13.5 KB · Affichages: 32
  • Sorties-prev_pour_fiche_synth.xls
    14 KB · Affichages: 37
  • FICHES_SYNTHETIQUES_DRH_par_pôle.xls
    258 KB · Affichages: 47
  • Entrées-prev_pour_fiche_synth.xls
    14 KB · Affichages: 37
  • Abs_longues_prev_pour_fiche_synth.xls
    13.5 KB · Affichages: 32
  • Sorties-prev_pour_fiche_synth.xls
    14 KB · Affichages: 36
  • FICHES_SYNTHETIQUES_DRH_par_pôle.xls
    258 KB · Affichages: 49
  • Entrées-prev_pour_fiche_synth.xls
    14 KB · Affichages: 34
  • Abs_longues_prev_pour_fiche_synth.xls
    13.5 KB · Affichages: 34
  • Sorties-prev_pour_fiche_synth.xls
    14 KB · Affichages: 34

ERIC S

XLDnaute Barbatruc
Re : [VBA] Effacer une plage qui varie selon les onglets

re

difficile de tout analyser, les chemins "absolus" n'aident pas car mon pc n'a pas la même config que le tien

quelques remarques :

Code:
Dim Codepole As String
'modif ES
monrépertoire = ThisWorkbook.Path
mafenêtre = ActiveWindow.Caption
FinTableauMapping = Sheets("Mapping").Range("A" & "65535").End(xlUp).Row
For i = 2 To FinTableauMapping
'modif es
Windows(mafenêtre).Activate
Codepole = Workbooks("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Sheets("Mapping").Range("a" & i).Value

tu mémorise le chemin de ton fichier pour recomposer les chemins des autres

Code:
' Filtrer sur le pôle en question dans le fichier Abs prev
    Workbooks.Open (monrépertoire & "\Abs_longues_prev_pour_fiche_synth.xls")

autre point, comme tu n'effectues pas toutes tes boucles il faut t'assurer que ta fenêtre active revient bien à ton fichier, c'est la ligne windows(mafenêtr).activate ajoutée en début de macro

dernier point je n'ai pas eu le temps de le fouiller mais vérifie bien pour chaque tableau qu'il y a des enregistrements, il faudra peut-être adapter la ligne
Code:
    ValidABS = WorksheetFunction.CountIf(Range("A:A"), Codepole)
en utilisant le principe des crières de début et fin de tableau, en effet, un enregistrement 3580 pour le premier tableau n esignifie pas qu'il y a un enregistrement 3580 sur le deuxième (à voir si tu as des erreurs).

Là je vais y aller, je repasserai sans doute en soirée
 

nat54

XLDnaute Barbatruc
Re : [VBA] Effacer une plage qui varie selon les onglets

Re,

Maintenant je peux crier victoire et te remercier grandement !

Le code final

VB:
Sub Construire_fiches()
' Déprotéger classeur
Application.Run "FICHES_SYNTHETIQUES_DRH_par_pôle.xls!DeProtegeClasseur"
Dim Codepole As String
monrépertoire = ThisWorkbook.Path
mafenêtre = ActiveWindow.Caption
FinTableauMapping = Sheets("Mapping").Range("A" & "65535").End(xlUp).Row
Workbooks.Open (monrépertoire & "\Abs_longues_prev_pour_fiche_synth.xls")
Workbooks.Open (monrépertoire & "\Entrées-prev_pour_fiche_synth.xls")
Workbooks.Open (monrépertoire & "\Sorties-prev_pour_fiche_synth.xls")
For i = 2 To FinTableauMapping
Windows(mafenêtre).Activate
Codepole = Workbooks("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Sheets("Mapping").Range("a" & i).Value
' Déterminer les différents tableaux
Sheets(Codepole).Select
LigneDebut1 = WorksheetFunction.Match("1. Effectifs", Range("C:C"), 0) + 2
LigneFin1 = WorksheetFunction.Match("TOTAL POCPBU", Range("C:C"), 0) - 1
LigneDebut2 = WorksheetFunction.Match("2. Absences longues prévisionnelles (AT/LM/LD/MAT/MPRO)", Range("C:C"), 0) + 2
LigneFin2 = WorksheetFunction.Match("3. Entrées prévisionnelles", Range("C:C"), 0) - 2
LigneDebut3 = WorksheetFunction.Match("3. Entrées prévisionnelles", Range("C:C"), 0) + 2
LigneFin3 = WorksheetFunction.Match("4. Sorties prévisionnelles", Range("C:C"), 0) - 2
LigneDebut4 = WorksheetFunction.Match("4. Sorties prévisionnelles", Range("C:C"), 0) + 2
LigneFin4 = Range("C" & Rows.Count).End(xlUp).Row + 1
' Effacer les anciennes données
Range("C" & LigneDebut2 & ":L" & LigneFin2).ClearContents
Range("C" & LigneDebut3 & ":K" & LigneFin3).ClearContents
Range("C" & LigneDebut4 & ":K" & LigneFin4).ClearContents

''' ABSENTEISME PREVISIONNEL
    Workbooks("Abs_longues_prev_pour_fiche_synth.xls").Activate
' Vérifier que le pôle a des absences prév sinon le copier/coller du filtre auto plante
    ValidABS = WorksheetFunction.CountIf(Range("A:A"), Codepole)
If Not ValidABS = 0 Then
' Filtrer sur le pôle en question dans le fichier Abs prev
Selection.AutoFilter Field:=1, Criteria1:=Codepole  'field 1 = colonne A, pôle XXXX
' Copier cette sélection
    Range("c2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
' Coller cette sélection dans le bon tableau
    Windows("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Activate
    Range("C" & LigneDebut2).Activate
    Selection.PasteSpecial Paste:=xlValues
End If
    
''' ENTREES PREVISIONNELLES
    Workbooks("Entrées-prev_pour_fiche_synth.xls").Activate
' Vérifier que le pôle a des entrées prév sinon le copier/coller du filtre auto plante
    ValidENTREES = WorksheetFunction.CountIf(Range("A:A"), Codepole)
If Not ValidENTREES = 0 Then
' Filtrer sur le pôle en question dans le fichier Entrees prev
    Selection.AutoFilter Field:=1, Criteria1:=Codepole  'field 1 = colonne A, pôle XXXX
' Copier cette sélection
    Range("c2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
' Coller cette sélection dans le bon tableau
    Windows("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Activate
    Range("C" & LigneDebut3).Activate
    Selection.PasteSpecial Paste:=xlValues
End If
   
   
''' SORTIES PREVISIONNELLES
' Filtrer sur le pôle en question dans le fichier Abs prev
    Workbooks("Sorties-prev_pour_fiche_synth.xls").Activate
    ' Vérifier que le pôle a des sorties prév sinon le copier/coller du filtre auto plante
    ValidSORTIES = WorksheetFunction.CountIf(Range("A:A"), Codepole)
If Not ValidSORTIES = 0 Then
' Filtrer sur le pôle en question dans le fichier Sorties prev
    Selection.AutoFilter Field:=1, Criteria1:=Codepole  'field 1 = colonne A, pôle XXXX
' Copier cette sélection
    Range("c2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
' Coller cette sélection dans le bon tableau
    Windows("FICHES_SYNTHETIQUES_DRH_par_pôle.xls").Activate
    Range("C" & LigneDebut4).Activate
    Selection.PasteSpecial Paste:=xlValues
End If
Next
' Fermer les classeurs d'export
Windows("Abs_longues_prev_pour_fiche_synth.xls").Activate
ActiveWorkbook.Close False
Windows("Entrées-prev_pour_fiche_synth.xls").Activate
ActiveWorkbook.Close False
Windows("Sorties-prev_pour_fiche_synth.xls").Activate
ActiveWorkbook.Close False
' Protéger classeur
Application.Run "FICHES_SYNTHETIQUES_DRH_par_pôle.xls!ProtegeClasseur"
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 839
Messages
2 092 687
Membres
105 509
dernier inscrit
hamidvba