XL 2016 Erreur d'exécution 9 - L'indice n'appartient pas à la sélection (recherche de la dernière ligne vide d'une feuille)

tdo88

XLDnaute Nouveau
Bonsoir,

Je suis nouveau sur le forum et en plein apprentissage.

Je rencontre une erreur d'exécution 9 sur la ligne suivante : DerniereLigne = Worksheets("liste_import").Range("A" & Cells.Rows.Count).End(xlUp).Row

Je cherche à copier la feuille 1 d'un classeur vers la feuille nommée "liste_import" dans le fichier joint.

Je dois conserver les données importées sur la feuille "liste_import" d'où la recherche de la dernière ligne.

J'ai essayé de résoudre le problème par moi-même et de trouver la solution en consultant le forum mais je ne suis pas parvenu à trouver l'erreur/problème et sa solution :-(

Je joins ci-dessous l'extrait du code et si besoin mon fichier.

Merci d'avance à celui qui pourra m'aider à y voir clair.

Bonne soirée.

VB:
Private Sub Button_selection_Click()

    'Déclaration des variables
    Dim ListeFichier As Variant
    Dim MonClasseur As Workbook
    Dim DerniereLigne As Long
        
    'On récupère le fichier source contenant les données à copier
    ListeFichier = Application.GetOpenFilename(Title:="Sélectionnez votre classeur", filefilter:="Fichiers Excel(*.xls*),*xls'", ButtonText:="Cliquez")
    
    'Prévoir le cas du bouton annuler
    If ListeFichier <> False Then
        
        'On affecte le fichier sélectionné
        Set MonClasseur = Application.Workbooks.Open(ListeFichier)
        
        'On copie les données de la feuille 1 du classeur source sélectionné
        MonClasseur.Sheets(1).Range("A1").CurrentRegion.Copy
        
        'On cherche la dernière ligne vide de la feuille nommée "liste_import" du classeur de destination
        DerniereLigne = Worksheets("liste_import").Range("A" & Cells.Rows.Count).End(xlUp).Row
        
        'On colle les données dans le classeur de destination à la première ligne vide de la feuille nommée "liste_import"
        MonClasseur.Range("A2").Copy Destination:=Worksheets("liste_import").Range("A2" & DerniereLigne)
        
        'On ferme le classeur source
        MonClasseur.Close
        
    End If
    
End Sub
 

Pièces jointes

  • import.xlsm
    92.8 KB · Affichages: 7
Solution
Bonsoir et bonne année.
Mettez :
VB:
DerniereLigne = ThisWorkbook.Worksheets("liste_import").Range("A" & Cells.Rows.Count).End(xlUp).Row
Ou bien au début si j'ai bien compris l'intention :
Code:
    Dim RngDest As Range
    Set RngDest = Feuil16.[A1000000].End(xlUp)(2)
Et plus bas :
Code:
        MonClasseur.Sheets(1).Range("A1").CurrentRegion.Copy Destination:=RngDest

Robert

XLDnaute Barbatruc
Bonsoir Tdo et bienvenu, bonsoir le forum,

Erreur caractéristique quand le nom ne correspond pas exactement. Vérifie que le fichier contient bien un onglet nommé : liste_import... Soit tu renommes l'onglet, soit tu modifies le nom dans le code mais les deux doivent être exactement identiques.
 

Dranreb

XLDnaute Barbatruc
Bonsoir et bonne année.
Mettez :
VB:
DerniereLigne = ThisWorkbook.Worksheets("liste_import").Range("A" & Cells.Rows.Count).End(xlUp).Row
Ou bien au début si j'ai bien compris l'intention :
Code:
    Dim RngDest As Range
    Set RngDest = Feuil16.[A1000000].End(xlUp)(2)
Et plus bas :
Code:
        MonClasseur.Sheets(1).Range("A1").CurrentRegion.Copy Destination:=RngDest
 
Dernière édition:

tdo88

XLDnaute Nouveau
Bonsoir,

Merci à tous les deux pour vos réponses et je profite également pour vous souhaiter une bonne année.

Le fichier dans lequel les données sont importées contenait bien un onglet "liste_import". Les noms étaient bien identiques. J'ai néanmoins simplifié le nom en indiquant "import"

La solution proposée par @Dranreb était la bonne :)

Je rencontre cependant également la même erreur sur la ligne suivante cette fois.
VB:
MonClasseur.Range("A2").Copy Destination:=Worksheets("liste_import").Range("A2" & DerniereLigne)

J'ai essayé :

1) d'appliquer la correction proposée par Dranreb tout en veillant à modifier le nom de la feuille :
VB:
MonClasseur.Range("A2").Copy Destination:=[B]ThisWorkbook[/B].Worksheets("import").Range("A2" & DerniereLigne)

J'obtiens une erreur 438 propriété ou méthode non gérée par cet objet.

2) d'utiliser ceci :
VB:
MonClasseur.Range("A2").Copy Destination:=[B]Workbook[/B].Worksheets("import").Range("A2" & DerniereLigne)

J'obtiens une erreur 424 objet requis.

3) d'utiliser ceci :
VB:
MonClasseur.Range("A2").Copy Destination:=[B]Workbook.Sheets[/B]("import").Range("A2" & DerniereLigne)

J'obtiens aussi une erreur 424.

4) d'utiliser ceci :
VB:
MonClasseur.Range("A2").Copy Destination:=[B]Sheets[/B]("import").Range("A2" & DerniereLigne)

J'obtiens une erreur 9.

Pouvez-vous m'aiguiller éventuellement sur une autre manière de faire pour écrire cette ligne ?

Merci encore pour votre aide.

Bonne soirée.
 

Dranreb

XLDnaute Barbatruc
Un objet Workbook n'a pas de méthode Range. Plusieurs autres en ont une, Worksheet, LisObject, ListRow, LisColumn et même Range, mais pas Workbook.
Et Range("A2" & DerniereLigne) je ne sais pas ce que c'est censé prendre. Alors si DernièreLigne = 1000 par exemple vous envoyez ça en cellule A21000 d'une certaine feuille d'un certain classeur ? Bizarre !
Vous devriez préparer d'avance dans des variables As Range ce que vous voulez copier et vers où.
 
Dernière édition:

tdo88

XLDnaute Nouveau
Par Range("A2" & DerniereLigne) je souhaitais n'avoir que les données depuis la ligne 2 jusqu'à la dernière ligne de données disponibles dans le fichier source. Le résultat obtenu n'est pas le résultat escompté.
Je vais procéder comme vous me l'avez suggéré.
Un grand merci pour votre aide et vos réponses ;)
Bonne soirée.
 

Discussions similaires