IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Utiliser un tableau declare dans une sous-procedure [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut Utiliser un tableau declare dans une sous-procedure
    Bonjour,

    J'ai besoin d'utiliser dans mon classeur principal (wb1), des donnees contenues dans un autre classeur (wb2). Pour cela, j'ai cree une sous procedure qui commence par ouvrir wb2, declare un tableau de taille variable, et enregistre les donnees qui m'interessent dans celui-ci.
    J'appelle la sous-procedure dans la procedure principale et jusqu'ici pas de probleme, mais quand je souhaite utiliser les donnees du tableau declarees dans la sous-procedure, excel me renvoit l'erreur "sub or function not defined".
    J'ai essaye de declarer le tableau "public" mais cela ne change rien.

    Voici le code de la sous procedure pour donner une idee plus precise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Private Sub gp3_extract()
     
    Dim ligne_insertion3 As Integer
    Dim taille_gp3 As Integer
    Dim lfdmax_gp3 As Integer
    Dim lisinmax_gp3 As Integer
    Dim fichier_gp3 As Workbook
    Set fichier_gp3 = Workbooks("\\kephren.sf.ca.lux\hldusers$\IR0\Desktop\GP3")
     
     
    fichier_gp3.Open
     
     
    lfdmax_gp3 = range("J65536").End(xlUp).Row
    lisinmax_gp3 = range("Q65536").End(xlUp).Row
     
     
    If lfdmax_gp3 > lisinmax_gp3 Then 'determiner valeur variable taille
        taille_gp3 = lfdmax_gp3
    ElseIf lfdmax < lisinmax_gp3 Then
        taille_gp3 = lisinmax_gp3
    ElseIf lfdmax_gp3 = lisinmax_gp3 Then
        taille_gp3 = lisinmax_gp3
    End If
     
     
    Public tab_gp3()
    ReDim tab_gp3(taille - 1, 1)
     
     
    ligne_insertion3 = 0
     
     
    For i = 1 To taille_gp3
        If range("J" & i) Like "###" Or range("J" & i) Like "#####" And range("Q" & i) Like "????????????" Then
            tab_gp3(ligne_insertion3, 0) = range("J" & i) & range("Q" & i) 'attribution valeurs "KEY" dans premiere colonne
            tab_gp3(ligne_insertion3, 1) = range("AV" & i) 'attribution valeurs "weight" dans seconde colonne
            ligne_insertion3 = ligne_insertion3 + 1
        End If
    Next
     
     
    End Sub

    Et voila comment j'appelle la sous-procedure et (essaye) de copier les donnes du tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    gp3_extract
     
    For v = 1 To taille_gp3
        Sheets("Sheet2").range("A" & v) = tab_gp3(v - 1, 0)
        Sheets("Sheet2").range("B" & v) = tab_gp3(v - 1, 1)
    Next
     
    fichier_gp3.Close

    Merci d'avance pour votre aide et bonne journee

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Si tu veux déclarer ton tableau en Public, il faut le déclarer en entête de module standard (pas de feuille ni de Userform) avant les procédures.
    Autrement, tu peux le passer en paramètre dans tes Sub ou Function

  3. #3
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Voici une autre manière de procéder en plus de celles de parmi (salutations).

    Si tu veux qu'une sous-procédure te renvoie une (des) valeur(s), utilises une fonction!

    En exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Private Function gp3_extract() As Variant()
    Dim ligne_insertion3 As Integer
    Dim taille_gp3 As Integer
    Dim lfdmax_gp3 As Integer
    Dim lisinmax_gp3 As Integer
    Dim fichier_gp3 As Workbook
     
      Set fichier_gp3 = Workbooks("\\kephren.sf.ca.lux\hldusers$\IR0\Desktop\GP3")
      fichier_gp3.Open
      lfdmax_gp3 = range("J65536").End(xlUp).Row
      lisinmax_gp3 = range("Q65536").End(xlUp).Row
      If lfdmax_gp3 > lisinmax_gp3 Then 'determiner valeur variable taille
        taille_gp3 = lfdmax_gp3
      ElseIf lfdmax < lisinmax_gp3 Then
        taille_gp3 = lisinmax_gp3
      ElseIf lfdmax_gp3 = lisinmax_gp3 Then
        taille_gp3 = lisinmax_gp3
      End If
     
    Dim tab_gp3()
      ReDim tab_gp3(taille - 1, 1)
      ligne_insertion3 = 0
      For i = 1 To taille_gp3
        If range("J" & i) Like "###" Or range("J" & i) Like "#####" And range("Q" & i) Like "????????????" Then
            tab_gp3(ligne_insertion3, 0) = range("J" & i) & range("Q" & i) 'attribution valeurs "KEY" dans premiere colonne
            tab_gp3(ligne_insertion3, 1) = range("AV" & i) 'attribution valeurs "weight" dans seconde colonne
            ligne_insertion3 = ligne_insertion3 + 1
        End If
      Next
      gp3_extract = tab_gp3
      Erase tab_gp3
    End Function
    Fonction que tu appelles, depuis ta procédure principale, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Main()
    Dim tb()
     
      tb = gp3_extract
    End Sub
    Mais, le plus simple, consiste (comme le dis justement parmi) à passer, ByRef, la variable tableau en paramètre de ta Sub.
    Ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Sub Main()
    Dim tb()
     
      gp3_extract tb
    End Sub
     
    Private Sub gp3_extract(ByRef tab_gp3())
     
    Dim ligne_insertion3 As Integer
    Dim taille_gp3 As Integer
    Dim lfdmax_gp3 As Integer
    Dim lisinmax_gp3 As Integer
    Dim fichier_gp3 As Workbook
    Set fichier_gp3 = Workbooks("\\kephren.sf.ca.lux\hldusers$\IR0\Desktop\GP3")
     
     
    fichier_gp3.Open
     
     
    lfdmax_gp3 = range("J65536").End(xlUp).Row
    lisinmax_gp3 = range("Q65536").End(xlUp).Row
     
     
    If lfdmax_gp3 > lisinmax_gp3 Then 'determiner valeur variable taille
        taille_gp3 = lfdmax_gp3
    ElseIf lfdmax < lisinmax_gp3 Then
        taille_gp3 = lisinmax_gp3
    ElseIf lfdmax_gp3 = lisinmax_gp3 Then
        taille_gp3 = lisinmax_gp3
    End If
     
    ReDim tab_gp3(taille - 1, 1)
     
     
    ligne_insertion3 = 0
     
     
    For i = 1 To taille_gp3
        If range("J" & i) Like "###" Or range("J" & i) Like "#####" And range("Q" & i) Like "????????????" Then
            tab_gp3(ligne_insertion3, 0) = range("J" & i) & range("Q" & i) 'attribution valeurs "KEY" dans premiere colonne
            tab_gp3(ligne_insertion3, 1) = range("AV" & i) 'attribution valeurs "weight" dans seconde colonne
            ligne_insertion3 = ligne_insertion3 + 1
        End If
    Next
     
     
    End Sub

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Yes ca fontionne ! Merci a tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Impossible d'utiliser un Order by dans une sous requête
    Par Optimus2016 dans le forum Langage SQL
    Réponses: 24
    Dernier message: 17/10/2016, 15h52
  2. utilisation d'un tableau 3D dans une jsp
    Par rudyhadoux2 dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 15/09/2009, 16h07
  3. References utilisées dans une sql procedure
    Par mimel dans le forum Développement
    Réponses: 9
    Dernier message: 25/03/2009, 13h49
  4. Réponses: 13
    Dernier message: 27/08/2007, 12h16
  5. Déclarer une sous-procédure
    Par omisster dans le forum Langage
    Réponses: 1
    Dernier message: 05/12/2006, 22h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo