Déclaration EXCEL9.OLB et compatibilité de version d'Excel

Résolu
xphilippe Messages postés 10 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 11 août 2004 - 11 août 2004 à 13:57
cs_marsoin Messages postés 6 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 24 juin 2005 - 24 juin 2005 à 17:09
bonjour à tous
- j'ai créé une DLL contenant une routine qui manipule le Workbook qu'on lui passe par référence (dans la DLL j'inclus la référence à EXCEL9.OLB ce qui me permet de manipuler les objets type Range, Workbook ..... )
- je l'ai installée avec regsvr32
- je l'ai Instancié depuis mon fichier Excel (dim oMyDLL as....)
- j'ai fait modifier mon fichier excel en lançant une macro qui
appelle la routine contenue dans la DLL

Mais il me reste le petit problème suivant:
- sur mon poste ça marche bien
- sur un autre poste ça marche pas.
Je pense que cela vient que EXCEL9.OLB n'est pas installé sur l'autre poste.

1) comment faire pour installer EXCEL9.OLB sur le poste client
2) est ce que si je fournis EXCEL9.OLB avec l'installation de la DLL cela marchera pour toutes les versions d'EXCEL 97-2000-2003 ...

merci de votre aide
:: Xavier ::

22 réponses

cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 août 2010 2
11 août 2004 à 15:39
Excel.olb, Excel9.olb, Excel10.olb et TOUTES les versions NE SONT PAS DISTRIBUABLES !!!

Donc :
1. Tu programmes avec Excel9.olb coché
2. Tu valides le fonctionnement de ton programme
3. Tu déclares toutes les constantes Excel que tu as utilisé dans ton programme VB de façon à les avoir dans les portées de tes procédures
4. Tu décoches Excel9.olb
5. Tu remplaces tous les objets Excel (de Excel.Application à Range) par des objets de type Object.6. La création de l'instance Application ne se fait plus de la façon suivante Set xlApp New Excel.Application mais de cette façon Set xlApp CreateObject("Excel.Application")
7. Pour reprendre ton exemple
Sub MaProcedure(xlsheet as Object)
xlsheet.Range("A1").Value = "Bonjour"
End Sub
3
cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
11 août 2004 à 14:40
Pour excel 97 c'est Excel8.olb....

Dans ton Projet tu as coché Projet...Références...Microsoft Excel 9.0 Object Library..

Vaudrait mieux le creer dynamiquement je pense :

Dim exlapp As Object
Set exlapp = CreateObject("excel.application")

It@li@
0
xphilippe Messages postés 10 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 11 août 2004
11 août 2004 à 14:56
merci pour ta célérité It@li@ :-)

mais ... (oui mais ...) ça va pas vraiment marcher.

En fait, j'ai un classeur avec une macro, (ex: écrire dans la cellule A1, mais en vérité c'est un peu plus complexe ... ), et je souhaite protéger la macro un peu plus qu'avec le simple mot de passe VBA.

Ainsi, dans le fichier Excel, je déclenche une macro qui appelle une procédure encapsulée dans un DLL.
depuis Excel:
référence à Projet1.dll
sub macroExcel
dim oDLL as Projet1.Class1
set oDLL = New Projet1.Class1
Call oDLL.MaProcedure(activeworksheet)

Dans la DLL
Référence à EXCEL9.OLB
sub MaProcedure(xlsheet as Excel.Worksheet)
xlsheet.range("A1").value = "Bonjour"
end sub


Voila voila
Donc si quelqu'un pourrait m'aider à contourner le problème ou bien trouver un moyen pour inclure EXCEL9.OLB dans la distribution de mon projet et faire en sorte que ça marche avec toutes les versions d'Excel.......

a toute
xavier
0
cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
11 août 2004 à 15:55
tient tient ca ressemble a ce que j'ai mis......

lol

It@li@
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xphilippe Messages postés 10 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 11 août 2004
11 août 2004 à 16:04
Merci, c'est exactement ce que je cherchais,
et je suis étonné que ce soit si simple.

Entre autre, j'avais déclaré dans sub MaProcedure un object Range
Dim rgCellule as Range

et bien maintenant que j'ai supprimé la référence à Excel, il faut que je fasse
Dim rgCellule as Object
et ensuite
xlSheet.rgCellule.offset(i,j).Value =  ....

Et finalement je pense que je n'aurai aucun problème avec les différentes version d'Excel.

Merci encore
0
xphilippe Messages postés 10 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 11 août 2004
11 août 2004 à 16:08
Merci Italia
mais tu vois, ce que tu décrivais c'est comment générer une nouvelle instance d'Excel.
Or je voulais juste pouvoir appeler une DLL depuis une instance d'Excel pour manipuler cette même instance ....
Bref en utilisant
 as Object 
directement dans le projet VB, ça marche et ça me permet de décocher la référence à Excel9.olb

sans rancune ;-)

xavier un peu long à la détente ....
0
cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
11 août 2004 à 16:19
Non pas de Rancune ....

It@li@
0
cs_damran Messages postés 2 Date d'inscription lundi 6 janvier 2003 Statut Membre Dernière intervention 14 décembre 2004
13 déc. 2004 à 20:02
Bonjour
Super intéréssant tout ca. :-)
Mais comment fait-on pour les variables du genre : xlAutomatic, xlEdgeTop ... ? On redéclare tout ?

