Tester si le nom d'une feuille existe déjà avant d'en créer une nouvelle

Bonjour,

Je continue le développement de ma macro mais je suis confronté à un nouveau soucis..... avec une macro donnée par Galopin01 pour tester si une feuille existe déjà avant d'en créer une nouvelle.

Voila ma macro avec le message d'erreur associé

vba1

Voila la déclaration de variable que j'ai fait dans mon module:

vba3

et enfin voila la function qui était donné par Galopin01 et que je tente d'appliquer

vba2

J'ai essayé différentes définitions de variable en disant que test2 était une string, un objet, mais rien n'y fait....

J'ai beau cherché sur le forum ou sur le net et je ne trouve pas ma réponse, sachant que sur une autre macro, j'ai utilisé la même Function et je n'ai eu aucun soucis.

Bonjour,

Au lieu de présenter des images, tu ferais mieux de publier le code !

Quelle est la ligne surlignée en jaune (c'est là qu'est l'erreur) ?

Tu n'as pas essayé de compiler le code, pour détecter les erreurs de compilation.

La ligne sur laquelle tu as mis un point d'arrêt en comporte une, mais c'est pas elle qui provoque ce code d'erreur !

je n'ai pas mis le code car je ne sais pas si je dois mettre le fichier .erp associé que la macro ouvre..

Sinon, oui, c'est sur la ligne marron où j'ai mis mon point d’arrêt que le message d'erreur apparait lorsque je tape F8 pour passer à la ligne suivante

Bonjour,

Tes bribes de codes ne m'inspire rien qui vaille !

Sous réserves des autres erreurs que ne montrent pas tes confettis de codes :

Test2 et nomfeuille sont bien définis en string.

Que vient faire "Set" dans cette histoire ?

Bonus :

De toute façon avec un string vide tu n'as aucune chance que Ws Existe !

[Edit]

Patrice :

"Au lieu de présenter des images, tu ferais mieux de publier le code !"

Bonjour, je plussoie évidemment !

A+

Bonjour à tous

Patrice et galopin ont tout à fait raison

Set test2 = Sheets(nomfeuille)

rajouter sheets et il faut que la feuille existe

test2 doit être défini as Worksheet

La prochaine fois indente ton code , la 5ème balise en haut à droite

Envoie éventuellement un extrait de fichier, c'est beaucoup mieux

Nous sommes tous sympas, mais nous ne pouvons pas tout deviner, il faut nous aider à aider ....

A+

Désolé de en pas avoir posté tout le code, je le note et, je vous promet, vous jure, de ne plus le faire....

Public a, b, c, d, e, f, g, h As Integer
Public Z1, Z2, MaPlageMultiZone As Range
Public ZoneSelection, u
Public nomfeuille2 As String

Public Sub lancement_Click()
Application.ScreenUpdating = False

    ''''''''''''''''''''''''''''²'
    'création du nouveau fichier'
    '''''''''''''''''''''''''''''

nomXLSX = nomXLSX.Value 'nom renseigné dans la fenetre MACRO RPA
nbrepro = nbrepro.Value 'nombre de fichier à traiter renseigné dans la fenetre MACRO RPA

If nomXLSX = nan Then

MsgBox "Saisir un nom de fichier"

Else

End If

If nbrepro = nan Then

MsgBox "Saisir un nombre de fichier à traiter"

Else

End If

Workbooks.Add

ChDir chemin

ActiveWorkbook.SaveAs Filename:= _
        chemin & "\" & nomXLSX & ".xlsx", _
        FileFormat:=xlOpenXMLWorkbook, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False

Sheets("Feuil1").Select
ActiveSheet.Name = "DONNEES"
Sheets("Feuil2").Select
ActiveSheet.Name = "archives"

a = 1
f = 1
g = 1

For a = 1 To nbrepro

' 1 -- SE PLACER DANS LE BON REPERTOIRE DU PC
        ChDir chemin

' 2 --SAISIR DANS "nomfich" LE NOM DU FICHIER A OUVRIR
        nomfich = Application.GetOpenFilename(" RPA ,*.erp")
        Me.ListBox1.AddItem nomfich

' 3 -- OUVRIR LE FICHIER TEXTE DANS UN ENVIRONNEMENT EXCEL

Workbooks.OpenText Filename:= _
        nomfich, Origin:=xlWindows, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=True _
        , Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), _
        Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), _
        Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1)), _
        TrailingMinusNumbers:=True

