gérer trois classeurs différents - VB/VBA/VBS - Programmation
Marsh Posté le 20-04-2007 à 09:57:43
tu peux retirer la fonction .open dans tes workbook, tu mets juste
for each cell in workbooks("vendredi13" ).range("A:A" )
next
Marsh Posté le 20-04-2007 à 10:45:43
jpcheck a écrit : tu peux retirer la fonction .open dans tes workbook, tu mets juste |
mouarf, c'est un truc comme ça que je cherchais ... merci beaucoup à toi
Marsh Posté le 20-04-2007 à 11:13:33
Euh en fait, je viens donc d'écrire
Code :
|
Et cela provoque une erreur d'exécution 9 : L'indice n'appartient pas à la sélection.
Tu saurais d'où cela peut venir ?
Marsh Posté le 20-04-2007 à 11:16:36
essaye avec ca
For Each Cellule In Workbooks("VENDREDI13AVRIL" ).Range("A:A" ).Cells
Marsh Posté le 20-04-2007 à 11:28:08
jpcheck a écrit : essaye avec ca |
Code :
|
ça me redonne la même erreur
Marsh Posté le 20-04-2007 à 11:33:33
ReplyMarsh Posté le 20-04-2007 à 11:37:04
ça me retourne une erreur d'exécution 438 : propriété ou méthode non gérée par cet objet ...
Marsh Posté le 20-04-2007 à 11:45:13
Si je comprends bien, par exemple, ici, VENDREDI13AVRIL représente l'instruction d'ouverture de l'application
dans la ligne For Each Cellule In VENDREDI13AVRIL.xls.Range("A:A" ).Cells, on lui demande de rouvrir le fichier non ?
Marsh Posté le 20-04-2007 à 12:17:03
Salut,
Workbooks, ne comporte pas de Range ni de Cells...
Workbooks("blabla" ).Worksheeets("truc" ).Cells ou Range...
A+
Marsh Posté le 20-04-2007 à 13:43:09
galopin01 a écrit : Salut, |
je viens de modifier comme ceci :
Code :
|
et ça s'arrêt à la ligne 32 en faisant une erreur 9 : indice n'appartenant pas à la sélection
Pourtant, ça me paraissait bon cette fois-ci
Marsh Posté le 20-04-2007 à 14:40:01
VENDREDI13AVRIL est une variable (As Excel.Workbook) et tu l'utilises comme un string
de même FeuilleVENDREDI13AVRIL est une variable (As Excel.Worksheet) et tu l'utilises comme un string
Ou tu utilises tes variables instanciées ou tu utilises directement les noms de claseurs et de feuilles.
De manière générale il est maladroit d'utiliser des noms de variables équivoques (semblables aux noms d'objets)
En gros ça donne, (non verifié et codé avec le pied... )
ou :
For Each Cellule In Workbooks("VENDREDI 13 AVRIL. xls" ).Worksheets("Feuille1" ).Range("A:A"
ou :
sans Dim appExcel As Excel.Application
Dim Wb As Workbook
Dim Ws As Worksheet
Set Wb = Workbooks.Open("D:\Mes documents\user\Script SAP régulation\Tests\VENDREDI 13 AVRIL.xls" )
Set Ws = Wb.Worksheets(1)
For Each Cellule In Ws.Range...
A+
Marsh Posté le 20-04-2007 à 14:51:54
Et si tu tiens à l'ouvrir dans une autre instance...
Dim App As Excel.Application
Dim Wb As Workbook
Dim Ws As Worksheet
Set App = CreateObject("Excel.Application" )
Set Wb = App.Workbooks.Open("D:\Mes documents\user\Script SAP régulation\Tests\VENDREDI 13 AVRIL.xls" )
Set Ws = Wb.Worksheets(1)
For Each Cellule In Ws.Range...
A+
Marsh Posté le 20-04-2007 à 14:58:00
Euh...
Je peine un peu à comprendre cette structure :
Dim...
Dim...
Dim...
Sub...
End Sub
ça me parait (pour le moins) ...curieux !
A+
Marsh Posté le 20-04-2007 à 15:04:21
Merci beaucoup
ça marche à présent. j'ai d'autres problèmes mais je vais tenter de trouver seul
Marsh Posté le 20-04-2007 à 15:07:07
galopin01 a écrit : Euh... |
Ah ? eh bien je pensais déclarer les variables dans la déclartion, d'où les Dim
puis après les utiliser dans ma macro Sub ... End Sub
non ?
Marsh Posté le 20-04-2007 à 15:57:07
Ben, sauf utilisation très très particulière d'habitude c'est :
Sub...
Dim...
Dim...
Dim...
End Sub
Marsh Posté le 20-04-2007 à 16:15:45
Ah ok, mais j'utilise ces variables dans d'autres Sub aussi (j'ai essayé d'intégrer ça dans la première, ça ne marchait plus)
Marsh Posté le 20-04-2007 à 16:19:42
ca fait donc partie des utilisations particulière
regarde l'aide de vba avec le mot "public"
Marsh Posté le 20-04-2007 à 18:06:17
Ok. Mais j'avoue que je ne saisis pas bien l'intérêt de "s'embêter" à les déclarer Public alors qu'en les déclarant au début ça marche
C'est juste sémantiquement plus correct ? plus élégant ? ou il y a des raisons ?
J'ai un autre problème après : j'essaye de copier le contenu d'une cellule dans l'autre, j'ai donc fait
Code :
|
Mais celà ne marche pas : erreur d'exécution 1004 : erreur définie par l'application ou par l'objet.
J'avais aussi essayé de passer par une variable
Code :
|
Cela ne marche pas non plus, même en mettant IdEngin entre "" ...
Marsh Posté le 20-04-2007 à 18:17:13
Non, ce n'est pas sémantique, c'est conceptuel.
Sauf exceptions (assez exceptionnelles au niveau débutant) les Dim se placent au début de chaque Sub...
Il est difficile de corriger une macro avec des bribes de bouts de morceau de modules surtout si tu mets tes Dim en tête !
Celà dépend de l'ensemble de ton classeur, du (ou des) modules utilisés d'autant que tu fais des appels à d'autres procédures...
[Edit] Ce n'est pas un jugement péjoratif ! On est tous débutant en quelque chose...
Ta manière de voir les déclarations est peut-être vraie en C#, java ou Php, et tu es peut être un expert dans ces langages, je ne sais pas, mais en VBA tu fais surement fausse route.
A+
Marsh Posté le 20-04-2007 à 18:26:58
En fait, plus simplement, je n'arrive pas à écrire le contenu d'une cellule d'un classeur dans un autre classeur ... pourtant, ça doit pas être bien sorcier ... j'ai essayé par un copier coller, et par une méthode de Ws.Cells(1,1).value = Ws2.Cells(1,1).value mais ça ne marche pas ...
Marsh Posté le 20-04-2007 à 18:28:20
galopin01 a écrit : Non, ce n'est pas sémantique, c'est conceptuel. |
Ne t'inquiètes pas, je le prends bien d'autant plus que tu cherches à m'aider visiblement
Bon, je vais les réintégrer en public.
PS : je ne suis par un expert en programmation j'ai des notions on va dire, et j'essaye de m'accrocher ...
Marsh Posté le 20-04-2007 à 18:33:53
j'utilise souvent
cells(1,1).formular1c1
mais cells(1,1).value marche aussi
il y a surement une difference mais j'ai pas saisi laquelle essaye avec ca
ca peut peut etre marcher
si quelqu'un la connait je suis preneur
Marsh Posté le 20-04-2007 à 18:42:38
ingenieurcesi a écrit : j'utilise souvent |
le Ws.cells(1,1).value = Ws2.cells(1,1).value ne marche pas chez moi en tout cas
Marsh Posté le 20-04-2007 à 18:49:42
tu as essayer avec formular1c1 ?
ce qui est sur ( je viens de le tester ) Cells(1, 2).Value = Cells(1, 1).Value fonctionne tu es bien sur de tes ws et ws2 ?
essaye ce petit test
ws2.cells(1,2).value=ws2.cells(1,1).value
val=ws2.cells(1,1).value
msgbox val
ou
ws.cells(1,1)=ws2.cells(1,1)
Marsh Posté le 20-04-2007 à 18:56:15
bonsoir,
Non pas de Public des :
Sub...
Dim...
Dim...
End Sub
Bien sur dans un contexte de déclarations orthodoxes
ws.cells(1,2).value=ws2.cells(1,1).value est correct.
C'est tout le reste qu'il faut disséquer, variable après variable, dans tout le module.
A+
Marsh Posté le 20-04-2007 à 18:59:28
bon, je me mets tellement à douter là que je préfère mettre une caps pour que qqn d'autre voie si j'ai pas fait d'erreur à la c... genre une variable mal orthographiée (mai je pense pas parce que les caps se mettent toutes seules)
http://www.hebergement-images.com/ [...] 3_caps.jpg
Marsh Posté le 20-04-2007 à 19:00:21
FormulaR1C1 renvoie une value si la cellule contient une valeur, si elle contient une formule ça renvoie la formule en mode R1C1
Marsh Posté le 20-04-2007 à 19:07:53
Je ne comprends pas ... si je fais une structure comme ça :
Code :
|
ça devrait aller non ?
Marsh Posté le 20-04-2007 à 19:20:41
ReplyMarsh Posté le 20-04-2007 à 19:21:37
ouais je suis pas sur que dans ta derniere macro le "système" sache à quoi correpond feuillebasededonnees et feuilledefautpointagefinal
Marsh Posté le 20-04-2007 à 19:22:53
si les varariables sont pas publics, d'une macro à l'autre, elles ne seront pas reconnues. non?!!
Marsh Posté le 20-04-2007 à 19:23:19
jpcheck a écrit : quel est l'intéret de mettre public dans ta sub ? |
que la variable soit connue aussi dans les autres sub ?
Marsh Posté le 20-04-2007 à 19:24:24
vu que tes macros sont assez courtes pourquoi ne pas faire une seule macro.
ca devrait resoudre ton problème et tu n'as qu'à faire que 2 couper/coller au bon endroit
Marsh Posté le 20-04-2007 à 19:24:49
ingenieurcesi a écrit : ouais je suis pas sur que dans ta derniere macro le "système" sache à quoi correpond feuillebasededonnees et feuilledefautpointagefinal |
Ah ? Pourtant RechercheChef() passe sans problème (j'ai même testé avec des espions, il va bien chercher les bonnes valeurs)
Marsh Posté le 20-04-2007 à 19:26:29
ingenieurcesi a écrit : vu que tes macros sont assez courtes pourquoi ne pas faire une seule macro. |
euh oui, mais après je vais ajouter d'autres modules à ce programme
là c'est difficile parce que je début avec vba, mais après ça sera exactement le même style de manipulations à faire mais dans des ordres différents ... donc si j'arrive à m'en sortir là normalement c'est bon après
mais là j'ai peur que si je mette tout dans une macro, au final il faura que je fasse pareil et ça sera dur à suivre non ?
enfin, en même temps, si c'est la seule solution ...
Marsh Posté le 20-04-2007 à 20:37:33
Public ou pas c'est sans intéret, ce ne me semble pas le problème.
Si l'on utilise une notation conventionnelle avec des variables dans les procédures, celà oblige à passer des paramètres et/(ou) à utiliser des blocs With pour travailler sur des objets diférents.
Ce ne me semble pas beaucoup plus compliqué que les contorsions que tu essaies de faire...
Il me semble (mais je ne suis pas du tout sur de cette affirmation) que le fait de déclarer des objets Workbook et Worksheet en tête de module rallonge exagérément la durée d'exécution de la procédure. Il faudrait vérifier en mettant un timer mais bon...
Quoi qu'il en soit, bien que cette méthode ne m'inspire guère, malgré ma répugnance, je l'ai testé sur 2 classeurs bidons, je vous passe un tas de commentaire...
J'ai juste résumé scrupuleusement le code :
Code :
|
Et ça passe sans encombre ! Ce qui n'est en aucune façon un encouragement à coder de cette manière !
J'en déduit qu'il y a matière à examiner plus à fond l'ensemble du classeur de notre ami pour voir si dans les autres modules au hasard de ses déclarations globales, il n'y aurait pas des déclarations contradictoires.
Pour ma part dans le code en image je ne vois pas d'anomalie criante (sauf peut-être cellule qui est déclarée) mais pas instanciée et ensuite utilisée à la volée de manière... (à vérifier mais bon...)
Tant qu'à mettre une pièce jointe, tu aurais aussi vite fait de balancer tout ton classeur sur cjoint ( en virant les données inutiles dans les feuilles.
Bonsoir.
Marsh Posté le 20-04-2007 à 09:16:39
edit : cf Etat actuel
Bonjour,
j'ai un problème, je ne m'en sors pas en voulant virevolter sur 3 classeurs différents
je m'explique : j'ai un fichier d'utilisation de prévision d'utilisation du matériel (VENDREDI 13 AVRIL.xls) tapé par une autre personne donc un peu désordonné, et cette personne n'utilise pas les mêmes références que ce que l'on me demande (elle indique par exemple le num de la plaque et mon supérieur veut le num de réf interne du véhicule)
j'ai donc associé une base de donnée faisant correspondre les plaques et les réf internes
VENDREDI 13 AVRIL.xls : fichier de prévision d'utilisation du matériel
BaseDeDonnes.xls : base de données correspondances plaque/réf internes
DefautPointage.xls : là où je evux que ça soit transcrit
Mon problème est qu'à force d'ouvrir les classeurs excel et de les fermer, ça ne va pas ... il n'y a pas moyen de travailler temporairement dans un classeur pour qqs instructions, puis passer à l'autre, puis revenir à celui là etc ... sans devoir ouvrir et fermer à chaque fois ?
Message édité par Xocs le 25-10-2011 à 14:59:01