Erreur 1004 sous VBA

Résolu
Signaler
Messages postés
7
Date d'inscription
lundi 11 février 2008
Statut
Membre
Dernière intervention
17 avril 2008
-
Messages postés
7
Date d'inscription
lundi 11 février 2008
Statut
Membre
Dernière intervention
17 avril 2008
-
Bonjour,


Je conçoit une macro qui, dans un premier temps, à partir d'un fichier
Excel ouvre un autre fichier Excel. Je voudrais alors sélectionner une
plage de cellules dans le fichier ouvert mais je rencontre une erreur
1004. J'ai pas mal cherché sur le net, y compris sur ce forum, mais je
n'arrive pas à résoudre mon problème.

Voici mon code :


Public Sub fiche()


' Déclaration et initialisation des varibales


Dim nbr_fichiers As Integer, i As Integer, j As Integer, N As Integer, k As Integer, m As Integer

Dim feuille_active As String, book_actif As String

Dim tableau_fichiers() As String, tableau_valeurs()


N = 0

' Informations fichiers


nbr_fichiers = InputBox("Veuillez renseigner le nombre de fichiers à ouvrir", "Nombre de fichiers")


' Redimensionnement du tableau


ReDim tableau_fichiers(nbr_fichiers)


' Boucle sur les noms de fichiers


For i = 0 To nbr_fichiers - 1

