Vérifier si feuille existe

Résolu/Fermé
Thibault - 15 déc. 2020 à 17:19
 Thibault - 17 déc. 2020 à 10:38
Bonjour,

Ma demande est simple, mais je bloque sur la syntaxe.
J'ai une feuille qui est stockée dans une variable : "FICHER1", et j'aimerais vérifier si elle existe, j'ai donc tenté :
If Sheets(FICHIER1) = True Then

Je n'ai rien trouvé qui fonctionne, à part
ActiveSheet.Name = FICHIER1
mais ce n'est pas ce que je souhaite.

Merci d'avance.
Configuration: Windows / Edge 18.17763

2 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
15 déc. 2020 à 17:31
Bonjour,

Tu pourrais, par exemple, utiliser une fonction du genre
Function FExist(NomF As String) As Boolean ' test si la feuille existe
   Application.ScreenUpdating = False
   On Error Resume Next
   FExist = Not Sheets(NomF) Is Nothing
   Application.ScreenUpdating = True
End Function 

et donc, dans ton code, ensuite, faire
 if FExist(FICHIER1) Then 
      

1
Parfait ! Merci beaucoup cependant j'ai un souci qui persiste si vous pouvez m'aider je vous en serai vraiment reconnaissant mais sinon tant pis. Je vous explique :

J'ai deux onglets avec du contenu. La macro au lancement crée deux nouveaux onglets qui sont un peu un miroir avec un mélange des deux valeurs. Le souci c'est que la copie fonctionne pour un des onglets mais pas pour les deux. Mon souci doit venir de mon If mais je ne trouve pas de bonne solution.

Voici mon code :

Sub test()
    Dim i As Integer, j As Integer, k As Integer, m As Integer, Feuille_X As String, Feuille_Y As String, Ligne_vide As Integer
    Dim Ligne_du_haut As Integer, Ligne_du_bas As Integer, Nombre_de_lignes As Integer, Nombre_de_colonnes As Byte
    
    Dim Fichier1 As String
    Dim Fichier2 As String
    Dim Fichier3 As String
    Dim Fichier4 As String
    
    Application.ScreenUpdating = False
    Fichier1 = InputBox("Indiquez votre 1er Fichier ? Homog?n?iser", "Fichier1")
    Fichier2 = InputBox("Indiquez votre 2nd Fichier ? Homog?n?iser", "Fichier2")
    Fichier3 = Fichier1 & "post"
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Select
    Sheets(Sheets.Count).Name = Fichier3
    
    Worksheets(Fichier1).Range("A1:AZ128").Copy
    ActiveSheet.Paste Destination:=Worksheets(Fichier3).Range("A1:AZ128")
    
    Fichier4 = Fichier2 & "post"
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Select
    Sheets(Sheets.Count).Name = Fichier4
    
    Worksheets(Fichier2).Range("A1:AZ128").Copy
    ActiveSheet.Paste Destination:=Worksheets(Fichier4).Range("A1:AZ128")
    

    With ActiveSheet
        Range("A2:Z" & Rows.Count).ClearContents
        Range("A2:Z" & Rows.Count).Interior.Pattern = xlNone
        
        If FExist(Fichier3) Then
            Feuille_X = Fichier1
            Feuille_Y = Fichier2
        End If
        If FExist(Fichier4) Then
            Feuille_X = Fichier2
            Feuille_Y = Fichier1
        End If

'la suite n'est pas vraiment nécessaire au souci. Puisqu'avec cette position de If c'est toujours le second If qui prime :
If FExist(Fichier4) Then
            Feuille_X = Fichier2
            Feuille_Y = Fichier1
        End If
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
15 déc. 2020 à 21:25
Tu n'aurais pas oublié d'utiliser un else if au lieu de faire deux if
0
Thibault > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
15 déc. 2020 à 21:41
Malheureusement non, le souci reste le même ce n'est pas un souci de double conditions, mais plutôt que la condition n'est pas prise en charge je dirai…
Je bloque totalement
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > Thibault
15 déc. 2020 à 22:24

la condition n'est pas prise en charge je dirai…

Laquelle .. celle la ?
 If FExist(Fichier4) Then
       Feuille_X = Fichier2
      Feuille_Y = Fichier1
End If

Tu as essayé de mettre un point d'arrêt et/ou d'éxécuter le code en mode pas à pas pour savoir ce que valent tes variables ??
Je serai curieux de savoir ce que contient "réellement" ta variable Fichier4 ....

