Suppression onglets donnés

Bonsoir tout le monde,

j'ai besoin d'un conseil car je m'arrache les cheveux depuis qq jour sur un sujet.

Je vous explique....

Depuis un fichier "A.xlsm" j'active une macro qui va ouvrir un fichier "B.xlsm", qui copie un onglet "toto" (le fichier "B" ne contient qu'un seul onglet) et qui, avant de le coller (et c'est là mon problème) va venir vérifier si le fichier "A " n'a pas déjà cet onglet.
Si c'est le cas alors il efface l'onglet dans le fichier "A", sinon il le colle.
J'ai débuté le code mais je n'arrive pas à lui dire que la vérification de l'existence de l'onglet doit se faire dans le fichier "B"

J'ai ça dans un module:

Sub FusionFichiers()

Dim Feuille As Worksheet
'identifier les fichiers et les onglets

chemin = ThisWorkbook.Path
fichier = Dir(chemin & "\*20*.xlsm") ' Premier fichier
Destination = chemin & "\Synthèse.xlsm"

Do While fichier <> ""
Filename = chemin & "\" & fichier
Workbooks.Open Filename
Windows(fichier).Activate
nomOnglet = ActiveSheet.Name

'check si onglet existe
For Each Feuille In ActiveWorkbook.Worksheets
For Each Img In Feuille.Pictures
Img.Delete
Next Img
Next Feuille
'Supprime le bouton d'envoi dispo par mail (inutile ici)


fichier = Dir ' Fichier suivant
Loop

End Sub

Sub Tri_onglets()
Application.ScreenUpdating = False
Dim iSheets%, i%, j%
iSheets = Sheets.Count

For i = 1 To iSheets - 1
For j = i + 1 To iSheets
If Sheets(j).Name < Sheets(i).Name Then
Sheets(j).Move Before:=Sheets(i)
End If
Next j
Next i
Application.ScreenUpdating = True
Sheets("Preparation").Move Before:=Sheets(1)
End Sub

Pouvez vous m'aider svp?

Merci beaucoup

Bonjour,

Voici un essai avec une fonction :

Sub FusionFichiers()

dim wbbase as workbook, wbnv as workbook
Dim Feuille As Worksheet
'identifier les fichiers et les onglets

set wbbase = thisworkbook
chemin = ThisWorkbook.Path
Destination = chemin & "\Synthèse.xlsm"

fichier = Dir(chemin & "\*20*.xlsm") ' Premier fichier
Do While fichier <> ""
    Filename = chemin & "\" & fichier
    set wbnv = Workbooks.Open(Filename)
    nomOnglet = wbnv.sheets(1).Name
    if FeuilleExiste(wbbase, nomOnglet) then
        application.displayalerts = false
        wbbase.sheets(nomOnglet).delete
        application.displayalerts = true 
    end if
    wbnv.sheets(1).copy after:=wbbase.sheets(wbbase.sheets.count)
    fichier = Dir ' Fichier suivant
Loop

End Sub

function FeuilleExiste(Classeur as workbook, NomFeuille$) as boolean
on error resume next
FeuilleExiste = Classeur.Sheets(NomFeuille).Index
end function

Cdlt,

J'ai une erreur:

Type d'arugment ByRef incompatible.

Le compilateur pointe la variable nomOnglet sur la ligne:

If FeuilleExiste(wbbase, nomOnglet) Then

j'ai pu corriger entre temps mais je souhaite que les pages du fichier source soient copiées aussi dans le fichier de destination

Oui, il fallait définir la variable nomOnglet...

Que voulez-vous faire exactement ?

J'envoie à plusieurs personnes un fichier à remplir.

Chaque personne me renvoie son propre fichier renseigné.

Plutot que de devoir ouvrir chaque fichier je souhaite à l'aide d'une maccro copier l'onglet unique de chaque fichier dans un fichier de synthèse.

Tous les fichiers seront dans le même répertoire.

Mon souhait est que lorsque je lance la maccro dans mon fichier de synthèse je puisse vérifier que l'onglet n'existe pas déjà.

Sil existe alors je l'efface dans le fichier de synthèse puis je copie la dernière version du fichier reçu par cette personne.

Sil n'existe pas alors je copie simplement l'onglet du fichier source vers le ficher synthèse.

Je ne souhaite avoir que la dernière version pour chaque personne donc un seul onglet par personne dans mon fichier de synthèse

Je vais regarder avec plus d'attention mais ce qui est censé se passer déjà... Est-ce que "Synthèse.xlsm" est le classeur exécutant, thisworkbook ?

Est-il nécessaire de supprimer la feuille et de la recopier ? Ne pourrait-on pas copier toutes les cellules sur les feuilles déjà existantes (quand elles existent bien sûr) ?

Cdlt,

Oui tout à fait

Merci beaucoup

Est-il nécessaire de supprimer la feuille et de la recopier ? Ne pourrait-on pas copier toutes les cellules sur les feuilles déjà existantes (quand elles existent bien sûr) ?

Voici une proposition de code (pas de grand changement à signaler) :

Sub FusionFichiers()

dim wbdest as workbook, wb as workbook
dim ws as worksheet
dim nomwb$, nomws$

chemin = ThisWorkbook.Path & "\"
set wbdest = thisworkbook

nomwb = Dir(chemin & "*20*.xlsm") ' Premier fichier
Do While nomwb <> ""
    set wb = Workbooks.Open(chemin & nomwb)
    set ws = wb.sheets(1)
    nomws = ws.Name
    if FeuilleExiste(wbdest, nomws) then
        application.displayalerts = false
        wbdest.sheets(nomws).delete
        application.displayalerts = true 
    end if
    ws.copy after:=wbdest.sheets(wbdest.sheets.count)
    wb.close true
    nomwb = Dir ' Fichier suivant
Loop

End Sub

function FeuilleExiste(Classeur as workbook, NomFeuille$) as boolean
on error resume next
FeuilleExiste = Classeur.Sheets(NomFeuille).Index
end function

si bien sur une copie des cellules reviendrait au même

Je ferai un test avec ce code demain

En attendant un grand merci et une bonne soirée

D'accord, et bien dans ce cas, avec l'option copie de cellules (qui évite d'avoir à décider plus ou moins au hasard de l'emplacement de la feuille à copier lorsqu'elle existait déjà) :

Sub FusionFichiers()

dim wbdest as workbook, wb as workbook
dim ws as worksheet
dim nomwb$, nomws$

chemin = ThisWorkbook.Path & "\"
set wbdest = thisworkbook

nomwb = Dir(chemin & "*20*.xlsm") ' Premier fichier
Do While nomwb <> ""
    set wb = Workbooks.Open(chemin & nomwb)
    set ws = wb.sheets(1)
    nomws = ws.Name
    if FeuilleExiste(wbdest, nomws) then
        ws.cells.copy destination:=wbdest.sheets(nomws).cells
    else
        ws.copy after:=wbdest.sheets(wbdest.sheets.count)
    end if
    wb.close true
    nomwb = Dir ' Fichier suivant
Loop

End Sub

function FeuilleExiste(Classeur as workbook, NomFeuille$) as boolean
on error resume next
FeuilleExiste = Classeur.Sheets(NomFeuille).Index
end function

Merci, très bonne soirée à toi également !

On s'approche du but cependant il reste une énigme pour moi, j'ai beau chercher depuis 1h et je ne parviens pas à trouver la faille.

J'ai dit plus haut que chaque classeur ne contenait qu'un seul onglet ce qui est faux, il y en a un visible mais un autre qui s'appelle "Personnels" et qui est caché et verrouillé pour les utilisateurs.

Forcément quand je lance la macro qui répond parfaitement au besoin (un grand merci à toi) chaque fichier est parcouru et le code plante parce que l'onglet "Personnels" est aussi testé mais comme il est protégé ça ne se passe pas bien.

Il faudrait ajouter une condition:

Pour tous les onglets dans la feuille sauf celui qui s'appelle "Personnels"

Ca semble simple dit comme ça mais j'ai des erreurs au compilateur sur les types de variable et je ne parviens pas à les résoudre

Bonjour Micka,

Oui, comme tu as dit qu'il n'y avait qu'un seul onglet, j'ai mis .sheets(1) dans le code mais si ce premier onglet est masqué alors il est possible de remplacer uniquement :

set ws = wb.sheets(1)
'par
set ws = wb.activesheet 'comme c'était le cas dans ton code initial

Sinon :

Do While nomwb <> ""
    set wb = Workbooks.Open(chemin & nomwb)
    for each ws in wb.worksheets
        if ws.visible = true then 'ou if ws.name <> "Personnels" then
            nomws = ws.Name
            if FeuilleExiste(wbdest, nomws) then
                ws.cells.copy destination:=wbdest.sheets(nomws).cells
            else
                ws.copy after:=wbdest.sheets(wbdest.sheets.count)
            end if
            exit for
        end if
    next ws
    wb.close true
    nomwb = Dir ' Fichier suivant
Loop

On boucle sur chaque feuille du classeur et dès qu'une d'entre elles répond à la condition (visibilité ou nom), on fait la copie puis on sort de la boucle (la sortie n'est pas nécessaire ici mais on sait jamais).

Cdlt,

Ca fonctionne parfaitement, je te remercie mille fois
Ca parait si simple quand c'est écrit, j'ai tellement cherché sans trouver ce qui ne semble pas si compliqué quand on a du talent ;-)

Si je peux abuser encore un peu.....ce n'est pas urgent.....quand je lance la macro j'ai pour le moment 3 fichiers à scruter mais je peux en avoir jusqu'à 80 et la macro met du temps, est il possible selon toi de l'optimiser et de rendre invisible aussi les ouvertures et fermetures des fichiers à analyser?

Merci encore

Nickel ! Je suis content !

Oui, c'est normal, il y a certains réflexes qui viennent avec le temps, et à force de résoudre les mêmes problèmes, ça viendra très vite, t'inquiète !

Désolé mais je ne suis pas du tout calé en optimisation du temps d'exécution sachant que, là, tu ouvres quand même 80 fichiers. Déjà tu peux essayer de rajouter les lignes :

application.screenupdating = false 'désactive maj ecran
application.visible = false 'rend excel invisible (d'ailleurs je ne sais pas si desactiver maj ecran est utile dans ce cas)

'le code

application.visible = true
application.screenupdating = true

On pourrait aussi copier uniquement les valeurs des feuilles plutôt que les cellules (mais s'il y a des formules et des formats, c'est compromis).

Mais je pense que tu devrais créer un nouveau sujet, tu obtiendrais meilleures réponses.

Cdlt,

je n'ai laissé que la ligne Application.ScreenUpdating = False pour que Excel se ferme à la fin de la macro.

Il me reste un peu de boulot et je vais ouvrir un nouveau post mais ton code fait le boulot à merveille.

Je te remercie mille fois et te souhaite une très bonne journée.

Micka

Rechercher des sujets similaires à "suppression onglets donnes"