[VBA] Portée des variables

Résolu/Fermé
modjibe Messages postés 45 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 25 avril 2008 - 24 juil. 2007 à 12:22
 Utilisateur anonyme - 25 juil. 2007 à 15:21
Bonjour,

Lorsque je déclare une variable en public je voudrais que la valeur que j'affecte soit connue également par tous les modules.

Ex :

Dans le module MyDocument, dans (Général) je déclare :

Public appExcel As Object

Puis dans le code associé à un bouton de commande :

Set appExcel = CreateObject("Excel.Application")

Je n'arrive pas à utiliser cette objet dans des fontions déclarées dans (Général). Ca m'ennuie, je ne peux pas faire de fonctions ! Et mon code commence à être sale.

En fait je voudrais faire cette fonction :


Public Sub cc(cellule as String, Signet as String)
Set cellExcel = wsExcel.Range(cellule & s)
Bookmarks(signet).Range.Select
cellExcel.Select
Selection.Font.Name = "Arial"
Selection.Font.Bold = False
Selection.Font.Italic = True
Selection.Font.Size = 10
Selection.Font.Color = vbBlue
Selection.Copy
appExcel.ActiveSheet.Paste
EndSub


seulement cellExcel, s, etc. sont affecté ailleurs et déclarés publics.

J'espère avoir été clair...

jb

10 réponses

choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
24 juil. 2007 à 12:28
salut

et avec la fonction "Call" et des fonctions publiques de type "Get" te renvoyant ce que tu dois utiliser ???

ça donnerait un truc du genre : "Call MyDocument.getSomething()"
1
modjibe Messages postés 45 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 25 avril 2008 3
24 juil. 2007 à 12:41
Et bien je saisis pas vraiment ce que tu me dis ! La fonction Call je l'utilise pour appeler une procédure Sub c'est tout...
0
Utilisateur anonyme
24 juil. 2007 à 17:02
Bonjour,

l'instruction [ Set appExcel = CreateObject("Excel.Application") ] crée
un pointeur sur l'objet [ appExcel <> Nothing ] mais toujours = ""

L'entrée du programme doit passer par une routine d'initialisation dans laquel vous
effectuer les affectations par défaut ! Celles-ci seront alors visible pour tous le code subséquent

Public appExcel As Variant
Sub Main()

    Initialisation
    ...

End Sub
1
modjibe Messages postés 45 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 25 avril 2008 3
25 juil. 2007 à 09:42
La solution de Lupin marche très bien ! Merci Lupin ! Mon programme est un peu plus joli et clair pour celui qui le reprendra ;-)
0
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
24 juil. 2007 à 12:58
et bien tu peux essayer de créer une fonction de type sub qui te renvoye en parmaètre le module ou l'objet (en référence ...) sur lequel tu peux travailler...

c'est de l'orienté objet déguisé ;-)

0
modjibe Messages postés 45 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 25 avril 2008 3
24 juil. 2007 à 13:07
Ca m'étonne qu'il n'y ait pas une méthode plus simple mais je vais essayer !
0

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

Posez votre question
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
24 juil. 2007 à 13:23
c'est peut être moi qui suis tordu aussi ;-)

0
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
24 juil. 2007 à 17:13
ça c'est déjà moins tordu :-DDDD

honte à moi ..
0
Utilisateur anonyme
24 juil. 2007 à 19:00
re :

peut-être mais je puis te dire en connaissance de cause que le type effectué par l'instruction
Set est très difficile à capter puisque contextuel. Ne vous sentez point diminuer sir choubaka,
votre diligence est déjà rayonnant de soleil :-)

autre point, il y a une énorme différence sur l'instruction Set par le typage de la variable

Dim MaVar As Variant
Set MaVar = CreateObject("Excel.Application")

Dim Autre As PowerPoint.Application
Set Autre = CreateObject("Excel.Application")

avec ces deux variables vous atteindrez l'e classeur excel mais certaines instructions vont
fonctionner et pas d'autres. Lorsque le type est Variant, il devient un objet de scripting
(pas la même librairie, une librairie plus modeste) avec des propriétés et méthodes plus
restreinte.

Cordialement

Lupin
0
modjibe Messages postés 45 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 25 avril 2008 3
25 juil. 2007 à 09:20
J'essaie ça et je vous tiens au courant, mais ça a l'air pas mal ;)
Mais le type Variant il est conseillé ?

Et entrée du programme ça veut dire à l'ouverture de fichier ? de chaque fonction ?
0
Utilisateur anonyme
25 juil. 2007 à 15:08
re :

en fait, si je ne m'abuse, vous piloter excel à partir de Word.

Donc l'objet [ Excel.Application ] n'est pas référencé par défaut sous Word.

Lorsque vous déclaré une variable de type objet : Public appExcel As Object

Word connait déjà beaucoup d'objet mais pas celui que vous lui présenté :

Set appExcel = CreateObject("Excel.Application")

Il sera peut-être capable de faire un bout de chemin mais tôt ou tard, une instruction va déconner.

si vous typé la variable par :

Dim appExcel As Excel.Application

vous devrez charger la références sous VBE de Word [ Microsoft Excel xx.x Objects Library ].
Ce qui rend votre application moins transportable sur d'autres postes, mais avec beaucoup
plus d'aisance pour manoeuvrer l'objet.

Si vous typé le variable en type Variant, vous entrez dans la gamme des objets de "scripting", en référence consulter Visual Basic Scripting Host. Par défaut en VBS toutes les variables ne sont
pas typé puisque native en Variant

[ Dim appExcel ] = [ Dim appExcel As Variant ].

Le VBS s'écrit dans le bloc note, vous trouverez en exemple ici-même dans ce forum que j'ai codé en recherchant le mot clé : [ ARBORESCENCE_Sous_EXCEL ]. Je pilote Excel depuis le bloc-note!

Donc ainsi déclaré, l'aisance de manoeuvre est moins présence mais le code est transposable
d'un poste à l'autre sans manipulation.

Je souligne aussi toutefois, qu'il est possible par VBA de vérifier la présence de la référence,
de la charger si celle-ci est manquante. J'ai fait le même type de manoeuvre pour mon classeur [ VizioXLA que j'ai publié sur excel-download. Il faut un peut de recherche mais ça se construit.

Il y a aussi une autre tournure de déclaration dont je suis moins familier :

Dim appExcel As New Excel.Application

Je n'en ai jamais eu spécifiquement besoin et je ne pourrais vraiment définir la nuance
je cède la main ici :-) et bien entendu pour ce que j'en ai dit, je n'ai utiliser que des mots ...

Cordialement

Lupin



Lupin
0
Utilisateur anonyme
25 juil. 2007 à 15:21
re :

et pour l'entrée du programme, sous word c'est la routine :

dans le Module [ ThisDocument ]
Private Sub Document_New()
End Sub

Private Sub Document_Open()
End Sub

sous Excel, dans le module [ ThisWorkbook ]
Private Sub Workbook_Open()
End Sub

et ainsi de suite pour chaque joliciel de la suite office, quoique access est particulier.

en entrée de programme veut dire qu'avant d'utiliser tes objets, la première routine
quelquel soit qui doit toucher l'objet devra au préalable appeller l'initialisation.

et si tu gére des évènements je suggère un simple [ Flag ] (Drapeau) que tu installe
en début de chaque function/routine.
Public Drapeau As Boolean
Sub Exemple ()
    If Not( Drapeau ) Then
        Drapeau = Initialise
    End If
    ...
End Sub
Function Initialise () As Boolean
    Initialise = True
    Set appExcel ...
    Set cellExcel 
    ...
End Function


Cordialement

Lupin
0