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 :

[VBA Excel] Noms de variable dynamiques


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Par défaut [VBA Excel] Noms de variable dynamiques
    Bonjour à tous.

    Je travaille actuellement sur un système de formattage d'une feuille Excel en une autre plus exploitable.

    La feuille d'origine représente en fait une succession d'écritures comptables et je dois en regrouper certaines.

    Je bloque donc sur un moyen de sommer les montants de certaines ecritures et enregistrer ces sommes dans des variables spécifiques au numéro de compte (par exemple une variable au nom "cpt421110" donc "cpt"&<numéro de compte>).
    Néanmoins, dans un soucis de généricité, je pars du principe que je ne connais pas tous les numéros de comptes, et donc, que je ne peux pas créer autant de variables qu'il y'a de comptes. Je voudrais donc les créer dans ma boucle automatiquement.

    Mais voilà, je n'y arrive pas... Il me faut d'une tester si la variable n'est pas déjà créée afin de ne pas réécraser a chaque fois les sommes. Puis, il faut la créer ( "cpt"&<numéro de compte" ) et augmenter sa valeur de la somme présente dans la ligne du tableau.

    Voila le code tel que j'aimerais qu'il soit. Mais je n'ia pas réussi a le mettre en état...

    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
     
     'On considère que C = + et D = -. Lorsqu'on fera les sommes de montant, on reconnaitra, alors ,
        'grace au signe du résultat si l'écriture est passée au Crédit ou au Débit.
     
        For i = 2 To ActiveSheet.UsedRange.Rows.Count
     
            Sens = Mid(Worksheets("source").Cells(i, 1).Value, 84, 1)   'Débit ou crédit
            CptNumero = Worksheets("etape1").Cells(i, 9).Value          'Numéro du compte
     
            'ICI : Test de l'existence de la variable <cpt&CptNumero>
            'Si il existe on fait rien, sinon on le créée
     
            Select Case CptNumero
     
                Case 421110, 427100
                    If Sens = "C" Then
                        <cpt&CptNumero> = <cpt&CptNumero> + Worksheets("etape1").Cells(i, 11).Value
                    Else
                        <cpt&CptNumero> = <cpt&CptNumero> - Worksheets("etape1").Cells(i, 11).Value
                    End If
     
                Case 425100, 428650
                    'On fait rien
     
    End Select
    Next
    Merci d'avance.

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonjour

    Tu peux placer tes données dans un tableau séquentiel dont tu augmentes la taille lorsque tu trouves une nouvelle "variable".


    Un exemple qui boucle sur les cellules de la plage A1:A10 pour rechercher les doublons.
    La premiere dimension permet de récupérer les nouvelles "variables". La deuxième dimension sert à incrémenter d'une unité pour compter le nombre de fois qu'apparait chaque élément:


    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
    48
    49
    50
    51
    52
    53
    54
    55
    Sub listeDoublons()
        Dim Plage As Range
        Dim Tableau(), Resultat() As String
        Dim i As Integer, j As Integer, m As Integer
        Dim Un As Collection
        Dim Doublons As String
     
        Set Un = New Collection
        'La plage de cellules à tester
        Set Plage = Range("A1:A10")
     
        Tableau = Plage.Value
        ReDim Preserve Resultat(2, 1)
     
        On Error Resume Next
        'boucle sur la plage à tester
        For i = 1 To Plage.Count
            'Utilise une collection pour rechercher les doublons
            '(les collections n'acceptent que des données uniques)
            Un.Add Tableau(i, 1), Tableau(i, 1)
     
            'S'il y a une erreur (donc presence d'un doublon)
            If Err <> 0 Then
     
                'boucle sur le tableau des doublons pour verifier s'il a deja
                'été identifié
                For j = 1 To m + 1
                    'Si oui , on  incrément le compteur
                    If Resultat(1, j) = Tableau(i, 1) Then
                        Resultat(2, j) = Resultat(2, j) + 1
                        Err.Clear
                        Exit For
                    End If
                Next j
     
                    'Si non, on ajoute le doublon dans le tableau
                    If Err <> 0 Then
                        Resultat(1, m + 1) = Tableau(i, 1)
                        Resultat(2, m + 1) = 1
     
                        m = m + 1
                        Err.Clear
                        ReDim Preserve Resultat(2, m + 1)
                    End If
            End If
        Next i
     
        '----- Affiche la liste er le nombre de doublons --------
        For j = 1 To m
            Doublons = Doublons & Resultat(1, j) & "-->" & _
                        Resultat(2, j) & vbCrLf
        Next j
     
        MsgBox Doublons
    End Sub



    michel

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Par défaut
    Merci beaucoup !

    C'est exactement ce qu'il me fallait. Des objets non nommés, juste référencé par un index et une clé.... Génial.

    Je fais mes tests et je publie le résultat si il est concluant. (même si il ne l'est pas d'ailleurs)

  4. #4
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Par défaut
    Bonjour de nouveau,

    Je me suis donc repenché sur ce probleme et ai essayé d'appliquer la solution des collections. Mais je rencontre alors un nouveau problème.

    J'ai donc créé des objets "Compte" avec deux paramètres 'Solde' et 'Numéro'.
    Je test donc la fonction 'Item' de 'Collection' afin de retrouver un objet par rapport au numéro du compte (donc de la deuxième clé). Si il n'existe pas, le système lève une exception que je retraite dans "out:" spécifiant de le créer puis continuier l'api.

    Mon soucis se situe dans ce dernier traitement. Il ne veut pas recréer un objet qui existe déjà, et j'ai peur qu'avec un delete, je supprime aussi le "pointeur" dans ma collection.



    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
    48
    49
    50
     
    Sub etape2()
        On Error GoTo out
     
        Dim Comptes As New Collection 'Objet Collection qui nous servira a référencer/retrouver/stocker de manière dynamique les comptes.
     
     
        'On considère que C = + et D = -. Lorsqu'on fera les sommes de montant, on reconnaitra, alors ,
        'grace au signe du résultat si l'écriture est passée au Crédit ou au Débit.
     
        For i = 2 To ActiveSheet.UsedRange.Rows.Count
     
            Sens = Mid(Worksheets("source").Cells(i, 1).Value, 84, 1)   'Débit ou crédit
            CptNumero = Worksheets("etape1").Cells(i, 9).Value          'Numéro du compte
     
            'ICI : Test de l'existence de la variable <cpt&CptNumero>
            'Si il existe on fait rien, sinon on le créée dans la gestion des Exceptions
     
            Comptes.Item (CStr(CptNumero))
     
     
            Select Case CptNumero
     
                Case 421110, 427100
                    If Sens = "C" Then
                        Cpt.Solde = Cpt.Solde + Worksheets("etape1").Cells(i, 11).Value
                    Else
                        Cpt.Solde = Cpt.Solde - Worksheets("etape1").Cells(i, 11).Value
                    End If
     
                Case 425100, 428650
                    'etc....
     
            End Select
     
        Next
     
    out:
        If Err.Number = 5 Then
                Dim Cpt As New Compte '<-----
                Cpt.Numero = CptNumero
                Comptes.Add (Cpt) '<------
        'Else if Err.Number = 438 Then
        End If
        Resume Next
     
     
     
      MsgBox (Comptes.Item(CptNumero).Solde)
    End Sub

    Mon idée était de surcharger le constructeur new de Collection pour pouvoir lui passer un numéro ds l'instanciation, de telle sorte que je pourrais déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Comptes.Add (new Compte(CptNumero))
    Mais j'y arrive pas ^^

    Merci d'avance pour vos idées.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim macompta  As New Collection
     
    Function ajoute(compte As String, montant As Currency)
    On Error GoTo fin
    Dim prov As Currency
    macompta.Add Item:=montant, key:=compte
    Exit Function
    fin:
    On Error GoTo 0
    prov = macompta.Item(compte) + montant
    macompta.Remove (compte)
    macompta.Add Item:=prov, key:=compte
    End Function
    pourrait fonctionner

Discussions similaires

  1. vba excel nom indirect de variable
    Par ajc50 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/12/2009, 00h22
  2. VBA : nom de variable dynamique
    Par florent_projet dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/08/2008, 11h27
  3. Réponses: 4
    Dernier message: 13/09/2005, 11h50
  4. Noms de Variables dynamiques
    Par horec dans le forum Langage
    Réponses: 7
    Dernier message: 22/07/2005, 16h47
  5. [SQL SERVER 2000] Noms de variables dynamiques
    Par cassoulet dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/09/2004, 11h44

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