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 :

probleme avec nombre d'elements dans un dictionnaire


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 174
    Points : 144
    Points
    144
    Par défaut probleme avec nombre d'elements dans un dictionnaire
    Bonsoir le forum

    voilà mon soucis. j'ai créé le code suivant qui marche super bien lorsque j'ai plus d'un element dans la liste de mon dictionnaire;
    par contre lorsque je n'ai qu'un élément, ça ne fonctionne pas.Je voudrais quand même que l'élément se mette en AE3.

    Pouvez vous m'aider?


    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
    Private Sub SansDoublonsTrie()
    Dim MonDico As Object
    Dim c As Range
     
     
     'pour les essences
    Set MonDico = CreateObject("Scripting.Dictionary")
     
    With Worksheets("lotissement")
        For Each c In .Range("A12:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
            If Not MonDico.exists(Trim(c.Value)) Then MonDico.Add Trim(c.Value), Trim(c.Value)
        Next c
     
     
     
        With .Range("AE3").Resize(MonDico.Count, 1)
            .Value = Application.Transpose(MonDico.keys)
            .Sort Key1:=Worksheets("lotissement").Range("AE3"), Order1:=xlAscending, Header:=xlNo
        End With
     
    End With
    Set MonDico = Nothing
    ' Calcul du volume selon essence et qualite
    Dim i As Long, LigFin As Long
    Dim fct As String, fct1 As String, fct2 As String, fct3 As String, fct4 As String
     
    LigFin = [AE65536].End(xlUp).Row
     
    For i = 3 To LigFin
        fct = "=SUMPRODUCT($K$12:$K$2000*(($A$12:$A$2000)=" & Range("AE" & i).Address(False, True) & ")*(($G$12:$G$2000)=AF$2))"
        fct1 = "=SUMPRODUCT($K$12:$K$2000*(($A$12:$A$2000)=" & Range("AE" & i).Address(False, True) & ")*(($G$12:$G$2000)=AG$2))"
        fct2 = "=SUMPRODUCT($K$12:$K$2000*(($A$12:$A$2000)=" & Range("AE" & i).Address(False, True) & ")*(($G$12:$G$2000)=AH$2))"
        fct3 = "=SUMPRODUCT($K$12:$K$2000*(($A$12:$A$2000)=" & Range("AE" & i).Address(False, True) & ")*(($G$12:$G$2000)=AI$2))"
        fct4 = "=SUMPRODUCT($K$12:$K$2000*(($A$12:$A$2000)=" & Range("AE" & i).Address(False, True) & ")*(($G$12:$G$2000)=AJ$2))"
        Cells(i, 32) = Evaluate(fct)
        Cells(i, 33) = Evaluate(fct1)
        Cells(i, 34) = Evaluate(fct2)
        Cells(i, 35) = Evaluate(fct3)
        Cells(i, 36) = Evaluate(fct4)
        Range("AK" & i) = Application.WorksheetFunction.Sum(Range("AF" & i), Range("AG" & i), Range("AH" & i), Range("AI" & i), Range("AJ" & i))
     
    Next i
     
    Call tri_qualite
     
    End Sub

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 174
    Points : 144
    Points
    144
    Par défaut
    Rebonsoir le forum

    Je me suis penche à nouveau sur mon code et il se trouve qu'il ne fonctionne pas quand il y a plusieurs lignes dans le dictionnaire "Propriétaire".
    Quand il n'y en a qu'un suel, tout marche mais des qu'il y en a deux, ça ne marche pas (aucun message d'erreur par contre).
    J'ai essyé de modifier l'ordre d'appel des procedures dans la procedure principale mais rien n'y fait.

    Avez vous une solution???
    Je bloque là dessus depuis ce matin

    Cordialement
    lps02


    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    Private Sub SansDoublonsTrie()
    Dim MonDico As Object
    Dim c As Range
     
     
     'pour les essences
    Set MonDico = CreateObject("Scripting.Dictionary")
     
    With Worksheets("lotissement")
        For Each c In .Range("A12:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
            If Not MonDico.exists(Trim(c.Value)) Then MonDico.Add Trim(c.Value), Trim(c.Value)
        Next c
     
     
     
        With .Range("AE3").Resize(MonDico.Count, 1)
            .Value = Application.Transpose(MonDico.keys)
            .Sort Key1:=Worksheets("lotissement").Range("AE3"), Order1:=xlAscending, Header:=xlNo
        End With
     
    End With
    Set MonDico = Nothing
    ' Calcul du volume selon essence et qualite
    Dim i As Long, LigFin As Long
    Dim fct As String, fct1 As String, fct2 As String, fct3 As String, fct4 As String
     
    LigFin = [AE65536].End(xlUp).Row
     
    For i = 3 To LigFin
        fct = "=SUMPRODUCT($K$12:$K$2000*(($A$12:$A$2000)=" & Range("AE" & i).Address(False, True) & ")*(($G$12:$G$2000)=AF$2))"
        fct1 = "=SUMPRODUCT($K$12:$K$2000*(($A$12:$A$2000)=" & Range("AE" & i).Address(False, True) & ")*(($G$12:$G$2000)=AG$2))"
        fct2 = "=SUMPRODUCT($K$12:$K$2000*(($A$12:$A$2000)=" & Range("AE" & i).Address(False, True) & ")*(($G$12:$G$2000)=AH$2))"
        fct3 = "=SUMPRODUCT($K$12:$K$2000*(($A$12:$A$2000)=" & Range("AE" & i).Address(False, True) & ")*(($G$12:$G$2000)=AI$2))"
        fct4 = "=SUMPRODUCT($K$12:$K$2000*(($A$12:$A$2000)=" & Range("AE" & i).Address(False, True) & ")*(($G$12:$G$2000)=AJ$2))"
        Cells(i, 32) = Evaluate(fct)
        Cells(i, 33) = Evaluate(fct1)
        Cells(i, 34) = Evaluate(fct2)
        Cells(i, 35) = Evaluate(fct3)
        Cells(i, 36) = Evaluate(fct4)
        Range("AK" & i) = Application.WorksheetFunction.Sum(Range("AF" & i), Range("AG" & i), Range("AH" & i), Range("AI" & i), Range("AJ" & i))
     
    Next i
     
    Call tri_qualite
     
    End Sub
     
    Private Sub Propriétaire()
    Dim Dico As Object
    Dim j As Range
    Dim d As Variant
    Dim b As Long
    'tri sur les proprietaire sans doublons par ordre alpha
    Set Dico = CreateObject("Scripting.Dictionary")
    With Worksheets("lotissement")
        For Each j In .Range("N12:N" & .Cells(.Rows.Count, 1).End(xlUp).Row)
            If Not Dico.exists(Trim(j.Value)) Then Dico.Add Trim(j.Value), Trim(j.Value)
        Next j
        temp = Dico.items
     Call Tri(temp, LBound(temp), UBound(temp)) ' voir module mod_tri
     
         b = 3
            For Each d In temp
            .Cells(4, b) = d  'pour recopier la liste des éléments uniques à partir de la cellule C4
            b = b + 1
            Next d
     
        .Cells(3, 21).Value = Application.WorksheetFunction.Proper(Join(temp, "-")) 'pour regrouper les apporteurs en cellules U3
     
     
    End With
       Set Dico = Nothing
     
    End Sub
     
    Sub Tri(j, gauc, droi)   ' Quick sort
     ref = j((gauc + droi) \ 2)
     G = gauc: d = droi
     Do
      Do While j(G) < ref: G = G + 1: Loop
      Do While ref < j(d): d = d - 1: Loop
      If G <= d Then
      temp = j(G): j(G) = j(d): j(d) = temp
      G = G + 1: d = d - 1
      End If
     Loop While G <= d
     If G < droi Then Call Tri(j, G, droi)
     If gauc < d Then Call Tri(j, gauc, d)
     End Sub

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 174
    Points : 144
    Points
    144
    Par défaut
    J'ai trouve
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Sort Key1:=Worksheets("lotissement").Range("AE3"), Order1:=xlAscending, Header:=xlNo
    Comme il y a des entetes il fallait mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Sort Key1:=Worksheets("lotissement").Range("AE3"), Order1:=xlAscending, Header:=xlYes

    Bonne soirée à vous
    Cordialement
    lps02

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

Discussions similaires

  1. Probleme avec mes formulaire html dans mes pages web
    Par foungnigue dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 28/12/2005, 19h07
  2. Probleme avec le signe & contenu dans un parametre d'une
    Par Ludo_xml dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 22/08/2005, 15h45
  3. Problème avec la cmd set dans .bash_profile ?
    Par sali dans le forum Linux
    Réponses: 2
    Dernier message: 01/08/2005, 05h34
  4. Réponses: 2
    Dernier message: 06/07/2005, 16h19
  5. probleme avec le caractere 'Z' dans ma clause WHERE
    Par dibox dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/04/2004, 12h21

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