Copie des sheets d’un fichier ouvert avec perte volontaire d

Bonjour à tous,

Je cherche à faire une copie d’un fichier ouvert mais en perdant volontairement les macros du fichier source.

Il s’agit donc de copier un fichier mais pas ses macros.

Le fichier cible doit se trouver dans le répertoire du fichier source et doit porter le même nom mais avec un X comme première lettre du nom pour le différencier.

Je cherche donc à faire fonctionner une commande du type

Fichier = ThisWorkbook.Name

Chemin = ThisWorkbook.Path & "\X" & Fichier

ThisWorkbook.Sheets.Copy saveAs.chemin

Mais la 2ème et 3ème ligne sont assurément erronées !

Merci pour votre aide.

Bonjour

Regarde pour l'extension, intitulé : Macro pour enregistrer une feuille sous un nom précis

https://forum.excel-pratique.com/excel/macro-pour-enregistrer-une-feuille-sous-un-nom-precis-t22672.html

crdlt

André

Bonsoir André,

Merci pour le lien mais... en fait, au départ, on ne connait ni le répertoire de la source (et donc de la copie cible), ni son extension.

En outre, le fichier source comporte plusieurs sheets et doit être ouvert.

Bonsoir,

Sub SauverSheets()
    Dim fichier$
    With ThisWorkbook
        fichier = .Path & "\X" & .Name
        fichier = Replace(fichier, "xlsm", "xlsx")
        Application.DisplayAlerts = False
        .SaveAs fichier, xlOpenXMLWorkbook
        .Close
    End With
End Sub

Cordialement.

Bonsoir MFernand,

Merci pour votre code qui fonctionne parfaitement si la source est bien un fichier xlsm.

Si je teste ce code dans un fichier d'extension xls (qui gère aussi les macros - Voir fichier xls annexé), le fichier cible recopié est bien dépourvu des macros, comme voulu.

Mais... lorsque j'ouvre ce fichier cible, j'ai un message relatif à un problème d'extension "Le format du fichier que vous tentez d'ouvrir <Nom du fichier cible> est différent de celui spécifié par l'extension de fichier. Assurez-vous que le fichier n'est pas endommagé et qu'il provient d'une source fiable".

Peut-on éviter ce problème issu du fait qu'on ne connait pas l'extension du fichier source ?

Merci pour votre aide précieuse.

La macro étant dans le fichier dont tu entends faire une copie, tu dois savoir par définition quelle est son extension au départ et tu en tiens compte dans la macro !

Tu dois aussi savoir avec quels types de fichier tu travailles !

Tu dois aussi décider sous quel format de fichier tu enregistres, de façon que le format corresponde à l'extension !

Bref ! Tu évites de te noyer dans les faux problèmes, et tu prends les décisions qui s'imposent !

Peut-on éviter ce problème issu du fait qu'on ne connait pas l'extension du fichier source ?

Si tu ne fais pas le nécessaire avant (soit à l'enregistrement), tu auras toujours un message d'alerte à l'ouverture !

En effet, je me suis pris les pieds dans le tapis

Va falloir me reposer...

Je connais de fait l'extension de départ, donc pas de problème.

Merci pour ta rapide intervention pour ton code fonctionnel.

Je vais intégrer ce code dans l'ensemble de ma macro demain ou après.

Merci encore.

Cordialement

Hi MFerrand,

La nuit portant conseil, je me demandais s'il était possible d'aller un peu plus loin dans la réflexion, à savoir :

serait-il possible, dans la boucle de copie "With / end with" de préciser qu'on ne copie que le valeurs et formats des cellules de chaque sheet ?

Cela donnerait, au final, une copie "inerte", dépourvue des macros (ça c'est fait) mais aussi des éventuelles formules présentes dans les sheets.

Merciiii déjà.

bonjour

modification de ta macro

Sub SauverSheets()

Dim Fichier$

With ThisWorkbook

Fichier = .Path & "\X" & Split(.Name, ".")(0) & ".xlsx"

Application.DisplayAlerts = False

.SaveAs Fichier, xlOpenXMLWorkbook

.Close

End With

End Sub

sinon moi je préfère faire une copie

Sub Macro1()
Dim Fichier$
    With ThisWorkbook
        Fichier = .Path & "\X" & Split(.Name, ".")(0) & ".xlsx"
    End With
Application.ScreenUpdating = False
    Sheets("Feuil2").Copy
    Cells.Select
    Selection.Copy
    Selection.PasteSpecial xlPasteValues
    Application.CutCopyMode = False
    Range("A1").Select
    ActiveWorkbook.SaveAs Filename:=Fichier, FileFormat:= _
        xlOpenXMLWorkbook, CreateBackup:=False
    ActiveWindow.Close
    Range("A1").Select
End Sub

A+
Maurice

Bien le bonsoir Maurice,

Ta macro fonctionne mais se limite à la sheet2.

Quid si le fichier compte 5 sheets par exemple?

Merci.

bonjour

cherche un peux

il faut tester avec enregistreur de macro

Sub Macro1()
Dim Fichier$
    With ThisWorkbook
        Fichier = .Path & "\X" & Split(.Name, ".")(0) & ".xlsx"
    End With
Application.ScreenUpdating = False
'    Sheets("Feuil2").Copy
    Sheets(Array("Base", "Feuil3")).Copy
'    Cells.Copy
'    Cells.PasteSpecial xlPasteValues
'    Application.CutCopyMode = False
    Range("A1").Select
    ActiveWorkbook.SaveAs Filename:=Fichier, FileFormat:= _
        xlOpenXMLWorkbook, CreateBackup:=False
    ActiveWindow.Close
    Range("A1").Select
End Sub

aller moi je vais au dodo

A+

Maurice

Bonjour,

Sub SauverSheets()
    Dim fichier$, ws As Worksheet
    With ThisWorkbook
        For Each ws In .Worksheets
            ws.UsedRange.Value = ws.UsedRange.Value
        Next ws
        fichier = .Path & "\X" & .Name
        fichier = Replace(fichier, "xlsm", "xlsx")
        Application.DisplayAlerts = False
        .SaveAs fichier, xlOpenXMLWorkbook
        .Close
    End With
End Sub

Voilà pour débarrasser ton classeur de formules. Les formats et mises en forme seront conservés.

[NB- méthode propre à VBA, très nettement plus rapide qu'un copier-coller valeurs !]

Pour revenir à la question du format, pas de problème si tu opères toujours avec la même version d'Excel.

L'extension n'est pas en soi un souci, mais il faut qu'elle soit en adéquation avec le format d'enregistrement (sans quoi tu auras le message d'alerte d'anomalie).

Si tu opères avec Excel 2007 ou postérieur, le format choisi (avec extension .xlsx), fonctionnera sans problème. Par contre, si tu dois conserver une extension .xls (et un format antérieur : xlExcel8) parce que tu es susceptible d'opérer avec une version antérieure, il convient de vérifier si l'indication du format est bien reconnue dans cette version antérieure (la constante de format concernée pouvait ne pas encore avoir été créée lors de l'édition de la version...) et à ce moment il faut l'indiquer sous une forme reconnue par la version utilisée, ce qui peut impliquer si tu passes d'une version à une autre de tester la version dans le code pour adapter l'indication de format...

Cordialement.

Rechercher des sujets similaires à "copie sheets fichier ouvert perte volontaire"