'sauvegarder au format .XLSX

       Application.DisplayAlerts = False

       ActiveWorkbook.SaveAs Filename:= _
       chemin & "\temp.xlsx", FileFormat:=xlOpenXMLWorkbook, _
       Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
       CreateBackup:=False

'suppression des données inutiles

    Range("A1:V500").Copy Destination:=Workbooks(nomXLSX & ".xlsx").Worksheets("DONNEES").Range("A1")
    Windows("temp.xlsx").Activate
    ActiveWorkbook.Close
    Application.DisplayAlerts = True

'Effacement du fichier temporaire

    Kill chemin & "\temp.xlsx"

'Reprise du traitement du fichier

    Windows(nomXLSX & ".xlsx").Activate
    Sheets("DONNEES").Select
    nomfeuille = Range("B2").Value

    If nomfeuille = nan Then
    nomfeuille = "essai" & a
    End If

    Set test2 = Sheets(nomfeuille)

test

'Boucle_Sheet
    Sheets.Add
    ActiveSheet.Name = nomfeuille

test

   'Nettoyage des données brutes avant et après

    Sheets("DONNEES").Select
    b = 13
    While ActiveCell.Value <> ""
    b = b + 1
    Range("A" & b).Select
    Wend

    Range(Cells(b, 1), Cells(3, 21)).Delete (xlUp)

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Détermination de le case vides de la première colonne et de la premiere ligne'
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    c = 1
    While Cells(c, 1) <> ""
    c = c + 1
    Wend

    d = 1
    While Cells(5, d) <> ""
   Range(Cells(5, d), Cells(c - 1, d)).Select

   'Remplacement du . texte par le . decimal

    Cells.Replace What:=".", Replacement:=".", LookAt:=xlPart, SearchOrder _
    :=xlByRows, MatchCase:=False

    d = d + 1
    Wend

    f = f + d
    Range(Cells(1, 1), Cells(c - 1, d - 1)).Copy Destination:=Worksheets(nomfeuille).Range("A1")
    Range(Cells(1, 1), Cells(c - 1, d - 1)).Copy Destination:=Worksheets("archives").Cells(1, g)

    traitementarchives

    ''''''''''''''''''''''
    'création des graphes'
    ''''''''''''''''''''''

    Sheets(nomfeuille).Select
      Range("A6").Select
      ActiveCell.End(xlDown).Select
      Zone1 = ActiveCell.Address
      Selection.Offset(0, 2).Select
      Zone2 = ActiveCell.Address
      Set Z1 = Range("A5", Zone1)
      Set Z2 = Range("C5", Zone2)
      Set u = Application.Union(Z1, Z2)

      Sheets(nomfeuille).Select
      ActiveSheet.Shapes.AddChart.Select
      ActiveChart.Location Where:=xlLocationAsNewSheet
      Set MG = ActiveChart

