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 :

comment renvoyer plusieurs variables


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Points : 281
    Points
    281
    Par défaut comment renvoyer plusieurs variables
    bonjour,

    je ne sais pas si je suis dans la bonne rubrique mais tant pis!

    j'aimerais créé une fonction qui me renvois plusieurs variables.
    concretement je veux récuperer la valeur d'une cellule qui va contenir une chaine de caracteres.
    cette chaine j'aimerais la decouper un petit bout pour avoir plusieur chaine de caractere.

    example :
    chaine que je recupere :
    ABCKKI___05L__RECLTOP

    variables que j'aimerais retourner a la fin de ma fonction :
    var1="ABC"
    var2="KKI_"
    var3=__05L
    var4="__"
    var5="REC"
    var6="LTOP"

    et cette fonction, je l'appelerais dans d'autres fonctions qui seront elles appelées a partir d'une macro.

    help!

    si c'est pas clair : dites le moi

  2. #2
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Bonjour

    Regarde du cote Mid avec F1

    Elle devrait coller pour ce que tu souhaite faire

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Points : 281
    Points
    281
    Par défaut
    la fonction Mid decoupe bien ma chaine de caractere comme je veux.

    mais le probleme se situe finallement ailleur :

    cette chaine de depart je l'utilse dans un certain nombre de fonctions que j'ai créé moi meme. et dans chaque fonction je recommence le processus de decoupage de la chaine.

    ce que j'aimerais avoir c'est cree une fonction qui me permette de decouper ma chaine. appelons la Decoup_Chaine ().
    Les parametres que j'y rentrerais serait juste la chaine de caractere initiale : Decoup_Chaine(Ma_Chaine as string)
    mais il faudrait que je renvois plusieurs variables pour avoir toutes mes petites chaines decoupés.

    passer par une fonction indepandante me permet uniquement de ne pas avoir a modifier 36 000 fonctions quand le format de la chaine de départ est modifié (j'essai de faire un outil générique utilisable pour plusieurs projets differents qui n'aura jamais le meme format au niveau de cette chaine de caracteres)

    j'avais essayé de renvoyer un tableau de string : il se remplissait correctement mais qd j'appelais la fonction Decoup_Chaine, je n'avais rien dans le tableau...

    bref.. je sais plus quoi inventer...

  4. #4
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Salut,

    j'ignore si tu peux définir un nombre maximum de parametre de retour pour ta fonction. Si c'est plus ou moins le cas, j'essaierais ceci à ta place (mais je n'ai jamais testé).

    1) Définis un tableau en PUBLIC (global) pour retourner tes parametres avec un nom assurement unique !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PUBLIC Splitted_string(20) as string
    2) tu appelles ta procédure comme avant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Decoup_Chaine(Ma_Chaine as string)
    3)Dans Decoup_Chaine tu effectues un REDIM de Splitted_String en fonction de tes besoins, ou tu mets un falg après le dernier élément significatif, du genre NULL.

    Tu alimentes Splitted_String(n) du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Splitted_String(0)="ABC"
    ...
    4) De retour dans ta procédure d'appel tu genre Splitted_String dans une boucle For limited par Ubound(Splitted_String ) ou dans une boucle while avec teste sur l'élément de Flag (NULL).

    Je pense que cela devrait le faire.

    Avantage : pas besoinde changer les parametres d'appel

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Points : 281
    Points
    281
    Par défaut
    bon : je suis pas douée au point de comprendre tous ce que tu as mis

    1) je pense que je l'ai fait
    2) je pense que c'est bon aussi
    3)je pense que je n'ai pas besoin de redimmensionner
    4)là je bloque.. si je comprend bien tu me propose de faire une boucle (for ou while) pour verifier que les elements de mon tableau ne sont pas nul. je vois pas trop comment sur le coup!

    voila ce que j'ai fait:
    fonction que j'appelle dans excel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Function ComputeLoss(sName As String, sSSI As String, sTemp As String, sPerfo As String) As Double
     
    Dim LNA As String, DOCON As String, CHAN As String
    Dim RXCOV As String, UPCON As String, Freq As String
    Dim Imux_FA As String, i As Integer, DC_OK As String, UC_OK As String
    Public SSI_tab(1 To 9) As String
     
    Decoup_SSI (sSSI)
    For i = 1 To 9
        SSI_tab(i) = SSI_def(i)
    Next i
    il me manque la partie ou je dis que le premier element du tableau correspond a telle variable, le deuxieme a telle autre et ainsi de suite.
    puis j'utilise les variables.

    fonction Decoup_SSI:
    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
     
    Public Function Decoup_SSI(sSSI As String) As String()
        Dim COVin As String, RX_LNA As String, DOCON As String
        Dim UPCON As String, MUX As String, SELECTIV As String
        Dim CHAN As String, TWT As String, COVout As String
        Public SSI_def(1 To 9) As String
        COVin = Left(sSSI, 4) 'couverture + polarite in
        RX_LNA = Right(Left(sSSI, 7), 3) 'RX_LNA
        DOCON = Right(Left(sSSI, 10), 3) 'Docon
        UPCON = Right(Left(sSSI, 13), 3) 'Upcon
        MUX = Right(Left(sSSI, 16), 3) 'Multiplexage
        CHAN = Right(Left(sSSI, 21), 4) 'Channel
        SELECTIV = Right(Left(sSSI, 17), 1) 'Selectivite
        TWT = Right(Left(sSSI, 25), 4) 'TWT
        COVout = Right(Left(sSSI, 29), 4) 'couverture + polarite out
        SSI_def(1) = COVin
        SSI_def(2) = RX_LNA
        SSI_def(3) = DOCON
        SSI_def(4) = UPCON
        SSI_def(5) = MUX
        SSI_def(6) = CHAN
        SSI_def(7) = SELECTIV
        SSI_def(8) = TWT
        SSI_def(9) = COVout
        Decoup_SSI = SSI_def
    End Function
    j'ai evidemment mis un option base 1 (sinon mon tableau commencerait a 0)
    et evidemment: ça ne fonctionne pas

    lors de la compilation ca plante au niveau de la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public SSI_tab(1 To 9) As String
    j'ai pas du l'ecrire correctement en remplacant le public par un simple dim ca passe a la ligne suivante
    mais ca plante juste apres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To 9
        SSI_tab(i) = SSI_def(i)
    Next i
    donc voila!
    je ne sais plus quoi faire...
    plus d'idee..
    en panne..

  6. #6
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public SSI_tab(1 To 9) As String
    devrait se situer en haut de ton module et non pas dans ta procédure, si je ne m'abuse

    et je croix que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public SSI_tab( 9) As String
    Serait mieux

  7. #7
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut


    C'est exactement comme Jean-Pierre49 a dit :

    Tout début du premier module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public SSI_tab(1 To 9) As String
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function ComputeLoss(sName As String, sSSI As String, sTemp As String, sPerfo As String) As Double
     
    Dim LNA As String, DOCON As String, CHAN As String
    Dim RXCOV As String, UPCON As String, Freq As String
    Dim Imux_FA As String, i As Integer, DC_OK As String, UC_OK As String
    Public SSI_tab(9) As String
     
    Decoup_SSI (sSSI)
    For i = 1 To 9
        SSI_tab(i) = SSI_def(i)   :bug: ' Tu fais quoi ici ?
    Next i

    Ensuite DEcoup_SSI est une procédure(SUB) et pas une fonction car elle ne ramène pas de résultat.

    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
    Public Sub Decoup_SSI(sSSI As String) 
        Dim COVin As String, RX_LNA As String, DOCON As String
        Dim UPCON As String, MUX As String, SELECTIV As String
        Dim CHAN As String, TWT As String, COVout As String
        Public SSI_def(1 To 9) As String
        COVin = Left(sSSI, 4) 'couverture + polarite in
        RX_LNA = Right(Left(sSSI, 7), 3) 'RX_LNA
        DOCON = Right(Left(sSSI, 10), 3) 'Docon
        UPCON = Right(Left(sSSI, 13), 3) 'Upcon
        MUX = Right(Left(sSSI, 16), 3) 'Multiplexage
        CHAN = Right(Left(sSSI, 21), 4) 'Channel
        SELECTIV = Right(Left(sSSI, 17), 1) 'Selectivite
        TWT = Right(Left(sSSI, 25), 4) 'TWT
        COVout = Right(Left(sSSI, 29), 4) 'couverture + polarite out
        SSI_def(1) = COVin
        SSI_def(2) = RX_LNA
        SSI_def(3) = DOCON
        SSI_def(4) = UPCON
        SSI_def(5) = MUX
        SSI_def(6) = CHAN
        SSI_def(7) = SELECTIV
        SSI_def(8) = TWT
        SSI_def(9) = COVout
        Decoup_SSI = SSI_def 'Inutile ar SSI_DEF est global et partagé.
    End Function
    Tu comprends mieux là. ?

    SSI_DEF(9) est défini 1 seule fois et accessible partout. Pas besoin de le passer en parametre. Mais si tu veux vraiment, on peux le faire, mais alors on le le défini plus en global.

  8. #8
    Membre habitué
    Homme Profil pro
    R&D laboratoire
    Inscrit en
    Janvier 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D laboratoire
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2008
    Messages : 83
    Points : 157
    Points
    157
    Par défaut
    Si ta chaîne comporte des séparateurs, tu peux jouer avec les fonctions Instr, mid, Len pour faire une boucle et décortiquer ta chaîne. Ici un exemple dans lequel il y a deux données jointes dans un tableau à 1 dimension, la partie droite va dans une colonne, la partie gauche va dans une autre colonne. Les trim permettent d'évacuer les espaces de bouts de chaînes, ou alors on l'applique préalablement pour éviter d'alourdir ce type de formule suffisamment fatigante pour les meninges

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For k = 3 To (UBound(tblMarkersSetTotal, 1) + 3)
    ActiveSheet.Cells(k, 1) = Left(tblMarkersSetTotal(k - 3), InStr(1, tblMarkersSetTotal(k - 3), "-") - 1)
    Next k
     
    For k = 3 To (UBound(tblMarkersSetTotal, 1) + 3)
    ActiveSheet.Cells(k, 3) = Right(tblMarkersSetTotal(k - 3), Len(tblMarkersSetTotal(k - 3)) - InStr(1, tblMarkersSetTotal(k - 3), "-"))
    Next k

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Points : 281
    Points
    281
    Par défaut
    Decoup_SSI (sSSI)
    For i = 1 To 9
    SSI_tab(i) = SSI_def(i) ' Tu fais quoi ici ?
    Next i
    héhéhé.... je sais pas trop en fait
    j'ai tenté de mettre les valeurs de SSI_def (que j'ai créé juste avant) dans le tableau SSI_tab... mais maintenant je crois que c'est inutile.

    j'essais ce que vous m'avez dit!

  10. #10
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Pour aller droit au but...

    Pour qu'une fonction retourne plusieurs variables, tu peux passer par des paramètres par adresse (ByRef). Ceci te permet de mettre dans les arguments d'une procédure ou d'une fonction une variable qui sera modifiée par la procédure appelée.

    Les Objets passés en paramètres sont, je crois, par défaut passés en paramètre par adresse (paramètre = argument, sont synonyme. Mais je crois que y'a qu'en VB - et en basic généralement - qu'on dit argument...), les tableaux aussi puisqu'il sont eux aussi plus ou moins des objets... corrigez moi si je me trompe sur ces derniers détails.

    Petit exemple pour illustrer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Somme(ByVal Operandes() As Double, ByRef Resultat As Double)
        Dim i As Integer, temp As Double
        temp = 0#
        For i = 0 to UBound(Operandes)
            temp = temp + Operandes(i)
        Next i
        Somme = temp
    End Sub
    Cette procédure reçoit une copie du tableau d'opérandes, via un paramètre par valeur (ByVal) et retourne via le paramètre résultat, qui est par adresse (ByRef), la somme calculée.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Points : 281
    Points
    281
    Par défaut
    bon. je pense que j'ai mieu compris l'impact de la variable publique...
    j'ai changé quelques trucs (je ne sais pas si c'est en mieu ou en pire...)

    il y a un mieu : excel ne plante plus méchamment.
    mais : je n'ai toujours rien...

    j'ai donc definie mon tableau publique en dehors de toutes fonctions (ou sub) :

    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
     
    Option Explicit
    Option Base 1
    Public SSI_def(1 To 9) As String
     
    Public Sub Decoup_SSI(sSSI As String)
     
        Dim COVin As String, RX_LNA As String, DOCON As String
        Dim UPCON As String, MUX As String, SELECTIV As String
        Dim CHAN As String, TWT As String, COVout As String
     
        COVin = Left(sSSI, 4) 'couverture + polarite in
        RX_LNA = Right(Left(sSSI, 7), 3) 'RX_LNA
        DOCON = Right(Left(sSSI, 10), 3) 'Docon
        UPCON = Right(Left(sSSI, 13), 3) 'Upcon
        MUX = Right(Left(sSSI, 16), 3) 'Multiplexage
        CHAN = Right(Left(sSSI, 21), 4) 'Channel
        SELECTIV = Right(Left(sSSI, 17), 1) 'Selectivite
        TWT = Right(Left(sSSI, 25), 4) 'TWT
        COVout = Right(Left(sSSI, 29), 4) 'couverture + polarite out
     
        SSI_def(1) = COVin
        SSI_def(2) = RX_LNA
        SSI_def(3) = DOCON
        SSI_def(4) = UPCON
        SSI_def(5) = MUX
        SSI_def(6) = CHAN
        SSI_def(7) = SELECTIV
        SSI_def(8) = TWT
        SSI_def(9) = COVout
     
    End Sub
    puis pour l'autre fonction :
    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
     
    Option Explicit
    Option Base 1
     
    Function ComputeLoss(sName As String, sSSI As String, sTemp As String, sPerfo As String) As Double
    'debugué le 10/12/07
    'fonction qui permet de trouver la valeur de perte pour plusieurs équipements.
     
    Dim LNA As String, DOCON As String, CHAN As String
    Dim RXCOV As String, UPCON As String, Freq As String
    Dim Imux_FA As String, i As Integer, DC_OK As String, UC_OK As String
    Dim SSI_def(9) As String
     
    Decoup_SSI (sSSI)
     
    RXCOV = SSI_def(1)
    LNA = SSI_def(2) 'les variables RXCOV et LNA je les utilise apres dans la meme fonction
    voila. je n'ai rien dans le tableau SSI_def

    rmq : la chaine de caracteres c'est des lettres et des chiffres et quelques _ mais rien ne peut servir de séparateurs! je sais que RXCOV sera de tel caractere a tel caracter c'est tout! et c'est ca qui change avec les projets!

  12. #12
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Salut Zazaraignée,

    je n'avais pas proposé cette solution (qui est la meilleure pour moi) car d'après la définition du post au début, le nombre de string a retourner est variable et inéterminé.

    c'est pour cela que j'ai proposé une table Globale avec éventuellement REDIM si nécessaire.

    Mais vu l'évolution du problème et l'usiage d'une table de 9 éléments, je te suis a fond dans l'idée d'une procédure à 2 parametres : 1 String de départ et une table de 9 string en retour.

    Bonjour au Québec.

    Le tableau est mal défini, j'ai oublié de le dire.

    il faudrait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public SSI_tab(9) As String
    et en plus tu le défini 2 fois, donc ta vraiable local ne met jamais a jour la variable globale. (si tu me suis).

    De plus; c'est zazaraignée qui a raison sur la manière, vuq ue tu a toujours un tableau de 9 éléments en retour

    Oublie le tableau global et fait plutot :
    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
    Option Explicit
    Option Base 1
     
    Function ComputeLoss(sName As String, sSSI As String, sTemp As String, sPerfo As String) As Double
    'debugué le 10/12/07
    'fonction qui permet de trouver la valeur de perte pour plusieurs équipements.
     
    Dim LNA As String, DOCON As String, CHAN As String
    Dim RXCOV As String, UPCON As String, Freq As String
    Dim Imux_FA As String, i As Integer, DC_OK As String, UC_OK As String
    Dim SSI_def(9) As String
     
    Decoup_SSI (sSSI, SSI_Def())
     
    RXCOV = SSI_def(1)
    LNA = SSI_def(2) 'les variables RXCOV et LNA je les utilise apres dans la meme fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub Decoup_SSI(sSSI As String, SSI_def() as variant)
     
        SSI_def(1) = Left(sSSI, 4) 'couverture + polarite in
        SSI_def(2) = Right(Left(sSSI, 7), 3) 'RX_LNA
        SSI_def(3) = Right(Left(sSSI, 10), 3) 'Docon
        SSI_def(4) = Right(Left(sSSI, 13), 3) 'Upcon
        SSI_def(5) = Right(Left(sSSI, 16), 3) 'Multiplexage
        SSI_def(6) = Right(Left(sSSI, 21), 4) 'Channel
        SSI_def(7) = Right(Left(sSSI, 17), 1) 'Selectivite
        SSI_def(8) = Right(Left(sSSI, 25), 4) 'TWT
        SSI_def(9) = Right(Left(sSSI, 29), 4) 'couverture + polarite out
    
    End Sub
    La ca devrait marcher.

  13. #13
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Je ne suis jamais certaine que l'utilisation d'une variable globale publique soit très sécuritaire... Celle ci peut à tout moment et accidentellement modifiée par une autre procédure qui aurait malencontreusement une variable du même nom. La mémoire étant une faculté qui oublie... C'est pourquoi je proposais de passer par un (ou des) paramètre(s) par adresse.

    Je sais que mon exemple (plus haut) est plutôt simpliste et que le tableau passé en paramètre l'est par valeur... donc pas représentatif pour le cas qui nous occupe. Je cherchait seulement à illustrer le ByVal et le ByRef.

    Ceci dit, pour les tableaux, quand on ne sait pas d'avance quelle sera le nombre d'éléments qu'il contiendra à la fin, on le déclare une première fois sans dimension prédéfinie. C'est donc un tableau dynamique qu'on peut redéfinir à tout moment.

    Lorsqu'on jongle avec les tableaux dynamiques, et vous le savez peut-être déjà, il faut être très attentif losrqu'on le ReDim... avec ou sans Preserve.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve monTableau(n)
    Redimentionne monTableau à n éléments en conservant les valeurs qui y sont déjà. Si n est plus petit que l'ancienne dimension, les éléments aux indices plus grand que n sont détruits.

    Efface le contenu de monTableau et le redimentionne à n éléments.

    Fin du mini cours Tableaux Dynamiques 101.

    Retour sur les variables globales...

    Une variable peut être passée successivement d'une procédure à l'autre ByRef, de façon à la modifier d'un traitement à l'autre sans jamais utiliser de variable globale nulle part. Mais encore là aussi, il faut faire attention à ce qu'on fait.

    Pour retourner un tableau de valeurs quand on ne sait pas d'avance combien de valeurs seront retournées :

    Je fais quelques tests et je reviens car je ne sais même plus si je suis encore connectée... Ça fait un bout que je réfléchis et que je tape... Avant d'écrire encore tout un roman...

  14. #14
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Pour retourner un tableau de valeurs quand on ne sait pas d'avance combien de valeurs seront retournées :

    Je fais quelques tests et je reviens car je ne sais même plus si je suis encore connectée... Ça fait un bout que je réfléchis et que je tape... Avant d'écrire encore tout un roman...
    J'ai pensé à ParmArray Tableau() mais il me semble que c'est concu pour un appel avec un nombre variable, pas pour une retour avec un nombre différent.

    Je doute que le compilateur apprécie.

    (D'où mon idée d'un tableau défini en Global. je sais , dangereux , mais si défini de manière univoque (du genre "This_Application_Ce_Tableau", cela marche plutot bien).

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Points : 281
    Points
    281
    Par défaut
    bon ca m'a l'air interressant toutes ces idées!
    je n'ai plus le temps de les essayer ce soir.
    trop de boulot m'est tombé dessus!
    donc je verrais tout ca demain!
    j'espere que ca va marcher!

  16. #16
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Ben voilà! Le fichier joint contient des données de départ (un peu n'importe quoi en fait), des macros et un userform...

    Bonne lecture !

    L'utilitaire de compression/décompression de fichier WinRar est gratuit...

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    J'avoue que je n'ai pas tout lu car y'a des trucs qui mon paru très compliqués pour mes faibles compétences... J'ia donc cherché ce que je ferais
    Je pense que tu connais la longueur des mots que tu cherches, sans quoi, ce n'est même pas la peine de poursuivre.
    Je suis donc parti de cette hypothèse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub appel()
    Dim Chaine As String, tablo As Variant, temp as variant
        Chaine = "ABCKKI___05L__RECLTOP"
        tablo = "3,4,5,2,3,4"
        Temp = DecoupeMoiÇa(Chaine, tablo)
        Result = Split(Temp, "|")
        For i = 1 To UBound(Result)
            MsgBox Result(i)
        Next
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function DecoupeMoiÇa(Chaine As String, tablo As Variant) as variant
    Dim tableau As Variant, No As Byte
        tableau = Split(tablo, ",")
        No = 1
        For i = 0 To UBound(tableau)
            DecoupeMoiÇa = DecoupeMoiÇa & "|" & Mid(Chaine, No, Val(tableau(i)))
            No = No + Val(tableau(i))
        Next
    End Function
    J'aimerais tout de même savoir si j'ai bien compris la question
    Merci
    Bonne soirée

  18. #18
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut beau gosse... (c'est mieux que 'Salut pépère!') t'as pas tout lu ? deviendrais-tu paresseux ?

    Je viens de mettre à jour mon fichier. Je crois que c'est plus orthodoxe sans le type de données personnalisé. Orthodoxe dans le genre selon les normes habituelles...

    Ça devrait donc vous intéresser. Et je n'ai pas de variables globales publiques... Comme promis, quoi!

  19. #19
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut Oops Zazaraignée : Ton fichier excel plante brutalement


    Zazaraignée:

    J'ai voulu regarder ton exemple attaché et il plante dès l'ouverture.

    merci de regarde les print-screen attachés.


    ouskel'n'or

    Ton code est super. je pense que tu as parfaitement compris le problème.

    Bonne journée à tous.

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 288
    Points : 281
    Points
    281
    Par défaut
    bon!
    ca va pas!
    non seulement je ne comprend rien à ce que vous ecrivez (j'ai jamais dis que j'etaits super pro en vb...)
    mais en plus, je ne comprend plus rien a ce que j'ecris moi! (alors là.. c'est le debut de la fin!)

    zazareignée: ton fichier fonctionne tres bien... seulement je ne comprend pas tout et je n'arrive pas bien a voir ce qui m'est utile... (ca aide pas je sais)

    je n'ai pas besoin de donner une plage de cellule ou il y a les chaines a decouper (en fait dans ma fonction pricipale il y a deja la chaine en argument donc il n'y en a qu'une seule)
    je n'ai pas besoin d'afficher sur excell les petits bouts de chaines (puisque je les utilise direct dans la fonction principale)

    donc il doit rester ce code qui je pense doit m'interresser:
    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
     
        Dim Source As Range, Destination As Range
        Dim tblChainesCoupees() As Variant  ' tableau de tableaux...
        Dim i As Integer, j As Integer, cs As Range
        Dim message As String, titre As String
    dialogue:
        frmDecoupage.Show
        If frmDecoupage.Reponse = Decouper Then
            Set Source = frmDecoupage.Source
            Set Destination = frmDecoupage.Destination
            If (Destination.Cells.Count > 1) And _
                    (Destination.Cells.Count < Source.Cells.Count) Then
                MsgBox "La destination ne contient trop de cellules." & vbCrLf & vbCrLf & _
                       "Ne sélectionnez que la première cellule " & vbCrLf & _
                       "d'une plage suffisemment grande pour contenir le résultat."
                GoTo dialogue   ' retour à l'affichage du userform
              Else
                i = 0
                For Each cs In Source
                    ReDim Preserve tblChainesCoupees(i)
                    Dim temp(0 To 8) As String
                    DecoupSSI cs.Value, temp
                    tblChainesCoupees(i) = temp
                    i = i + 1
                Next
                AfficherResultat tblChainesCoupees, Destination
            End If
    je pense que la partie "dialogue" est inutile (c'est bien la fenetre de la boite de dialogue?)
    voila...
    je bloque beaucoup en fait...

    peux tu me donner quelques explications ou commentaires sur ton code ? (je comprendrais peut etre un peu mieu)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/04/2015, 13h56
  2. comment ajouter plusieurs variables dans un TextBox en VBA ?
    Par Kalem dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 14/05/2012, 16h47
  3. Comment gérer plusieurs variables ?
    Par Casio dans le forum Langage
    Réponses: 1
    Dernier message: 24/04/2011, 20h37
  4. Réponses: 3
    Dernier message: 18/08/2006, 12h05
  5. Réponses: 5
    Dernier message: 20/09/2005, 22h48

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