XL 2016 Créer une feuille si elle n'existe pas + Copier une plage de cellule d'une feuille à l'autre

_l_ours

XLDnaute Nouveau
Bonjour à tous,

Je suis à la recherche d'une petite macro.

L'idée est simple en théorie mais malgré plusieurs tentatives, je sèche. o_O

Lorsque je clique sur un bouton, la macro me créé une feuille, mais je souhaite que si cette feuille existe, ça ne fasse rien. Je suppose du coup qu'il faut utiliser la fonction If... Then mais je pèche... Pour le moment, voici mon code :

VB:
Sub creation_feuille()

If Not Worksheets("Dossiers Clients") = True Then
               
Sheets.Add.Name = "Dossiers Clients"
Worksheets("Dossiers Clients").Move _
 after:=Worksheets("EXPORT")

End If

End Sub

De plus, je souhaiterais rajouter un code pour que, toujours en cliquant sur ce bouton, toutes les données présentes dans la feuille "EXPORT" à partir de la ligne 2 des colonnes B à O et ce, jusqu'à la dernière ligne ayant des données, soient copiées dans la feuille "Dossiers Clients" dans les colonnes B à O à partir de la première ligne n'ayant pas de données dans ces colonnes.

Merci d'avance :)
 
Solution
Bonjour à tous,

Je suis à la recherche d'une petite macro.

L'idée est simple en théorie mais malgré plusieurs tentatives, je sèche. o_O

Lorsque je clique sur un bouton, la macro me créé une feuille, mais je souhaite que si cette feuille existe, ça ne fasse rien. Je suppose du coup qu'il faut utiliser la fonction If... Then mais je pèche... Pour le moment, voici mon code :

VB:
Sub creation_feuille()

If Not Worksheets("Dossiers Clients") = True Then
            
Sheets.Add.Name = "Dossiers Clients"
Worksheets("Dossiers Clients").Move _
 after:=Worksheets("EXPORT")

End If

End Sub

De plus, je souhaiterais rajouter un code pour que, toujours en cliquant sur ce bouton, toutes les données présentes dans la feuille "EXPORT" à...

Franc58

XLDnaute Occasionnel
Bonjour à tous,

Je suis à la recherche d'une petite macro.

L'idée est simple en théorie mais malgré plusieurs tentatives, je sèche. o_O

Lorsque je clique sur un bouton, la macro me créé une feuille, mais je souhaite que si cette feuille existe, ça ne fasse rien. Je suppose du coup qu'il faut utiliser la fonction If... Then mais je pèche... Pour le moment, voici mon code :

VB:
Sub creation_feuille()

If Not Worksheets("Dossiers Clients") = True Then
            
Sheets.Add.Name = "Dossiers Clients"
Worksheets("Dossiers Clients").Move _
 after:=Worksheets("EXPORT")

End If

End Sub

De plus, je souhaiterais rajouter un code pour que, toujours en cliquant sur ce bouton, toutes les données présentes dans la feuille "EXPORT" à partir de la ligne 2 des colonnes B à O et ce, jusqu'à la dernière ligne ayant des données, soient copiées dans la feuille "Dossiers Clients" dans les colonnes B à O à partir de la première ligne n'ayant pas de données dans ces colonnes.

Merci d'avance :)

Salut, en me basant sur tes explications, voici ce que je te propose:

VB:
Sub creation_feuille()
    Dim ws As Worksheet
    Dim wsExport As Worksheet
    Dim wsDC As Worksheet
    Dim rngToCopy As Range
    Dim rngDest As Range

    ' Définir la feuille EXPORT
    Set wsExport = ThisWorkbook.Sheets("EXPORT")

    ' Vérifier si la feuille Dossiers Clients existe déjà
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets("Dossiers Clients")
    On Error GoTo 0

    ' Si la feuille n'existe pas, la créer
    If ws Is Nothing Then
        Set wsDC = ThisWorkbook.Sheets.Add(After:=wsExport)
        wsDC.Name = "Dossiers Clients"
    Else
        Set wsDC = ws
    End If

    ' Définir la plage à copier à partir de la feuille EXPORT
    Set rngToCopy = wsExport.Range("B2:O" & wsExport.Cells(wsExport.Rows.Count, "B").End(xlUp).Row)

    ' Trouver la première ligne vide dans la feuille Dossiers Clients
    Dim FirstEmptyRow As Long
    FirstEmptyRow = wsDC.Cells(wsDC.Rows.Count, "B").End(xlUp).Row + 1

    ' Définir la plage de destination dans la feuille Dossiers Clients
    Set rngDest = wsDC.Range("B" & FirstEmptyRow)

    ' Copier les données
    rngToCopy.Copy rngDest
End Sub
 

Phil69970

XLDnaute Barbatruc
Re

Bonjour @Franc58

@_l_ours

Je te propose ce code à mettre dans un module

VB:
Option Explicit

