Fermeture classeur
bonjour,
en fin de macro la ligne Workbooks(WbkB).Close savechanges:=False
me met une erreur ( quand l'onglet a un nom trop long et que celui ci est raccourci par la macro )
cdt
Dim chemin As String, Fichier As String
Dim WbkA As String ' Nom de ce fichier
Dim WbkB As String ' Nom du fichier ouvert
Application.ScreenUpdating = False
WbkA = ThisWorkbook.Name
chemin = Sheets("a").Range("A1").Value"
Fichier = Dir(chemin & "*.xls") ' 1er fichier 'Fichier = Dir(chemin & "*.xl*")
Do While (Len(Fichier) > 0)
If Mid(Fichier, InStrRev(Fichier, ".")) = ".xls" Then
If Fichier <> ThisWorkbook.Name Then
Workbooks.Open chemin & Fichier
WbkB = ActiveWorkbook.Name
Workbooks(WbkB).Sheets(1).Copy before:=Workbooks(WbkA).Sheets(1)
' On Error Resume Next
If Len(WbkB) > 31 Then WbkB = Left(WbkB, 10) '& "_" & Right(nomF, 17) & "_" & Int(Rnd() * 100 + 1)
ActiveSheet.Name = WbkB
If Err.Number = 0 Then
ActiveSheet.Name = WbkB
Else
ActiveSheet.Name = WbkB
End If
Workbooks(WbkB).Close savechanges:=False 'ActiveWorkbook.Close
End If
End If
Fichier = Dir() ' fichier suivant
Loop
Bonjour,
On reprend :
If Len(WbkB) > 31 Then
nomF = Left(WbkB, 10)
ActiveSheet.Name=nomF
' etc...
nb : n'oublies pas de déclarer nomF en string
Cdlt
Bonjour,
tu dois laisser WbkB intact et utiliser une autre variable pour renommer l'onglet (comme l'écrit jean-eric et tel que je te l'avais mis dans l'autre fil).
Accessoirement :
If Err.Number = 0 Then
ActiveSheet.Name = WbkB
Else
ActiveSheet.Name = WbkB
End If
ne sert à rien puisque tu fais la même chose dans tous les cas.
eric
je crois que cela marche !! je pense avoir compris la mécanique (grosse satisfaction perso
si quelqu'un peux me dire si je suis dans la vrai et si mon code est "propre "
un petit doute sur <= If Len(WbkB) <= 31 Then
If Fichier <> ThisWorkbook.Name Then
Workbooks.Open chemin & Fichier
WbkB = ActiveWorkbook.Name
WbkC = ActiveWorkbook.Name
Workbooks(WbkB).Sheets(1).Copy before:=Workbooks(WbkA).Sheets(1)
' On Error Resume Next
If Len(WbkB) > 31 Then WbkC = Left(WbkB, 10) '& "_" & Right(nomF, 17) & "_" & Int(Rnd() * 100 + 1)
ActiveSheet.Name = WbkC
If Len(WbkB) <= 31 Then ActiveSheet.Name = WbkB '
Workbooks(WbkB).Close savechanges:=False 'ActiveWorkbook.Close
End If
End If
Fichier = Dir() ' fichier suivant
Loop
End Sub
Ben non, ce n'est pas bon.
Si ton nom de fichier fait moins de 31 caractères tu ne nommes pas ta feuille.
Et puis WbkC comme nom de variable n'est pas heureux : on s'attend à ce que ça désigne un classeur (workbook) et c'est destiné à un nom de feuille...
Pourquoi tu t'obstines à vouloir modifier le code qu'on te donne et qui est sensé fonctionner ?
Reprend ce que je t'avais mis dans l'autre fil, colle-le tel que (remplace ta partie) et teste
eric
bonjour,
ce n'est pas de la mauvaise volonté , je fais avec mes maigres connaissances vba...
je n'arrivais pas a faire fonctionner le code donc j'ai essayé (on ne va pas me le reprocher..). voir tout en bas
j'ai essayer de le replacer a ta façon cette fois boucle sans do
If Mid(Fichier, InStrRev(Fichier, ".")) = ".xls" Then
If Fichier <> ThisWorkbook.Name Then
Workbooks.Open chemin & Fichier
WbkB = ActiveWorkbook.Name
Workbooks(WbkB).Sheets(1).Copy before:=Workbooks(WbkA).Sheets(1)
nomF = ActiveWorkbook.Name
If Len(nomF) > 31 Then nomF = Left(nomF, 10) & "_" & Right(nomF, 17) & "_" & Int(Rnd() * 100 + 1)
ActiveSheet.Name = nomF
End If
Fichier = Dir() ' fichier suivant
Loop
End Sub
par contre dans ce que j'avais mis
si inférieur ou égale à 28 caractères , la feuil prend le nom du classeur source
si plus de 28 caractères, la feuil prend les 17 1ere lettre de ce nom
cela m'a paru bien sur le moment...
WbkB = ActiveWorkbook.Name
WbkC = ActiveWorkbook.Name
Workbooks(WbkB).Sheets(1).Copy before:=Workbooks(WbkA).Sheets(1)
If Len(WbkB) > 28 Then WbkC = Left(WbkB, 17)
ActiveSheet.Name = WbkC
If Len(WbkB) <= 28 Then ActiveSheet.Name = WbkB
Workbooks(WbkB).Close savechanges:=False 'ActiveWorkbook.Close
End If
End If
Fichier = Dir() ' fichier suivant
Loop
Bonjour,
1) sur le forum merci d'utiliser la balise 'Code' pour que tes lignes de codes soient plus lisibles.
2) extraire un bout du code ne permet pas de savoir s'il est correct. Tu coupes n'importe où et on ne peut pas contrôler si la structure est correcte.
3) toujours déposer un fichier exemple avec le problème, les explications et les manip à faire.
eric
j'utiliserais la balise code si tu veux la prochaine fois. vraiment désolé
sauf ton respect j'ai l'impression qu'il y a une légère mauvaise fois dans ta réponse...
je vais mettre le sujet en résolu tout de même, la macro fonctionne malgrés tout
encore merci pour tout, c'est grâce à vos conseils sur le 1er poste
Dim chemin As String, Fichier As String
Dim WbkA As String
Dim WbkB As String
Dim WbkC As String
Application.ScreenUpdating = False
WbkA = ThisWorkbook.Name
chemin = Sheets("a").Range("B12").Value
Fichier = Dir(chemin & "*.xls")
Do While (Len(Fichier) > 0)
If Mid(Fichier, InStrRev(Fichier, ".")) = ".xls" Then
If Fichier <> ThisWorkbook.Name Then
Workbooks.Open chemin & Fichier
WbkB = ActiveWorkbook.Name
WbkC = ActiveWorkbook.Name
Workbooks(WbkB).Sheets(1).Copy before:=Workbooks(WbkA).Sheets(1)
If Len(WbkB) > 28 Then WbkC = Left(WbkB, 17)ActiveSheet.Name = WbkC
If Len(WbkB) <= 28 Then ActiveSheet.Name = WbkB
Workbooks(WbkB).Close savechanges:=False 'ActiveWorkbook.Close
End If
End If
Fichier = Dir() ' fichier suivant
Loop
sauf ton respect j'ai l'impression qu'il y a une légère mauvaise fois dans ta réponse...
Si tu peux m'expliquer où ? Que j'y veilles la prochaine fois stp.
Tu files des bouts de codes incomplets, jamais de fichiers. Pourquoi devrait-on s'embêter à faire des copié-collés de tes bouts de codes sur un fichier (qui ne ressemblera peut-être pas au tien) alors qu'il est sur ton micro ?
La 3ème fois il était temps de te dire comment faire sur un forum si tu veux motiver les réponses.
J'appelle ça parler clairement.
Si ça ne te plait pas et que ça ne te déranges pas de limiter le nombre de volontaires et d'attendre 10-15 posts pour avoir la fin, pas de soucis, continues comme ça.
eric
eh bien ne le prend pas mal
c'est juste que depuis le début du post je mettais tout sous la même forme (pas de balise code , a partir du 2eme post c'est vrai que je ne mettais que la partie du code qui posait problème...)
c'est pour cela que je parlais d'une légère mauvaise fois.
le plus souvent c'est vrai que je n'envoi pas de fichier, c'est parce que j'ai a tort l'impression que d'un coup d'œil les "expert" vba
vont voir dans le code où se situe le problème.
j'essairai d'être plus claire la prochaine fois
je ne vais pas épiloguer d'avantage ce n'est pas dans mes habitudes.
Je ne voulais certainement pas t'offusquer
amicalement
Re,
tu peux remplacer :
If Len(WbkB) > 28 Then WbkC = Left(WbkB, 17)ActiveSheet.Name = WbkC
If Len(WbkB) <= 28 Then ActiveSheet.Name = WbkB
par:
If Len(WbkC) > 28 Then WbkC = Left(WbkC, 17)
ActiveSheet.Name = WbkC
(le code fourni au départ quoi)
eric
effectivement cela fonctionne ainsi
merci de ton aide