eljulios
Messages postés7Date d'inscriptionlundi 11 février 2008StatutMembreDernière intervention17 avril 2008
-
16 avril 2008 à 23:37
eljulios
Messages postés7Date d'inscriptionlundi 11 février 2008StatutMembreDernière intervention17 avril 2008
-
17 avril 2008 à 21:38
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
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 17 avril 2008 à 08:23
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
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 17 avril 2008 à 17:21
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.
eljulios
Messages postés7Date d'inscriptionlundi 11 février 2008StatutMembreDernière intervention17 avril 2008 17 avril 2008 à 21:38
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 = ""