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 = nbFile

compteurcol 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 = nbFile

Mais 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 Sub

Pas 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:=xlFillDefault

A 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:=xlFillDefault

Merci 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 With

J'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.

Rechercher des sujets similaires à "probleme fonction autofill"