Connaitre le nom du dossier contenant le fichier Excel

Re bonjour, je me permet de relancer la discussion juste d'un point de vue optimisation d'un autre code en effet j'ai reussie a supprimer tout les fonctions Active, Selecte ou les recours a Windows mais comment fait t'on pour les copier coller svp? (ci joint le code)

Sub Macro1()

Dim azer As Variant

Dim NomFichier As Variant

Dim bool As Boolean

NomFichier = ThisWorkbook.Name

Set FL21 = Workbooks(NomFichier).Worksheets("Grille Produits 2018 liaison")

bool = VerificationFichierOuvert("offreglobale.xlsm")

If bool = True Then

MsgBox "OffreGlobal déja ouvert"

Else

MsgBox "OffreGlobal pas ouvert"

Workbooks.Open ("C:\....chemin")

End If

Set FL12 = Workbooks("offreglobale.xlsm").Worksheets("MillesFeuilles")

With FL12

Columns("A:U").Select

Selection.Copy

End With

With FL21

Cells.Select

ActiveSheet.Paste

Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _

SkipBlanks:=False, Transpose:=False

ActiveSheet.Paste

Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _

SkipBlanks:=False, Transpose:=False

End With

End Sub

Bonjour,

Un petit préalable : au-dessus de ta fenêtre de rédaction de post, tu as plusieurs boutons, l'un d'eux porte cette mention : </>, facile à repérer et c'est le 5e en partant de la gauche.

Ce bouton sert à mettre du code sous balises Code, ce qui en améliore considérablement la lisibilité et a pour effet de conserver l'indentation du code, élément important pour le lire correctement sans y passer un temps considérable !

Il te suffit donc de sélectionner ton code, cliquer sur ce bouton, et hop ! le voilà sous balises Code !

Il faut penser à le faire systématiquement.

Maintenant, il me semble que ton code reprend le code de la Macro1 (que tu avais communiqué en MP), sachant que le contenu de cette macro pouvait fort bien être incoporé dans celle dont j'avais réécrit le code et que tu entendais exécuter à la suite.

Bien pour l'effort d'élimination de Windows... mais il reste encore pas mal de scories !

Le fait que tu soies conduit à utiliser des variables déclarée dans l'autre procédure (sans les déclarer dans celle où tu les utilises) plaide pour la fusion des deux procédures.

En ce qui concerne les déclarations de variable, il est bon de les déclarer systématiquement, et de les typer autant que possible (une variable typée sera accessible plus rapidement...). Inutile de déclarer un type Variant, c'est le type de toute variable non typée (et donc également de celles qui ne sont pas déclarées). On ne type pas une variable susceptible d'être initialisée avec des données de types différents, mais on type, dès lors qu'il est acquis que les données affectées seront d'un type unique.

Ensuite, s'il convient d'éviter les Select, Activate, etc. car c'est faire des détours inutiles, il ne faudrait pas y substituer d'autres détours tout aussi inutile.

ThisWorkbook est une propriété qui te renvoie directement le classeur contenant le code dans lequel tu l'utilises. Cela permet des raccourcis inestimables ! Donc inutile de s'en servir pour récupérer le nom de ce classeur et d'utiliser ce nom pour atteindre le classeur alors que tu pouvais l'atteindre directement :

    Set FL21 = ThisWorkbook.Worksheets("Grille Produits 2018 liaison")

Même chose pour tes collages, tu colles d'abord tout, pour faire ensuite un collage spécial, inutile si tout est déjà collé (sauf dans quelques cas particuliers comme les largeurs de colonne...)

En matière de "collage" : si tu entends coller des valeurs uniquement, il faut dans ce cas privilégier l'affectation directe des valeurs d'une plage à une autre, méthode VBA, sans copier-coller, et la plus rapide. Dans la mesure où tu veux récupérer la mise en forme et les formules, sauf contre-indication d'éléments que tu ne veux pas coller, il faut privilégier le collage normal, plus rapide que le collage spécial.

Et il rest encore pas mal de Select à éliminer, ce qui est tout à fait simple, exemple :

    FL12.Range("A1").CurrentRegion.Resize(, 21).Copy FL21.Range("A1")

Ici, en une ligne de code tu copies ta plage A:U, en la dimensionnant à la surface occupée, de ta feuille source pour la coller dans ta feuille cible.