'Mise en forme du graphique

        With MG
            .ChartType = xlXYScatterSmoothNoMarkers
            .SetSourceData Source:=u, PlotBy:=xlColumns
            .HasTitle = False
            .HasAxis(xlCategory, xlPrimary) = True
            .HasAxis(xlValue, xlPrimary) = True
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Temps (min)"
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Couple (dN.m)"
            .SetElement (msoElementPrimaryValueAxisTitleHorizontal)

        End With

        With ActiveChart.PlotArea
            .Height = 500 ' resize
            .Width = 800 ' resize
            .Top = 5 ' reposition
            .Left = 5 ' reposition
        End With

        With ActiveChart.Axes(xlValue).AxisTitle
            .Left = 48
            .Top = 22
        End With

        With ActiveChart.Axes(xlPrimary).AxisTitle
            .Left = 590
            .Top = 430
        End With

        ActiveChart.SeriesCollection(1).Name = nomfeuille
        ActiveChart.ChartTitle.Delete

 Next a

 graphgeneral

End
End Sub

Public Sub traitementarchives()

Sheets("archives").Select

    While Cells(4, g) <> "ElSTTime"
    g = g + 1
    Wend

h = g + 1

    While Cells(4, h) <> "Ss"
    Cells(4, h).Select
    h = h + 1
    Wend

Range(Cells(4, g + 1), Cells(c, h - 1)).Delete (xlShiftToLeft)
Range(Cells(4, g + 2), Cells(c, g + 18)).Delete (xlShiftToLeft)
Cells(1, g + 1).Value = nomfeuille
g = g + 2

Sheets("DONNEES").Select

End Sub
Public Sub graphgeneral()

Sheets("DONNEES").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.Location Where:=xlLocationAsNewSheet
ActiveChart.Name = "Graph General"

i = 1
j = 1
k = j

Set sh = Sheets("archives")
Set grph = Sheets("Graph General")

For j = 1 To nbrepro

sh.Select

 Cells(6, i).Select

 c = 1

    While Cells(c, i) <> ""
    c = c + 1
    Cells(c, i).Select
    Wend
    c = c - 1

Set l = Range(Cells(6, i), Cells(c, i)) 'selection des donnees pour l'axe X
Set m = Range(Cells(6, i + 1), Cells(c, i + 1)) 'selection des donnees pour l'axe Y
Set u = Application.Union(l, m)

MaxX = Cells(c, i).Value
MaxX = Application.WorksheetFunction.Ceiling(MaxX, 6.94444444444444E-04)

MaxY = Application.WorksheetFunction.Max(Range(Cells(3, i + 1), Cells(c, i + 1)))
MaxY = Application.WorksheetFunction.Ceiling(MaxY, 5)

    If j = 1 Then

With grph

           .ChartType = xlXYScatterSmoothNoMarkers
           .SetSourceData sh.Range(Cells(6, i), Cells(c, i + 1)), xlColumns
           '.SeriesCollection(1).Name = Cells(1, i + 1).Value
           .SeriesCollection(1).Name = Sheets("archives").Cells(1, i + 1).Value
           .HasTitle = False
           .HasAxis(xlCategory, xlPrimary) = True
           .HasAxis(xlValue, xlPrimary) = True
           .Axes(xlCategory, xlPrimary).HasTitle = True
           .Axes(xlCategory).MaximumScale = MaxX
           .Axes(xlCategory).MajorUnit = 1
           .Axes(xlCategory).CrossesAt = 0
           .Axes(xlCategory).MinimumScale = 0
           .Axes(xlCategory).Select
           .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Temps (min:mm)"
           .Axes(xlValue, xlPrimary).HasTitle = True
           .Axes(xlValue, xlPrimary).CrossesAt = 0
           .Axes(xlValue, xlPrimary).MinimumScale = 0
           .Axes(xlValue, xlPrimary).MaximumScale = MaxY
           .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Couple (dN.m)"
           .SetElement (msoElementPrimaryValueAxisTitleHorizontal)
           .Axes(xlValue).Select
           Selection.MinorTickMark = xlOutside
           .Axes(xlCategory).Select
           Selection.MinorTickMark = xlOutside

End With

Else
grph.Activate
With ActiveChart.SeriesCollection.NewSeries
        '
        .Name = Sheets("archives").Cells(1, i + 1).Value
        .Values = m
        .XValues = l
End With