--
Damran
0
cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
14 déc. 2004 à 08:26
Non pas la Peine de declarer ces variables
un peu comme quand tu utilises l'objet printer :

Ex : Printer.PrintQuality = vbPRPQHigh

tu ne declare en aucun cas vbPRPQHigh, le programme le comprend.

It@li@
0
cs_damran Messages postés 2 Date d'inscription lundi 6 janvier 2003 Statut Membre Dernière intervention 14 décembre 2004
14 déc. 2004 à 08:40
Bonjour
Pourtant, une fois que je décoche Excel9.olb, la compile ne passe plus au niveau des variables. "Variable indéfinis". Ce qui me semble logique puisqu'il y n'y a plus de réference.

Damran
0
cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 août 2010 2
14 déc. 2004 à 09:34
Je confirme l'obligation de redéclarer toutes les constantes quand la librairie Excel est décochée.
0
cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
14 déc. 2004 à 10:12
quand il tu decoches la Ref Excel oui...la c'est normal de les déclarer
excuse j'avais pas tous compris

It@li@
0
cs_marsoin Messages postés 6 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 24 juin 2005
22 juin 2005 à 17:30
salut, g suivi vos conseils, mais je n'arrive pas a utiliser la methode
"Selection.ClearContents" dans la dll visual basic. Cette fonction me permet de slectionner une plage.
Une autre question : comment declare ton le Application.ScreenUpdating comme objet ?
merci de me repondre au + vite ou je me tire une balle
0
cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 août 2010 2
23 juin 2005 à 09:37
Les éléments Selection ne sont pas correctement interprêté sous VB.
donc là où tu as des Range.Select suivi d'instructions Selection.xxx il te faut passer directement par des Range.xxx
0
cs_marsoin Messages postés 6 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 24 juin 2005
23 juin 2005 à 11:18
merci c bon mais :

est ce que c'est pareil pour Appliaction par ex :
Application.CutCopyMode = False ? deviens xlap.CutCopyMode=fasle ou
xlap represente l'application excel .
0
cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 août 2010 2
23 juin 2005 à 11:48
En effet, si tu as, par exemple, une ligne de code Application.Visible = False dans un module Excel, sous VB tu devras écrire xlAp.Visible = False dans VB (avec xlAp ton objet qui référence un Excel.Application)
0
cs_marsoin Messages postés 6 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 24 juin 2005
23 juin 2005 à 12:38
merci c sympa, juste une derniere pour la route :

code vba :

Range("B11:B16").Select

Selection.Copy

Range(Cells(11, 1 + icat2), Cells(16, 1 + icat2)).Select

Selection.PasteSpecial Paste:= xlFormats, Operation:=xlNone, SkipBlanks:= _

False, Transpose:=False



CODE visual basic de la dll :



ca.Sheets("4) résultats").range("B11:B16").Copy -> on copie


ca.Sheets("4) résultats").range(ca.Sheets("4) résultats").Cells(11, 1 +
icat2), ca.Sheets("4) résultats").Cells(16, 1 + icat2)).PasteSpecial
Paste: =xlFormats, Operation:=xlNone, SkipBlanks:=False,
Transpose:=False -> on colle le format




ou ca represente le classeur excel que je passe a la dll.



IL REFUSE LE COLLAGE SPECIAL !!! g tout essayé : ca.Sheets("4)
résultats").range("B11:B16").Paste mais on dirai qu'il n'accepte que de
copier. KKun sait comment faire ? Je veux conserver le format de
la cellule et le coller (sans les données ) dans la nouvelle colonne.



Bone prog
0
cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 août 2010 2
23 juin 2005 à 13:58
J'ai un trou de mémoire mais il me semble que les fonctions de Coller ne sont accessibles qu'au niveau Worksheet, une fois que la cellule est sélectionnée.

1. Tu sélectionnes ton Range d'arrivée (case supérieure gauche de la zone)
2. Tu appliques ton PasteSpecial sur ta Worksheet
0
cs_marsoin Messages postés 6 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 24 juin 2005
23 juin 2005 à 14:35
tu me di de selectionner la range d'arrivee mais plus haut tu di que le select ne fonctionne pas sur vb ?

comment faire ? voila le code d'origine :



icat2 = 0

For icat = 1 To 5

If cat(icat) <> "" And effectif(icat) > 0 Then

icat2 = icat2 + 1

Cells(11, 1 + icat2).Value = catb(icat)

Cells(12, 1 + icat2).Value = effectif(icat)

Cells(13, 1 + icat2).Value = agemoy(icat) / effectif(icat)

Cells(14, 1 + icat2).Value = ancmoy(icat) / effectif(icat)

Cells(15, 1 + icat2).Value = salmoy(icat)

Cells(16, 1 + icat2).Value = salmoy(icat) / effectif(icat)

Range("B11:B16").Select

Selection.Copy

Range(Cells(11, 1 + icat2), Cells(16, 1 + icat2)).Select

Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:= _

False, Transpose:=False

Application.CutCopyMode = False

End If

Next icat

Vois tu plus clair ?

Sais tu si le pastSpecial est géré par vb ?

Voila merci
0
cs_PhilippeE Messages postés 437 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 10 août 2010 2
23 juin 2005 à 14:44
Il me semble que ce n'est pas le xxx.Select qui ne fonctionne pas, mais le Selection.yyy
0
Rejoignez-nous