Problème avec la fonction AutoFill
Bonjour,
Je souhaite utiliser la fonction AutoFill pour mon programme, j'ai trouvé comment ça s'écrivait en utilisant l'enregistrement de macro mais lorsque je la lance cela ne fonctionne pas, message d'erreur: "La méthode AutoFill de la classe Range a échoué".
Voici le code:
Set f2 = Workbooks(1).Worksheets("Moyenne")
f2.Select
cptFile = 0
Columns(compteurcol).Select
Do
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
f2.Columns(compteurcol - 1).Select
Selection.AutoFill Destination:=f2.Columns(compteurcol), Type:=xlFillDefault
cptFile = cptFile + 1
Loop Until cptFile = nbFilecompteurcol est ma variable qui va "détecter" la première colonne vide, elle est numérique (valeur de 78 par exemple).
Le code fonctionnait bien avant l'utilisation du AutoFill.
Bonjour
Vous devez partir d'une cellule et pas de la colonne entière
Vous partez de quelle cellule et combien de lignes sont concernées par la recopie de la formule ?
exemple ici -->https://forum.excel-pratique.com/s/goto/1172074
Au besoin mettez un fichier exemple sans données sensibles ou alors utilisez l'enregistreur automatique d'excel pour faire l'opération puis collez le code ici.
Crdlt
OK merci je vais essayer.
Cependant c'est étranges car manuellement et avec l'outil enregistrement de macro l'utilisation d'un colonne fonctionne tout de même.
J'ai essayé ceci:
Do
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
f2.Range(Cells(10, compteurcol - 1), Cells(10 + compteur, compteurcol - 1)).Select
Selection.AutoFill Destination:=f2.Range(Cells(10, compteurcol), Cells(15 + compteur, compteurcol)), Type:=xlFillDefault
cptFile = cptFile + 1
Loop Until cptFile = nbFileMais il me dis toujours que la méthode a échoué.
Aussi, je remarque que dans :
Cells(15 + compteur, compteurligne)Que je mette 10, 15 ou 20 + compteur la zone reste la même et ne va pas plus bas comme je l’espérerai. Une idée du problème ?
Et votre variable "compteur" cela correspond à quoi ?
La variable compteur correspond à la dernière ligne utile.
Plus haut dans le code elle va "compter" les lignes en partant de 10 (car avant il n'y a rien) et elle s'arrête à la première case vide. Cela permet de savoir combien de lignes de données il y a dans mon tableau.
Ce n'est pas clair.
Mettez le code en entier ou alors postez le fichier
OK pas de problème ça peut effectivement être plus simple. La partie qui nous intéresse se trouve à la fin.
Sub AjouterPlusieursColonnes()
'Ajoute toutes les données de plusieurs fichiers dont le chemin est spécifié
Dim a As Integer 'variable position de / dans chaine
Dim toto As Variant
Dim titi As Variant
Dim NomFichier As String
Dim numeroMesure, numeroChassis As Integer
Dim nbFile As Integer
For Each wk In Workbooks
If wk.Name <> ThisWorkbook.Name Then wk.Close
Next
'boite de dialogue qui permet d'ouvrir des documents en xlsY (Y = n'importe quoi), par exemple xls et xlsx
Dim filetoopen()
filetoopen = Application.GetOpenFilename("Excel Files(*.xls*), (*.xls*)", , , , True)
If IsArray(filetoopen) Then
nbFile = UBound(filetoopen)
End If
For Each o In filetoopen
Workbooks.Open o
NomFichier = ActiveWorkbook.Name
'vérifier qu'on a le bon fichier
Set f0 = Workbooks(2).Worksheets(1) 'correspond au document dans lequel on va chercher les données
Set f1 = Workbooks(1).Worksheets("Data") 'correspond au document SPC, feuille "Data"
Set f2 = Workbooks(1).Worksheets("Moyenne") 'correspond au document SPC, feuille "Moyenne"
Application.ScreenUpdating = False
'determination du numero de la première colonne disponible où copier les données
compteurligne = 7 'il ne s'agit pas de la ligne mais de la colonne
Do
compteurligne = compteurligne + 1
Loop Until f1.Cells(10, compteurligne) = ""
'définition des emplacements des données importantes et mise en place des données pour pouvoir les copier-coller ensuite
If Mid(NomFichier, 1, 9) = "Polyworks" Then '---- il faut qu'à partir du 1er pendant 9 charactère il y ait bien "Polyworks" d'écris (dans le nom du doc Polyworks)
If Mid(f0.Cells(3, 5), 2, 2) <> "0" Then ' (3,5)= cellule E3
a = InStr(1, f0.Cells(3, 5), "/")
numeroMesure = Val(Mid(f0.Cells(3, 5), 1, a - 1)) 'récupère le numéro du 1er charactère jusqu'à la case avant le /
numeroChassis = Val(Mid(f0.Cells(3, 5), a + 4, 6)) 'récupère le numéro de 4 cases après le / pendant 6 charactères
Else
a = InStr(1, NomFichier, "_N") '--- le Else ne fontionne pas
numeroMesure = Val(Mid(NomFichier, 1, a - 1))
numeroChassis = Val(Mid(NomFichier, a + 3, 6))
End If
compteur = 1
Do
rang = f1.Cells((10 + compteur), 1)
f0.Cells((12 + compteur), 12).Copy 'permet de récupérer les données une par une de la colonne 12 à partir de la ligne 12+1
f0.Cells((12 + compteur), 20).PasteSpecial (xlValues) 'on va mettre chaque données dans la colonne 20 (une colonne vide)
compteur = compteur + 1
Loop Until rang = ""
f1.Cells(7, compteurligne) = "Polyworks"
Else
If Mid(f0.Cells(2, 2), 2, 2) <> "0" Then
a = InStr(1, f0.Cells(2, 2), "/")
numeroMesure = Val(Mid(f0.Cells(2, 2), 1, a - 1)) 'récupère le numéro du 1er charactère jusqu'à la case avant le /
numeroChassis = Val(Mid(f0.Cells(2, 2), a + 4, 6)) 'récupère le numéro de 4 cases après le / pendant 6 charactères
Else
a = InStr(1, NomFichier, "_N") '--- le Else ne fontionne pas
numeroMesure = Val(Mid(NomFichier, 1, a - 1))
numeroChassis = Val(Mid(NomFichier, a + 3, 6))
End If
compteur = 1
Do 'détecte dans la 3e colonne du tableau SPC si il y a un Xbr, Ybr ou un Zbr pour copier au bon endroit
rang = f1.Cells((10 + compteur), 1)
If f1.Cells((10 + compteur), 3) = "Xbr" Then
f0.Cells((8 + rang), 9).Copy
Else
If f1.Cells((10 + compteur), 3) = "Ybr" Then
f0.Cells((8 + rang), 10).Copy
Else '= "Zbr"
f0.Cells((8 + rang), 11).Copy
End If
End If
f0.Cells((8 + compteur), 20).PasteSpecial (xlValues)
compteur = compteur + 1
Loop Until f1.Cells((10 + compteur), 1) = "" 'jusqu'à ce qu'il n'y ait plus de ligne de valeur dans le tableau SPC
f1.Cells(7, compteurligne) = "Baltic"
End If
'copie de la colonne des mesures vers la feuille Data du fichier SPC
Var = 10 + compteur
If Mid(NomFichier, 1, 9) = "Polyworks" Then
'on copie les données de la colonne 20 et on les colles dans "Data"
f0.Cells(13, 20).Select '= cellule T13
f0.Range("T13:T" & Var).Select 'permet de copier toutes la plage de données de la colonne 20 même s'il en manque
Selection.Copy
Workbooks(1).Activate
f1.Cells(11, compteurligne).PasteSpecial (xlValues)
f0.Cells(7, 5).Copy 'copie de la cellule contenant la date
f1.Cells(9, compteurligne).PasteSpecial (xlValues) 'colle dans la cellule adéquate du doc SPC
Else
'on copie les données de la colonne 20 et on les colles dans "Data"
f0.Cells(9, 20).Select '= cellule T9
f0.Range("T9:T" & Var).Select 'permet de copier toutes la plage de données de la colonne 20 même s'il en manque
Selection.Copy
Workbooks(1).Activate
f1.Cells(11, compteurligne).PasteSpecial (xlValues)
f0.Cells(3, 2).Copy 'copie de la cellule contenant la date
f1.Cells(9, compteurligne).PasteSpecial (xlValues) 'colle dans la cellule adéquate du doc SPC
End If
'collage des numeros de chassis et mesure dans leur cellule adéquate du doc SPC
f1.Cells(10, compteurligne) = numeroChassis
f1.Cells(8, compteurligne) = numeroMesure
Application.ScreenUpdating = True
'On ferme le fichier de donnees
Workbooks(2).Application.CutCopyMode = False
'On met à true pour ne pas enregistrer les modifications
Workbooks(2).Saved = True
Workbooks(2).Close
Workbooks(1).Activate
Next o
'---/\-------------------------------- Partie qui nous intéresse ----------
f2.Select
cptFile = 0
Columns(compteurligne).Select
Do
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
f2.Range(Cells(10, compteurligne - 1), Cells(10 + compteur, compteurligne - 1)).Select
Selection.AutoFill Destination:=f2.Range(Cells(10, compteurligne), Cells(15 + compteur, compteurligne)), Type:=xlFillDefault
cptFile = cptFile + 1
Loop Until cptFile = nbFile
'---/\-------------------------------- Partie qui nous intéresse ----------
MsgBox "Fin de l'import !" '------------
End SubPas facile de comprendre en fait.
Au début de votre demande vous dites que la méthode Autofill fonctionne en utilisant l'enregistreur de macro
C'est cette macro qu'il faudrait voir ou un fichier comme je vous ai dit
La variable Compteurligne est une colonne si je comprends : bizarre comme nom car cela prête à confusion
Dans la ligne précédente vous sélectionnez la colonne compteurligne - 1
Dans la ligne Autofil, le souci vient de la variable compteurligne car cette colonne est vide
Si vous utilisez Autofil vous devez rester sur la même plage. regardez les liens que je vous ai donnés avant.
Pour le voir, si vous mettez ceci, vous n'avez plus de bug
Selection.AutoFill Destination:=f2.Range(Cells(10, Compteurligne - 1), Cells(15 + compteur, Compteurligne - 1)), Type:=xlFillDefaultA la vue de votre code ce n'est pas un copier coller qui est à faire ?
Je n'ai peut-être pas été clair mais j'ai seulement utilisé l'enregistreur de macro pour voir la formulation Excel de cette fonction en VBA. Formulation que j'ai ensuite adapté à mon code.
compteurligne est juste un nom mais il est vrai que cela peut porter à confusion puisqu'il fonctionne pour les colonnes. Je l'ai modifié.
Le code que j'ai envoyé est le code qui est utilisé, je ne vois pas de raison de vous envoyer plus.
J'ai trouvé une solution qui fonctionne à mon problème:
f2.Select
cptFile = 0
compt = compteurcol
Do
Columns(compt).Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
cptFile = cptFile + 1
compt = compteurcol + 1
Loop Until cptFile = nbFile
f2.Range(Cells(10, compteurcol - 3), Cells(1000, compteurcol - 3)).Select
Selection.AutoFill Destination:=f2.Range(Cells(10, compteurcol - 3), Cells(1000, compteurcol + 2)), Type:=xlFillDefaultMerci tout de même pour votre aide. Je vous souhaite une bonne journée.
Re
Le code que j'ai envoyé est le code qui est utilisé, je ne vois pas de raison de vous envoyer plus.
C'est juste plus facile car sans fichier on est obligé d'analyser en refaisant un fichier sur le coté pour comprendre ce que vous faites
Mais si vous avez la solution c'est bon et là vous avez modifié le code notamment en utilisant compteurcol-3 partout. Donc normal que cela fonctionne
Par contre vous devriez éviter tous les select dans le code. Cela ne sert à rien avec VBA sinon à ralentir le code
Exemple sur le code que vous venez de poster
With f2
.Select '??
cptFile = 0
compt = compteurcol
Do
.Columns(compt).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
cptFile = cptFile + 1
compt = compteurcol + 1
Loop Until cptFile = nbFile
.Range(.Cells(10, compteurcol - 3), Cells(1000, compteurcol - 3)).AutoFill Destination:=.Range(.Cells(10, compteurcol - 3), .Cells(1000, compteurcol + 2)), Type:=xlFillDefault
End WithJ'ai laissé le f2.select mais à vous de voir si cela sert ou pas en le désactivant lors d'un test
Crdlt
Bonjour à tous,
si tu mets ton tableau en tableau structuré (Insertion / Tableau) l'ajout de ligne en fin de tableau l'étendra en copiant formules et formats.
eric
Bonjour Eriiic,
Tableau structuré, bah oui j'y avais aussi pensé, raison aussi pour laquelle je lui demandais d'avoir un fichier.
Par contre il devrait probablement revoir son code.