Sheets("Donnees").Select

End If
i = i + 2

Next j
        grph.Select
        With ActiveChart.PlotArea
            .Height = 500 ' resize
            .Width = 800 ' resize
            .Top = 5 ' reposition
            .Left = 5 ' reposition
        End With

        With ActiveChart.Axes(xlValue).AxisTitle
            .Left = 48
            .Top = 22
        End With

        With ActiveChart.Axes(xlPrimary).AxisTitle
            .Left = 590
            .Top = 430
        End With

grph.Select

    ActiveChart.Axes(xlValue).Select
    Selection.MinorTickMark = xlOutside
    ActiveChart.Axes(xlCategory).Select
    Selection.MinorTickMark = xlOutside

End Sub

Private Sub nbrepro_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If InStr(1, "0123456789", Chr(KeyAscii)) = 0 And KeyAscii <> 8 Then
MsgBox "Caractère non autorisé"
KeyAscii = 0
End If

End Sub
Private Sub nomXLSX_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

Select Case KeyAscii

    Case 97 To 122
        ' Caracteres alpha min

    Case 65 To 90
        'Caracteres alpha Maj

    Case 48 To 57
        ' Caracteres numérique

    Case 8
        'Retour Chariot

    Case Else

    MsgBox "Caractère non autorisé"
    KeyAscii = 0

End Select

End Sub

Sub test()
If WsExist(test2) Then nomfeuille = test2 & a
'MsgBox "un fichier portant la même référence a été préalablement ouvert, le nouveau fichier de données ouvert a donc été indéxé avec un chiffre"
End Sub

Function WsExist(Nom$) As Boolean
On Error Resume Next
WsExist = Sheets(Nom).Index
If WsExist = True Then MsgBox "un fichier portant la même référence a été préalablement ouvert, le nouveau fichier de données ouvert a donc été indéxé avec un chiffre"
End Function

Private Sub UserForm_Click()

End Sub

Patty5046, remplacer mais ça ne fonctionne pas, il me dit qu'il manque "Objet requis"

Résolu en partie par les indices que vous m'avez donné.

Par contre, la nouvelle feuille étant créé avant la fonction test, cette fonction devient obligatoirement vrai quand elle se lance et ne permet donc pas de vérifier qu'une feuille portant le même nom n'a pas été préalablement créé.

Bonjour

A la plade de test, mets :

If WsExist(test2) Then nomfeuille = test2 & a
'MsgBox "un fichier portant la même référence a été préalablement ouvert, le nouveau fichier de données ouvert a donc été indéxé avec un chiffre"
End Sub

et supprime test, car à ce niveau, test ne connaît pas test2...

A +

Merci pour ton aide.

J'ai modifié ma macro autrement pour tester le futur nom avant que la feuille soit crée.

Je met mon code qui a résolu mon pb:

Function IsFeuilleExiste(nomfeuille As String) As Boolean
On Error Resume Next
Dim Sh As Variant
IsFeuilleExiste = False
For Each Sh In Worksheets
If Sh.Name = nomfeuille Then IsFeuilleExiste = True
Next
End Function

Sub testnomfeuille()

FeuilExist = IsFeuilleExiste(nomfeuille) ' renvoie vrai si le nom existe

If FeuilExist = True Then nomfeuille = nomfeuille & a

End Sub

Bonjour,

Tu devrais commencer par déclarer tes variables correctement !

C'est à dire :

1) commencer ton module par Option Explicit

2) choisir la portée strictement nécessaire, i.e. ne mettre en Public que celles qui le nécessitent (soit aucune).

3) choisir le type de variable ad hoc, pas la grande majorité en Variant comme tu l'as fait.

Maintenant que j'ai résolu mon pb, je vais continuer à optimiser l'ergonomie de ma macro en suivant les conseils prodigués

Merci à tous

Rechercher des sujets similaires à "tester nom feuille existe deja creer nouvelle"