[VBA] Portée des variables

Résolu
modjibe Messages postés 45 Statut Membre -  
 Utilisateur anonyme -
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
Configuration: Windows XP
Internet Explorer 7.0

10 réponses

  1. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    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
    1. modjibe Messages postés 45 Statut Membre 3
       
      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
  2. Utilisateur anonyme
     
    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
    1. modjibe Messages postés 45 Statut Membre 3
       
      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
  3. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    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
  4. modjibe Messages postés 45 Statut Membre 3
     
    Ca m'étonne qu'il n'y ait pas une méthode plus simple mais je vais essayer !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    c'est peut être moi qui suis tordu aussi ;-)

    0
  7. choubaka Messages postés 5535 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    ça c'est déjà moins tordu :-DDDD

    honte à moi ..
    0
  8. Utilisateur anonyme
     
    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
  9. modjibe Messages postés 45 Statut Membre 3
     
    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
  10. Utilisateur anonyme
     
    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
  11. Utilisateur anonyme
     
    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