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é
Voila la déclaration de variable que j'ai fait dans mon module:
et enfin voila la function qui était donné par Galopin01 et que je tente d'appliquer
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