Et pour faire un collage spécial formules (qui serait inutile car le collage normal colle les formules), ta ligne de collage doit se limiter à :

    FL21.Range("A1").PasteSpecial xlPasteFormulas

Tout le reste est inutile, et fait partie des éléments qu'on doit supprimer pour épurer du code enregistré.

Pourquoi l'enregistreur te renvoie-t-il tout le temps une masse de code inutile ? Parce qu'il ne réfléchit pas, il se contente de restituer la valeur des paramètres de la méthode, que ceux-ci soient à leur valeur par défaut ou non, mais toi qui sait quels paramètres tu as utilisé pour obtenir ton résultat, tu peux retenir celui ou ceux que dont tu as modifié la valeur par défaut, et éliminer les autres !

En outre, l'enregistreur passe tous les paramètres par noms : NomParamètre:= ValeurParamètre, ce qui est inutile dès lors que les paramètres sont indiqués dans l'ordre (cela n'a d'intérêt que lors d'un paramètre optionnel éloigné dans la liste lorsque ceux qui précèdent et qu'on n'utilise pas sont nombreux). On gagne du temps et on reduit l'écriture du code à les passer par position, qui est par ailleurs le mode de passage normal des arguments.

Ce que je t'invite à faire, c'est décrire l'opération que tu entends réaliser avant exécution de la seconde macro qui doit suivre, et l'on pourra intégrer l'ensemble dans une seule macro.

Cordialement.

Bonjour d'accord merci j'ai essayé de changer ce que vous m'avez dit de changer et effectivemement je veux copier la mise en forme avec la largeur des colonnes et aussi les formules. (Ci dessous je vous envoie tout le code)

EN fait le macro 1 devrai dans l'idéal se lancer des l'ouverture du fichier excel puis il appelera la fonction esa (voir dans le code ci dessous)

et c'est tout =)

 Sub Macro1()
Dim azer As Variant
Dim NomFichier As Variant
Dim bool As Boolean

Set FL21 = ThisWorkbook.Worksheets("Grille Produits 2018 liaison")

    bool = VerificationFichierOuvert("offreglobale.xlsm")

    If bool = False Then
     MsgBox "OffreGlobal pas ouvert"
Workbooks.Open ("C:...chemin")
End If

If bool = True Then
    MsgBox "OffreGlobal déja ouvert"
 End If

Set FL12 = Workbooks("offreglobale.xlsm").Worksheets("MillesFeuilles")

FL12.Range("A1").CurrentRegion.Resize(, 21).Copy FL21.Range("A1")

With FL21

    Cells.Select
   ActiveSheet.Paste
  Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False

ActiveSheet.Paste
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
  End With

  Call esa

End Sub

Sub esa()
    Dim parentdir, imo%, nln%, note$, FL1 As Worksheet, FL2 As Worksheet
    Set FL1 = Workbooks("offreglobale.xlsm").Worksheets("MillesFeuilles")
    With ThisWorkbook
        Set FL2 = .Worksheets("Grille Produits 2018 liaison")
        parentdir = Split(.Path, "\")
    End With
    parentdir = parentdir(UBound(parentdir))
    With FL1
        For imo = 10 To 200
            note = .Cells(1, imo)
            If StrComp(parentdir, note, vbTextCompare) = 0 Then
                MsgBox "ça marche !"
                Exit For
            End If
        Next imo
        If imo > 200 Then
            MsgBox "ça n'a pas marché !"
            Exit Sub
        End If
        nln = .Cells(1, imo).SpecialCells(xlCellTypeLastCell).Row

        FL2.Range("N1").Resize(nln, 2).Value = .Cells(1, imo).Resize(nln, 2).Value

    End With

End Sub

Function VerificationFichierOuvert(ByVal NomFichier As String) As Boolean
Dim WbEnCours As Workbook

    VerificationFichierOuvert = False
    If Workbooks.Count = 0 Then
       Exit Function
    Else
       For Each WbEnCours In Application.Workbooks
           If WbEnCours.Name = NomFichier Then VerificationFichierOuvert = True
       Next WbEnCours
    End If

End Function

Voilà pour le code de ta Macro1, si tu maintiens les deux :

Sub Macro1()
    Dim FL12 As Worksheet, FL21 As Worksheet, Fich$
    Set FL21 = ThisWorkbook.Worksheets("Grille Produits 2018 liaison")
    Fich = "offreglobale.xlsm"
    If Not VerificationFichierOuvert(Fich) Then Workbooks _
     .Open ("C:\...chemin\" & Fich)
    Set FL12 = Workbooks(Fich).Worksheets("MillesFeuilles")
    FL12.Range("A1").CurrentRegion.Resize(, 21).Copy
    With FL21
        .Paste
        .Range("A1").PasteSpecial xlPasteColumnWidths
    End With
    Call esa
End Sub

Cordialement.

Bonjour merci bcp mais ca me crée des sortes d'erreurs en effet moi je veux copier que de la case A1 a U2000 et la c'est pas ce qui se passe non? Je me retrouve avec enormément de colonnes (de A jusqu'a LXM) et il y a des choses collés dans des endroits oû ils ne devraient pas y être. Au sujet du premier probleme j'ai juste changer

FL12.Range("A1").CurrentRegion.Resize(, 21).Copy

en ca

FL12.Range("A1:U2000").CurrentRegion.Resize(, 21).Copy

est ce que c'est bon et est ce que je dois changer d'utre chose?

Encore merci pour tout

sinon j'avais pensé faire ca pour le macro1 mais ca me copie pas la largeur des colonnes

Sub Macro1()
Dim azer As Variant
Dim NomFichier As Variant
Dim bool As Boolean

Set FL21 = ThisWorkbook.Worksheets("Grille Produits 2018 liaison")
   bool = VerificationFichierOuvert("offreglobale.xlsm")

   If bool = False Then
    MsgBox "OffreGlobal pas ouvert"
Workbooks.Open ("C:\ chemin...\offreglobale.xlsm")
End If

If bool = True Then
   MsgBox "OffreGlobal déja ouvert"
End If

Set FL12 = Workbooks("offreglobale.xlsm").Worksheets("MillesFeuilles")

FL12.Range("A1:U2000").Copy Destination:=FL21.Range("A1")

 Call esa

End Sub

Bonjour merci bcp mais ca me crée des sortes d'erreurs en effet moi je veux copier que de la case A1 a U2000 et la c'est pas ce qui se passe non? Je me retrouve avec enormément de colonnes (de A jusqu'a LXM) et il y a des choses collés dans des endroits oû ils ne devraient pas y être. Au sujet du premier probleme j'ai juste changer

FL12.Range("A1").CurrentRegion.Resize(, 21).Copy

en ca

FL12.Range("A1:U2000").CurrentRegion.Resize(, 21).Copy

est ce que c'est bon et est ce que je dois changer d'utre chose?

Encore merci pour tout

Que ça aille jusqu'à LXM me paraît carrément invraisemblable ! .Resize(, 21) limite la plage renvoyée à 21 colonne, soit puisqu'on part de la colonne A, de A à U !

En outre, les 2 expressions, mon expression initiale et ton expression modifiée, n'ont aucune raison de ne pas renvoyer la même plage, sauf dans 2 cas :

  • soit les cellules B1, A2, B2 sont vides, ce qui déconnecterait A1, et la plage renvoyée par .CurrentRegion serait limitée à A1, mais avec le redimensionnement à 21 colonnes, c'est A1:U1 qui serait renvoyée,
  • soit si une ligne vide déconnecte une partie supérieure de la feuille du reste, ligne qui ne doit pas être seulement vide de A à U mais sur la totalité de la feuille, car la connexion peut être assurée sur n'importe quelle colonne, la plage renvoyée couvrirait alors toujours les colonnes A à U jusqu'à cette supposée ligne de coupure.

Je pense exposer clairement la signification de cette ligne de code, et l'on peut la tester dans différents cas de figure pour s'assurer de la plage renvoyée !

Cordialement.

Bonjour effectivemment A1 et A2 sont vide mais B1 à du texte et B2 est coloré en fond

B1 suffit à établir la connexion, dès lors que la ligne 2 n'est pas entièrement vide !

Tu peux tester la plage que renvoie CurrentRegion ainsi :

Sub test()
    MsgBox ActiveSheet.Range("A1").CurrentRegion.Address
End Sub
Rechercher des sujets similaires à "connaitre nom dossier contenant fichier"