Function Feuille_Existe(Nom As String) As Boolean
Dim Sh As Object
For Each Sh In Sheets
    If UCase(Sh.Name) = UCase(Nom) Then
        Feuille_Existe = True
        Exit For
    End If
Next
End Function

Sub Creation_feuille()
Dim DerligSrc&, DerligDst&

With Worksheets("EXPORT")
    DerligSrc = .Range("B" & Rows.Count).End(xlUp).Row
    If Not Feuille_Existe("Dossiers Clients") Then
        Sheets.Add(After:=Worksheets("EXPORT")).Name = "Dossiers Clients"
        Worksheets("Dossiers Clients").Range("B2:O" & DerligSrc) = .Range("B2:O" & DerligSrc).Value
    Else
        DerligDst = Worksheets("Dossiers Clients").Range("B" & Rows.Count).End(xlUp).Row + 1
        Worksheets("Dossiers Clients").Range("B" & DerligDst & ":O" & DerligDst + DerligSrc - 2) = .Range("B2:O" & DerligSrc).Value
    End If
End With

End Sub
:
 

_l_ours

XLDnaute Nouveau
Salut, en me basant sur tes explications, voici ce que je te propose:

VB:
Sub creation_feuille()
    Dim ws As Worksheet
    Dim wsExport As Worksheet
    Dim wsDC As Worksheet
    Dim rngToCopy As Range
    Dim rngDest As Range

    ' Définir la feuille EXPORT
    Set wsExport = ThisWorkbook.Sheets("EXPORT")

    ' Vérifier si la feuille Dossiers Clients existe déjà
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets("Dossiers Clients")
    On Error GoTo 0

    ' Si la feuille n'existe pas, la créer
    If ws Is Nothing Then
        Set wsDC = ThisWorkbook.Sheets.Add(After:=wsExport)
        wsDC.Name = "Dossiers Clients"
    Else
        Set wsDC = ws
    End If

    ' Définir la plage à copier à partir de la feuille EXPORT
    Set rngToCopy = wsExport.Range("B2:O" & wsExport.Cells(wsExport.Rows.Count, "B").End(xlUp).Row)

    ' Trouver la première ligne vide dans la feuille Dossiers Clients
    Dim FirstEmptyRow As Long
    FirstEmptyRow = wsDC.Cells(wsDC.Rows.Count, "B").End(xlUp).Row + 1

    ' Définir la plage de destination dans la feuille Dossiers Clients
    Set rngDest = wsDC.Range("B" & FirstEmptyRow)

    ' Copier les données
    rngToCopy.Copy rngDest
End Sub
Re bonsoir @Franc58 ,

la solution fonctionne mais du coup, mon bouton étant sur la feuille d'où l'on copie les données, le bouton est collé sur la feuille de destination. Peut-on faire un coller de type collage spécial "mise en forme des valeurs et des nombres" ?

Merci d'avance et bonne soirée
 

Franc58

XLDnaute Occasionnel
Re bonsoir @Franc58 ,

la solution fonctionne mais du coup, mon bouton étant sur la feuille d'où l'on copie les données, le bouton est collé sur la feuille de destination. Peut-on faire un coller de type collage spécial "mise en forme des valeurs et des nombres" ?

Merci d'avance et bonne soirée
Je ne comprends pas bien ce que tu veux, quand j'utilise la macro, la plage "B2:O" de "EXPORT" est recopiée vers "Dossiers Clients" avec les formats de cellule et de nombre.
 

_l_ours

XLDnaute Nouveau
Bonjour @Phil69970 et @Franc58 ,

@Phil69970 je comprends l'intérêt d'un fichier mais je ne peux pas mettre les données qui ne sont pas diffusables. J'avais pris le code de Franc avant que tu ne postes le tien mais je vais faire des essais comparatifs.

@Franc58 en fait j'ai le bouton cliquable qui exécute la macro sur la feuille "EXPORT" pour des questions de facilités, du coup ça me copie-colle le bouton sur la feuille de destination "Dossiers clients". Mais je vais creuser en partant sur vos deux propositions, ça va me faire comprendre certains fonctionnements.

Merci à tous les deux pour votre temps, et un bon dimanche à vous.
 

_l_ours

XLDnaute Nouveau
J'ai trouvé la solution à ma problématique, je le partage au cas où d'autres utilisateurs chercheraient.
Le bouton cliquable exécutant ma macro étant une image, pour ne pas qu'elle soit copiée par la macro lors de l'exécution de celle-ci, il suffit de modifier les paramètres de l'image (donc rien n'avoir avec le code de la macro). Il suffit donc de faire un clic droit sur l'image, puis "Taille et propriété" et de cocher dans le menu Propriétés l'option "ne pas déplacer ou dimensionner avec les cellules".

Bonne journée à tous.
 

Discussions similaires

Réponses
7
Affichages
349

Statistiques des forums

Discussions
312 209
Messages
2 086 266
Membres
103 167
dernier inscrit
miriame