Macro Etendre des formules qui s'arrête avant la fin de la dernière ligne
Bonjour
Je viens auprès de vous pour savoir si quelque trouverais mon erreur d'écriture dans ma macro car la je vois pas le problème.
J'ai des données de la colonne B jusqu'à colonne G issu de formule, je sélectionne bien ces colonnes et demande d'étendre les formules jusqu'à la dernière ligne écrite en A.
Mais pour une raison qui me dépasse il s'arrête pour toutes les colonnes en ligne 21.
En vous remerciant de votre aide par avance
Pour info je ne sais pas écrire pour plusieurs ligne en même temps et j'ai tenté cette écrire [ DernLigne = .Range("A" & .Rows.Count).End(xlUp).Row
.Range("G2").AutoFill .Range("G2:G" & DernLigne) ] mais sans aucun succès.
Voici ma macro:
Sub RSF()
Dim fich_txt As String
Dim fich_source As String
fich_source = ActiveWorkbook.Name
'demande a l'utilisateur de choisir un fichier
fich_txt = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
'ouverture du fichier txt
Workbooks.OpenText Filename:=fich_txt, Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, Local:=True, Semicolon:=True
'copie des lignes
ActiveWorkbook.Sheets(1).Range("A1:A" & ActiveWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row).Copy 'Workbooks(fich_source).Feuil1.Range("A1")
'collage spéciale des valeurs
Workbooks(fich_source).Sheets(1).[A1].PasteSpecial xlValues
'fermeture du fichier
Application.DisplayAlerts = False
ActiveWorkbook.Close False
Application.DisplayAlerts = True
Range("B1").Select
ActiveCell.FormulaR1C1 = "Type"
Range("B2").FormulaLocal = "=GAUCHE(A2;1)"
Range("C1").Select
ActiveCell.FormulaR1C1 = "N° Séjour"
Range("C2").Select
ActiveCell.FormulaR1C1 = "=IF(COUNTIF(RC2,""A""),MID(RC1,40,9),MID(RC1,38,9))" ''=SI(NB.SI($B2;"A");STXT($A2;40;9);STXT($A2;38;9))
Range("D1").Select
ActiveCell.FormulaR1C1 = "Code Forfait"
Range("D2").FormulaLocal = "=SI(NB.SI($B2;""B"");STXT($A2;78;5);SI(NB.SI($B2;""C"");STXT($A2;78;5);""""))"
Range("E1").Select
ActiveCell.FormulaR1C1 = "Date"
Range("E2").FormulaLocal = "=SI(NB.SI($B2;""A"");DATE(STXT(A2;89;4);STXT(A2;87;2);STXT(A2;85;2));SI(NB.SI($B2;""B"");DATE(STXT(A2;74;4);STXT(A2;72;2);STXT(A2;70;2));SI(NB.SI($B2;""C"");DATE(STXT(A2;74;4);STXT(A2;72;2);STXT(A2;70;2));SI(NB.SI($B2;""M"");DATE(STXT(A2;71;4);STXT(A2;69;2);STXT(A2;67;2));""""))))"
Range("F1").Select
ActiveCell.FormulaR1C1 = "CCAM"
Range("F2").FormulaLocal = "=SI(NB.SI($B2;""M"");STXT($A2;75;13);"""")"
Range("G1").Select
ActiveCell.FormulaR1C1 = "Prix Unitaire"
Range("G2").FormulaLocal = "=SI(NB.SI($B2;""B"");STXT($A2;100;7);SI(NB.SI($B2;""C"");STXT($A2;94;7);""""))"
Range("B2:G2").Select
Range("B2:G2").AutoFill Destination:=Range("B2:G2" & Range("A65536").End(xlUp).Row)
'Permet transformation la colonne en date courte
Columns("E:E").Select
Application.CutCopyMode = False
Selection.NumberFormat = "m/d/yyyy"
'Permet de centrer les colonnes d'abord en Haureur puis en Horizontale
Columns("B:G").Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
End Sub
Bonjour,
Avez vous des lignes masquées et/ou filtrées ? Avez-vous vérifié que la cellule G21 n'est pas vide ?
Utilisez ceci Anonymisation de données pour Excel (excel-pratique.com) et envoyez votre fichier avec la feuille qui plante et le code VBA correspondant. J'aurai besoin de le lancer moi-meme pour comprendre l'origine du problème. Le code "a l'air" correcte, donc c'est probablement la structure des données qui ne va pas.
Je vais voire ce que je peux faire car en faite le début de ma macro transforme un fichier txt en excel sur la colonne A puis j'intégre les formules dans les autres colonnes. Donc il faut surtout que je modifie les donnée de base dans txt et je reviens vers vous
Il m'est beaucoup trop compliqué d'anonymiser mon fichier car celui ci contiens un volume de ligne très importante (393 800 lignes).
Mais je fini par me demandé si la macro n'arrête pas justement du au nombre de ligne.
Merci de ton aide quand même
Bonjour,
Vous n'avez pas besoin de partager tout votre fichier ! Si la macro plante à la ligne 21, anonymisez les 30 premières lignes et supprimez le reste (et les autres feuilles si non utilisées).
Après effectivement, si vous avez 300k lignes… Vous devriez vraiment considérer d'autres outils comme PowerQuery. Cependant, à première vue votre macro ne doit pas etre limitée par le nombre de lignes. Elle peut etre très lente, mais il n'y a rien a-priori, qui la ferait s'arreter plus tot que prévu à cause de la taille. Surtout à la ligne 21.
Et bien pour power query c'est effectivement une bonne idée mais sur mon pc de boulo le service informatique bloque tout donc difficile de l'avoir.
Quant à mon fichier j'ai fait le test avec beaucoup moins de ligne, genre 10 000 et donc la, la macro fonctionne jusqu'au bout.
C'est pour ca que je pense sincèrement maintenant que mes milliers de lignes doivent interférer.
Bonsoir, je viens de penser à quelque chose. Avez-vous essayé d'ajouter
Application.Calculation=xlCalculationManual
Au début de votre sub, et
Application.Calculation=xlCalculationAutomatic
A la fin ?
Étant donné que vous insérez énormément de formules, c'est indispensable. C'est peut-être cela qui vous fait planter, je n'y avais pas pensé.
De même, ajoutez
Application.ScreenUpdating=False au début du Sub si ce n'est pas déjà fait.
Si vous travaillez sur 300k lignes, toutes les optimisations sont importantes.
Bonjour à tous,
tu peux écrire ta formule sur toute la plage au lieu de l'étendre ensuite.
Ex :
Dim derlig As Long
derlig = Range("A" & Cells.Rows.Count).End(xlUp).Row
Range("B2").Resize(derlig - 1).FormulaLocal = "=GAUCHE(A2;1)"eric
PS : évite les .Select inutiles dans 99% des cas et qui ralentissent beaucoup, et de travailler avec ActiveCell.
Si un utilisateur réussi à sélectionner une autre cellule ça ne te fera que de la merdia
' non !!
Range("B1").Select
ActiveCell.FormulaR1C1 = "Type"
' mais :
Range("B1").FormulaR1C1 = "Type" ' directement
' et en l'occurrence ça serait plutôt .Value ici...Mille merci à tous les 2 pour votre précieuse aide, ca fonctionne nickel.