tableau_fichiers(i) = InputBox("Veuillez indiquez le chemin du
fichier " & CStr(i) & " (ex : C:\Dossier\fichier.xls)", "Nom du
fichier " & CStr(i))


Next i


'' Boucle principale


For j = 0 To nbr_fichiers - 1


' Ouverture du fichier


Set ObjExcel = CreateObject("EXCEL.APPLICATION") ' Création d'un objet Excel

Set ObjFeuil = ObjExcel.Workbooks.Open(tableau_fichiers(j)) ' Création d'un objet feuille et ouverture d'un fichier

ObjExcel.Visible = True 'Affichage du resultat


' Conversion et remplacement des points par des virgules


ObjExcel.Range("A4").Select


Do


N = N + 1

ObjExcel.ActiveCell.Offset(1, 0).Select


Loop Until ObjExcel.ActiveCell.Value = ""


ObjExcel.Range(Cells(4, 1), Cells(4 + N - 1, 1)).Select

...


C'est à ce moment que l'exécution s'arrête et qu'il me met le message d'erreur. Un p'tit coup de main svp

eljulios

5 réponses

Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
une idée me vient au réveil
ton code travail au niveau workbook
il devrait travailler au niveau du worksheet
dans un workbook il ne peut y avoir qu'une seule cellule active donc la premiere partie de ton code fonctionne
mais quand tu fais le dernier select ( celui qui occasionne l'erreur) tu ne lui dit pas dans quelle worksheet il doit faire la selection
donc ta ligne
ObjExcel.Range(Cells(4, 1), Cells(4 + N - 1, 1)).Select
devrait être
ObjExcel.sheets(index).select
Range(Cells(4, 1), Cells(4 + N - 1, 1)).Select
ou
ObjExcel.sheets(index).Range(Cells(4, 1), Cells(4 + N - 1, 1)).Select

en espérant que c'est la bonne solution
car perso je ne sais plus trop où se trouve l'erreur autrement
j'ai atteint ici mon niveau d'incompétence
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
11
Salut,

comprend pas non plus, mais ce qui suit marche

Do
    N = N + 1
    Objexcel.ActiveCell.Offset(1, 0).Select
Loop Until Objexcel.ActiveCell.Value = ""
N = N - 1
Objexcel.Range("A4:A" & 4 + N).Select

Autre chose il y a beaucoup a dire sur ton code car il y a au moins un risque de plantage toute les 2 lignes.
par exemple :
- quand tu demandes un nombre de fichier, si l'utilisateur saisi autre chose qu'un chiffre ca plante.
- si le nom du fichier a ouvrir contient des majuscules et meme si l'utilisateur ecrit le nom correctement ca plante.
- si l'utilisateur ecrit un chemin incorrect ou un nom de fichier qui n'existe pas ca plante.
- si l'utilisateur clique sur cancel ca plante
etc.

de plus a quoi cela sert de creer une nouvelle instance excel pour chaque fichier alors que tous les fichiers pourraient etre ouvert dans la meme instance : tu créés ton instance, tu ouvres le premier fichier, tu travails dessus, tu le fermes, tu ouvres le deuxieme fichier etc. Une fois le traitement de tous les fichiers terminé tu fermes l'intance excel.

y a du boulot

A+
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
bonsoir

Quelle est la valeur de  4+N-1 au moment du plantage ?
Messages postés
7
Date d'inscription
lundi 11 février 2008
Statut
Membre
Dernière intervention
17 avril 2008

La valeur est de 14 (N = 11) cependant la valeur de N peut changer d'un fichier à un autre.

eljulios
Messages postés
7
Date d'inscription
lundi 11 février 2008
Statut
Membre
Dernière intervention
17 avril 2008

Bonsoir,

En fait, je me suis inspiré de ce que vous m'avez dit, j'ai cherché encore un peu (car ça ne marchait pas) et en fouillant dans les méthodes des collection c'est là que j'ai trouvé !!!

Je vous remercie donc pour votre aide, bigfish_le_vrai je sais que mon code n'est pas parfait, je suis conscient qu'il y a pas mal de lacunes mais vu l'utilisation qui va en être faite, je ne me fait pas de soucis !

En ce qui concerne ta remarque sur les instances d'Excel, avant d'avoir ce problème je ne savais pas ce que c'était. J'ai récupéré cette partie du code sur le net. Mais en effet, ne pas le faire est tout de même plus pratique !

Pour info, je mets mon code corrigé, au cas où, ça peut servir !

Merci encore et bonne soirée.

Public Sub fiche()

'' Déclaration et initialisation des varibales

    ' Constantes

        Dim nbr_fichiers As Integer, i As
Integer, j As Integer, N As Integer, k As Integer, m As Integer
        Dim nom_fichier As String

    ' Tableaux

 

        Dim
tableau_fichiers() As String, tableau_nom_fichier() As String,
tableau_valeurs()

    ' Constantes fichiers

 

     Dim wbook As Workbook
      Dim wsheet As Worksheet

    ' Initialisation

        N = 0

'' Informations fichiers

    nbr_fichiers =
InputBox("Veuillez renseigner le nombre de fichiers à ouvrir",
"Nombre de fichiers")
 

'' Redimensionnement du tableau

    ReDim
tableau_fichiers(nbr_fichiers)
 

'' Boucle sur les noms de fichiers

    For i = 0 To nbr_fichiers - 1

        tableau_fichiers(i)
= InputBox("Veuillez indiquez le chemin du fichier " & CStr(i)
& " (ex : C:\Dossier\fichier.xls)", "Nom du fichier "
& CStr(i))

    Next i

'' Boucle
principale

    For j = 0 To nbr_fichiers - 1

    ' Ouverture du fichier           Set wbook =
Workbooks.Open(tableau_fichiers(j))
        nom_fichier =
wbook.Name
       
tableau_nom_fichier = Split(nom_fichier, ".")
        Set wsheet =
wbook.Worksheets(tableau_nom_fichier(0))

    ' Conversion et
remplacement des points par des virgules

         
wsheet.Range("A4").Select
  
        Do

            N = N + 1
           
wsheet.Application.ActiveCell.Offset(1, 0).Select    

        Loop Until
wsheet.Application.ActiveCell.Value = ""   

       
wsheet.Range("A4:A" & 4 + N - 1).Select      
       
wsheet.Application.Selection.TextToColumns
Destination:=Range("A4"), DataType:=xlFixedWidth,
FieldInfo:=Array(Array(0, 1), Array(5, 1))
       
wsheet.Application.Selection.Replace What:=".",
Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows,
MatchCase:=False

eljulios