Nom d'une variable déja utilisé
Hello la team,
J'ai un petit souci mineur mais qui a son importance.
L’objectif :
Il y a 2 types de fichiers, plusieurs fichiers source qui contiennent les données et un autre qui doit les récupérer via un filtre de date et de nom du fichier source.
Le code récupère copie les données venant du fichier source et les coller dans une nouvelle feuille du fichier destination et nomme la feuille au nom du fichier source.
Le code fonctionne mais si on recharge les données d'un fichier source dont la feuille existe déjà dans le fichier destination, le code plante à cause du nom ( qui est déjà existant ). Meme avec un morceau de code qui vérifie si une feuille existe.
Auriez vous une feinte à me conseiller ?
Je suis encore assez débutant donc si vous avez des remarques ou des propositions d'amélioration je suis bien évidement preneur!
Merci bien
Je vous joins le code
Sub FileBrFinal()
'----------------------------------------déclaration de variable-------------------------------------------------------------
Dim Datedebut As String
Dim Datefin As String
Dim FilePath As String, ticker As String
Dim wbTicker As Workbook, wbAssetFile As Workbook
Dim wsTicker As Worksheet, wsAssetFile As Worksheet
Dim Rng As Range, entete As Range
Application.ScreenUpdating = False
'---------------------------------------Code--------------------------------------------------------------------------------
Set wbAssetFile = Workbooks("fichierDestination.xlsm")
Set wsAssetFile = wbAssetFile.Sheets("Request")
Datedebut = wsAssetFile.Range("B1").Value
Datefin = wsAssetFile.Range("B2").Value
ticker = wsAssetFile.Range("B3").Value
FilePath = "C:\ProjetData\" & ticker & ".xlsx"
Set wbTicker = Workbooks.Open(FilePath)
Set wsTicker = wbTicker.Sheets("Feuil1")
With wsTicker
.AutoFilterMode = False
.Range("A2").AutoFilter Field:=1, Criteria1:=">=" & Format(Datedebut, "mm/dd/yyyy"), _
Operator:=xlAnd, Criteria2:="<=" & Format(Datefin, "mm/dd/yyyy"), VisibleDropDown:=False
Set Rng = .AutoFilter.Range
Set entete = .Range(Range("A3"), Range("A3").End(xlToRight))
With wbAssetFile
If .Sheets(ticker) Is Nothing Then
.Sheets.Add after:=.Sheets(Sheets.Count)
.Sheets(Sheets.Count + 1).Name = ticker ' ligne d'erreur ou le nom est déja attribué
Else: .Sheets(ticker).Cells.Clear
End If
entete.Copy .Sheets(ticker).Range("A1")
Rng.Copy .Sheets(ticker).Range("A2")
End With
End With
wbTicker.Close SaveChanges:=False
Application.ScreenUpdating = True
Set wbAssetFile = Nothing: Set wsAssetFile = Nothing: Set wbTicker = Nothing: Set wsTicker = Nothing: Set Rng = Nothing: Set entete = Nothing
End Sub
Bonjour,
une solution à mettre au début du code après la variable ticker
dim ws as worksheet
For each ws in wbAssetFile.worksheets
If ws.name=ticker then exit sub
next
Merci du retour Mus54!!
Désolé je me suis mal exprimé. Dans l'idée je souhaite que le fait de recharger des données sur une feuille déja existante écrase les anciennes données
Par exemple : si je lance la macro avec une Datedebut = 15/07, DateFin 30/07 avec un ticker
et que je relance la macro avec Datedebut = 13/07 au DateFin =16/07 avec le meme ticker, que cela écrase les anciennes données sur la feuille du ticker déjà existante .
D’où le fait de tester si la feuille existe déjà mais le nom du ticker déjà attribué pose problème.
Alors que si j'ai bien compris votre code il permet de sortir de la macro si la feuille existe déjà dans le fichier de destination
Mon soucis se situe sur ce morceau de code qui teste l'existence de la feuille
With wbAssetFile
If .Sheets(ticker) Is Nothing Then
.Sheets.Add after:=.Sheets(Sheets.Count)
.Sheets(Sheets.Count + 1).Name = ticker ' ligne d'erreur ou le nom est déja attribué
Else: .Sheets(ticker).Cells.Clear
End If
c'est louche,
as tu un fichier d'exp à nous joindre ?
Voici
J'ai changé le code en mettant une petite macro qui teste l’existence de la feuille au lieu de la boucle If avec Nothing
merci de prendre le temps !
J'avais pensé a supprimer la feuille si elle existe et puis la remplacer par une nouvelle mais le souci perdure
If FeuilleExiste(ticker) = True Then
.Sheets(ticker).Delete
Else: .Sheets.Add after:=.Sheets(Sheets.Count)
.Sheets(Sheets.Count + 1).Name = ticker
End If
je te laisse voir ça.
j'ai appliqué ce que j'avais dis premièrement.
mets les deux fichiers dans le même classeur
a+
J'avais pensé a supprimer la feuille si elle existe et puis la remplacer par une nouvelle mais le souci perdure
Remplace le code par celui ci pour supprimer la feuille.
Sub gerantFileBrFinal()
Application.ScreenUpdating = False
'----------------------------------------déclaration de variable-------------------------------------------------------------
Dim Datedebut As String
Dim Datefin As String
Dim ws As Worksheet
Dim FilePath As String, ticker As String
Dim wbTicker As Workbook, wbAssetFile As Workbook
Dim wsTicker As Worksheet, wsAssetFile As Worksheet
Dim Rng As Range, entete As Range
'---------------------------------------Code--------------------------------------------------------------------------------
Set wbAssetFile = Workbooks("fichierdestination.xlsm")
Set wsAssetFile = wbAssetFile.Sheets("Request")
Datedebut = wsAssetFile.Range("B1").Value
Datefin = wsAssetFile.Range("B2").Value
ticker = wsAssetFile.Range("B3").Value
FilePath = ThisWorkbook.Path & "\" & ticker & ".xlsx"
Set wbTicker = Workbooks.Open(FilePath)
Set wsTicker = wbTicker.Sheets("Feuil1")
With wsTicker
.AutoFilterMode = False
.Range("A2").AutoFilter Field:=1, Criteria1:=">=" & Format(Datedebut, "mm/dd/yyyy"), _
Operator:=xlAnd, Criteria2:="<=" & Format(Datefin, "mm/dd/yyyy"), VisibleDropDown:=False
Set Rng = .AutoFilter.Range
Set entete = .Range(Range("A3"), Range("A3").End(xlToRight))
With wbAssetFile
For Each ws In wbAssetFile.Worksheets
If ws.Name = ticker Then
ws.Delete
End If
Next
.Sheets.Add after:=.Sheets(Sheets.Count)
.Sheets(Sheets.Count + 1).Name = ticker ' ligne d'erreur ou le nom est déja attribué
entete.Copy .Sheets(ticker).Range("A1")
Rng.Copy .Sheets(ticker).Range("A2")
End With
End With
wbTicker.Close SaveChanges:=False
Application.ScreenUpdating = True
Set wbAssetFile = Nothing: Set wsAssetFile = Nothing: Set wbTicker = Nothing: Set wsTicker = Nothing: Set Rng = Nothing: Set entete = Nothing
End Sub
Cela marche nickel !! merci de vos retours Mus54
J'ai "complété" le code aussi avec des displayAlerts
With wbAssetFile
Application.DisplayAlerts = False
For Each ws In wbAssetFile.Worksheets
If ws.Name = ticker Then
ws.Delete
End If
Next
Application.DisplayAlerts = True
Bien à vous !!