Et puis, le nom de tes feuilles... vérifie que tu as bien la même écriture ( minuscules/majuscules et éventuels espaces avant ou après le nom de la feuille )
Tout ça peut joueur ....
Par exemple .... "Jordane " n'est pas identique à "Jordane" ni à "jordaNe" ...
0
Thibault > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
15 déc. 2020 à 22:59
Je regarderai demain et je te tiendrai au courant, merci pour les propositions en tout cas.
0
Thibault > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
16 déc. 2020 à 23:00
Bonsoir,

J'ai tenté différente option et rien ni fait, pourtant Fichier3 et Fichier4 renvoie bien le nom des feuilles Excel, donc je ne comprends vraiment pas…

Voici mon code complet , je commence vraiment à désespérer

Sub zazda()
    Dim i As Integer, j As Integer, k As Integer, m As Integer, Feuille_X As String, Feuille_Y As String, Ligne_vide As Integer
    Dim Ligne_du_haut As Integer, Ligne_du_bas As Integer, Nombre_de_lignes As Integer, Nombre_de_colonnes As Byte
    
    Dim Fichier1 As String
    Dim Fichier2 As String
    Dim Fichier3 As String
    Dim Fichier4 As String
    
    Application.ScreenUpdating = False
    Fichier1 = InputBox("Indiquez votre 1er Fichier ? Homog?n?iser", "Fichier1")
    Fichier2 = InputBox("Indiquez votre 2nd Fichier ? Homog?n?iser", "Fichier2")
    Fichier3 = Fichier1 & "post"
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Select
    Sheets(Sheets.Count).Name = Fichier3
    
    Worksheets(Fichier1).Range("A1:AZ128").Copy
    ActiveSheet.Paste Destination:=Worksheets(Fichier3).Range("A1:AZ128")
    
    Fichier4 = Fichier2 & "post"
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Select
    Sheets(Sheets.Count).Name = Fichier4
    
    Worksheets(Fichier2).Range("A1:AZ128").Copy
    ActiveSheet.Paste Destination:=Worksheets(Fichier4).Range("A1:AZ128")
    

    With ActiveSheet
        Range("A2:Z" & Rows.Count).ClearContents
        Range("A2:Z" & Rows.Count).Interior.Pattern = xlNone
        
        If FExist(Fichier3) Then
            Feuille_X = Fichier1
            Feuille_Y = Fichier2
        End If
        If FExist(Fichier4) Then
            Feuille_X = Fichier2
            Feuille_Y = Fichier1
        End If
        MsgBox (Fichier3)
        
        Nombre_de_colonnes = Cells.Find("*", , , , xlByColumns, xlPrevious).Column
        Sheets(Feuille_X).Range("A2:Z" & Sheets(Feuille_X).Range("A" & Rows.Count).End(xlUp).Row).Copy .Range("A2")
        Ligne_vide = .Range("A" & Rows.Count).End(xlUp).Row + 1
        Sheets(Feuille_Y).Range("A2:a" & Sheets(Feuille_Y).Range("A" & Rows.Count).End(xlUp).Row).Copy .Range("A" & Ligne_vide)
        With .Range(.Cells(Ligne_vide, 1), .Cells(.Range("A" & Rows.Count).End(xlUp).Row, Nombre_de_colonnes)).Interior
            .ThemeColor = xlThemeColorAccent2
            .TintAndShade = 0.8
        End With
        For i = .Range("A" & Rows.Count).End(xlUp).Row To Ligne_vide Step -1
            On Error Resume Next
            j = Application.WorksheetFunction.Match(.Range("A" & i), .Range("A2:A" & Ligne_vide - 1), 0)
                If j > 0 Then .Rows(i).Delete
            j = 0
        Next i
        .Range("A1:Z" & Rows.Count).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
        
        .Range("B2").Activate
        
Retour:
        
        Do Until ActiveCell.Offset(1, 0) = ""
            ActiveCell.Offset(1, 0).Activate
        Loop
        Ligne_du_haut = ActiveCell.Row
        ActiveCell.Offset(1, 0).Activate
        Do Until ActiveCell.Offset <> ""
            If ActiveCell.Offset(1, -1) = "" Then Exit Sub
            ActiveCell.Offset(1, 0).Activate
        Loop
        Ligne_du_bas = ActiveCell.Row
        
        For k = 2 To Nombre_de_colonnes
            For m = Ligne_du_haut + 1 To Ligne_du_bas - 1
                Cells(m, k) = Round(Cells(Ligne_du_haut, k) + ((Cells(Ligne_du_bas, k) - Cells(Ligne_du_haut, k)) / (Cells(Ligne_du_bas, 1) - Cells(Ligne_du_haut, 1))) * (Cells(m, 1) - Cells(Ligne_du_haut, 1)), 3)
            Next m
        Next k
        
        Range("B" & Ligne_du_bas).Activate
        GoTo Retour
        
    End With ' ActiveSheet
    
End Sub
0