Erreur d'exécution 1004 - Methode select classe range a échoué

domduf33

XLDnaute Nouveau
Bonsoir le Forum.

Après beaucoup de difficultés, maitrisant très mal le vba, j'ai réussi à partir de plusieurs petites macro et d'info puisser dans ce forum à faire la macro suivante :
Elle est en deux grande partie :
1ere partie : fait des controles sur le contenu de différentes cellules.
2ème partie : fait un copier coller du contenue de deux feuilles (fichier EAF et Fichier BAP) pour les regrouper dans la feuille IMPORT puis supprime toutes les lignes dont les cellules de la colonne J est égale à zéro.

Séparément, ces deux macros fonctionnent très bien.
Réunies en une seule, j'ai le message d'erreur suivant :

"Erreur d'exécution 1004
La méthode select de la classe range a échoué"

Le "débogage" s'arrete sur la ligne :
Rows("2:150").Select (deuxième ligne après le titre Debut de l'import"). J'ai mis un :mad: pour montrer où c'est.

J'ai vraiment du mal et je ne comprend pas pourquoi séparé ca fonctionne mais réuni, ca plante.

Quelqu'un peu m'aider ?
Par avance merci

Cordialement
Dominique



LA MACRO
Private Sub CommandButton1_Click()
'
' debut des controle sur les champs à remplir obligatoirement
'
Dim Numfacture As Range
Dim Datefacture As Range
Dim Periode As Range
Dim Annee As Range
Dim MontantHT As Range
Dim MontantTTC As Range
Dim MoisConcerne As Range
Dim TVA As Range
Dim SoldeHT As Range
Dim DueDAte As Range
Dim ControlTVA As Range

Set Numfacture = Worksheets("Codification").Range("B1")
If Numfacture = "" Then
Select Case MsgBox("Le champ N° DE FACTURE est vide.", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("b1").Activate
Exit Sub
End If
'
Set Datefacture = Worksheets("Codification").Range("B2")
If Datefacture = "" Then
Select Case MsgBox("Le champ DATE est vide.", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("b2").Activate
Exit Sub
End If

Set Periode = Worksheets("Codification").Range("B3")
If Periode = "" Then
Select Case MsgBox("Le champ PERIODE est vide.", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("b3").Activate
Exit Sub
End If

Set Annee = Worksheets("Codification").Range("B4")
If Annee = "" Then
Select Case MsgBox("Le champ ANNEE est vide.", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("b4").Activate
Exit Sub
End If

Set MontantHT = Worksheets("Codification").Range("d1")
If MontantHT = "" Then
Select Case MsgBox("Le champ MONTANT HT est vide.", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("d1").Activate
Exit Sub
End If

Set MontantTTC = Worksheets("Codification").Range("d2")
If MontantTTC = "" Then
Select Case MsgBox("Le champ MONTANT TTC est vide.", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("d2").Activate
Exit Sub
End If

Set MoisConcerne = Worksheets("Codification").Range("d3")
If MoisConcerne = "" Then
Select Case MsgBox("Le champ MOIS CONCERNE est vide.", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("d3").Activate
Exit Sub
End If

Set TVA = Worksheets("Codification").Range("F1")
If TVA = "" Then
Select Case MsgBox("Le champ MONTANT TVA est vide.", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("F1").Activate
Exit Sub
End If

Set DueDAte = Worksheets("Codification").Range("h1")
If DueDAte = "" Then
Select Case MsgBox("Le champ DUE DATE est vide.", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("h1").Activate
Exit Sub
End If

Set SoldeHT = Worksheets("Codification").Range("h1")
If SoldeHT <> MontantHT Then
Select Case MsgBox("Le solde HT (H1) des données saisies dans la colonne G, est différent du montant HT (D1).", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("h1").Activate
Exit Sub
End If

Set ControlTVA = Worksheets("Codification").Range("e2")
If ControlTVA <> "OK" Then
Select Case MsgBox("Le TOTAL (Montant HT + le Montant TVA) est <> du Montant TTC.", vbOKOnly + vbExclamation, "ASF - ERREUR A LA SAISIE")
Case vbOK
End Select
Worksheets("Codification").Activate
Range("f1").Activate
Exit Sub
End If
'fin des controles

'DEBUT DE L'IMPORT
Sheets("IMPORT").Select
:mad: Rows("2:150").Select :mad: (c'est sur cette ligne là)
Selection.Delete Shift:=xlUp
Sheets("Fichier EAF").Select
Rows("6:150").Select
Range("C6").Activate
Selection.Copy
Sheets("IMPORT").Select
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Fichier BAP").Select
Rows("4:154").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("IMPORT").Select
ActiveWindow.SmallScroll Down:=12
Range("A50").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("G48").Select
ActiveWindow.SmallScroll Down:=45

' supprimer les ligne à zero par rapport à la colonne J
Worksheets("IMPORT").Select
Dim l As Long
For l = Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
If Cells(l, "j").Value = 0 _
Or Cells(l, "j").Value = "" Then Cells(l, 1).EntireRow.Delete
Next l

End Sub
 

domduf33

XLDnaute Nouveau
Re : Erreur exécution 1004 - Methode select classe range échoué -Ca marche mais ?

Bonsoir Pascal XLD.

Merci beaucoup pour ta réponse.
La macro était collé au bouton CommandButton1 de la feuille Codification.
En supprimant la macro du bouton CommandButton1 et en la collant directement à la racine du module1, elle fonctionne effectivement correctement.
Du coup, si vous pouviez m'accorder quelques minutes, j'aurais plusieurs question à vous poser afin d'éclairer ma lanterne.

1 - Cette macro était copier dans le bouton CommandButton1 de la feuille codification. Pourquoi, le fait de la copier sur un module la fait fonctionner alors qu'elle plante dans la feuille codification ?

2 - Comment puis-je relier physiquement mon bouton qui se trouve sur la feuille codification à la macro qui du coup se trouve sur le module1

3 - comment déterminer s'il faut mieux mettre la macro sur un des trois modules du vba projet ou s'il faut mieux la mettre sur une des "feuilles" du vbaprojet ?

En tout cas merci
Cordialement
Dominique
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Erreur d'exécution 1004 - Methode select classe range a échoué

Bonsoir le fil, bonsoir le forum,

C'est classique ! Quand on lance une macro d'un bouton qui se trouve dans un onglet et que l'on veut sélectionner une plage dans un autre onglet il faut évidemment sélectionner l'onglet :
Code:
Sheets("IMPORT").Select
Mais, et c'est là que l'erreur se produit souvent, il faut aussi sélectionner la plage en indiquant dans quel onglet elle se trouve.
Donc :
Code:
[COLOR=red]Rows("2:150").Select[/COLOR]
Va planter ! Alors que :
Code:
Sheets("IMPORT").Rows("2:150").Select
Va fonctionner !
Le mieux c'est encore le With... End With :
Code:
With Sheets("IMPORT")
     .Select
     .Rows("2:150").Select
End With
Mais en règle générale iol faut éviter les Select qui ralentissent considérablement le code. Ton code fonctionnera de la même manière comme ça :
Code:
Sheets("IMPORT").Rows("2:150").Delete Shift:=xlUp
Sheets("Fichier EAF").Rows("6:150").Copy
Sheets("IMPORT").Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Sheets("Fichier BAP").Rows("4:154").Copy
Sheets("IMPORT").Range("A50").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
 
Dernière édition:

domduf33

XLDnaute Nouveau
Re : Erreur d'exécution 1004 - Methode select classe range a échoué

Bonsoir Robert

Merci pour les explications.
J'ai essayé d'insérer ton modèle dans la macro mais du coup, c'est la dernière partie qui n'est plus bonne (celle de la suppression des lignes de l'onglet IMPORT dont les cellule de la colonne J contienne le chiffre zéro.
Si je suis déjà sur la feuille IMPORT tout fonctionne, si je suis sur la feuille CODIFICATION (ce qui est le cas puisque le bouton action qui lance la macro est sur l'onglet CODIFICATION) alors c'est sur cette onglet que les lignes sont supprimées et pas sur l'onglet IMPORT

J'y comprend de moins en moins

Que dois faire ?

cordialement


Private Sub CommandButton1_Click()

J'ai supprimé toutes la partie des controles qui fonctionne très bien

'debut de l'import
Sheets("IMPORT").Rows("2:150").Delete Shift:=xlUp
Sheets("Fichier EAF").Rows("6:150").Copy
Sheets("IMPORT").Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Fichier BAP").Rows("4:154").Copy
Sheets("IMPORT").Range("A50").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("G48").Select
ActiveWindow.SmallScroll Down:=45

' supprimer les ligne à zero
Worksheets("IMPORT").Activate
Dim l As Long
For l = Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
If Cells(l, "j").Value = 0 _
Or Cells(l, "j").Value = "" Then Cells(l, 1).EntireRow.Delete
Next l

End Sub
 

JNP

XLDnaute Barbatruc
Re : Erreur d'exécution 1004 - Methode select classe range a échoué

Bonjour le fil :),
Si je suis déjà sur la feuille IMPORT tout fonctionne, si je suis sur la feuille CODIFICATION (ce qui est le cas puisque le bouton action qui lance la macro est sur l'onglet CODIFICATION) alors c'est sur cette onglet que les lignes sont supprimées et pas sur l'onglet IMPORT
Tu n'a pas poursuivi jusqu'au bout l'explication de Robert
Code:
 ' supprimer les ligne à zero
[COLOR=red][B]With[/B][/COLOR] Sheets("IMPORT")
Dim l As Long
For l = [SIZE=4][COLOR=red][B].[/B][/COLOR][/SIZE]Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
If [B][SIZE=4][COLOR=#ff0000].[/COLOR][/SIZE][/B]Cells(l, "j").Value = 0 _
Or [B][SIZE=4][COLOR=#ff0000].[/COLOR][/SIZE][/B]Cells(l, "j").Value = "" Then [B][SIZE=4][COLOR=#ff0000].[/COLOR][/SIZE][/B]Cells(l, 1).EntireRow.Delete
Next l
[COLOR=red][B]End With[/B][/COLOR]
Bon WE :cool:
 

domduf33

XLDnaute Nouveau
Re : Erreur d'exécution 1004 - Methode select classe range a échoué

Bonjour le Forum et bonjour JNP.

Effectivement, j'avais pas tout suivi. Maintenant avec les explications de Robert et les tiennes tout fonctionne à merveilles. Et qui plus est, la macro est beaucoup plus rapide que celle que j'avais bidouiller à l'origine.:)
Je saurai maintenant qu'il faut systématiquement utiliser with et end with quand on veux faire référence à un onglet qui se trouve sur un autre onglet que celui où l'on est.

Merci à vous tous. Non seulement, vous prennez de votre temps pour nous dépatouiller mais en plus vous nous expliquez le pourquoi du comment ce qui permet d'évtier de faire les même erreurs (du moins d'essayer). J'en ai appris beaucoup plus en fouillant dans ce forum qu'avec le manuel de vba que je me suis acheté.
Vraiment, et le je pense sincèrement, merci à vous tous.:)

Cordialement
Dominique
 

Discussions similaires

Statistiques des forums

Discussions
311 709
Messages
2 081 754
Membres
101 812
dernier inscrit
trufu