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 :

Incrémentation Tableau dynamique


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Incrémentation Tableau dynamique
    Bonjour,

    Je souhaiterais après avoir effectué une recherche par des critères, remplir un tableau dynamique pour ensuite l'exploiter.
    Malheureusement, mon tableau ne s incrémente pas.
    Je ne sais pas non plus comment faire un tri dans ce tableau.

    Pourriez vous m'aider.



    L'argumentation qui serait erroné est "ReDim Preserve tableauDynamique(n, 5)"
    L'erreur est "L'indice n'appartient pas à la sélection"



    Voici mon code.

    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    Option Explicit
     
    Public ligneHFCPositif As Long, ligneHFCNegatif As Long
    Public trancheMinimun As Long, trancheMaximum As Long
    Public n As Long
    Public tableauDynamique As Object
     
    Function conditionMultiple()
     
     
    Dim marque As String, typeEvaporateur As String, famille As String, KS As Long
    Dim nombreMarqueTrouve As Long
     
    Dim plageMarque As String
    Dim plageTypeEvaporateure As String
    Dim plageFamille As String
    Dim plageKS As String
    Dim Cell As Range
    Dim tableauDynamique()
     
    n = 0
    ReDim tableauDynamique(n, 5)
     
     
     
     
    marque = ActiveCell.Offset(0, -10).Value
    typeEvaporateur = ActiveCell.Offset(0, -9).Value
    famille = ActiveCell.Offset(0, -4).Value
    KS = ActiveCell.Offset(0, -1).Value
     
    Call calculTrancheKS(KS)
    Call compteurLignes("HFC POSITIF")
     
    plageMarque = "B18:B" & ligneHFCPositif
    plageTypeEvaporateure = "C18:C" & ligneHFCPositif
    plageFamille = "B18:B" & ligneHFCPositif
    plageKS = "A18:A" & ligneHFCPositif
     
     
    If famille = "HFC" Then
        famille = "R404A"
    Else
        famille = "CO2"
    End If
     
    Sheets("HFC POSITIF").Range(plageMarque).Select
     
     
    For Each Cell In Selection
     
     
        If marque = ActiveCell.Value And typeEvaporateur = ActiveCell.Offset(0, 1).Value And famille = ActiveCell.Offset(0, 3).Value Then
     
            If KS > trancheMinimun And KS < trancheMaximum Then
     
                tableauDynamique(n, 0) = ActiveCell.Offset(0, -1)
                tableauDynamique(n, 1) = ActiveCell.Offset(0, 0)
                tableauDynamique(n, 2) = ActiveCell.Offset(0, 1)
                tableauDynamique(n, 3) = ActiveCell.Offset(0, 3)
                tableauDynamique(n, 4) = ActiveCell.Offset(0, 2)
                tableauDynamique(n, 5) = ActiveCell.Offset(0, 12)
     
                n = n + 1
     
                ReDim Preserve tableauDynamique(n, 5)
     
            End If
        End If
     
    Next Cell
     
     
    MsgBox (tableauDynamique(n, 6))
     
    End Function
     
    Public Function compteurLignes(feuille As String)
     
    Dim derniereLigne As Long
     
    derniereLigne = 0
     
    Worksheets(feuille).Activate
     
    Range("A" & Rows.Count).End(xlUp).Select
    derniereLigne = Range("A" & Rows.Count).End(xlUp).Row
     
    If feuille = "HFC POSITIF" Then
        ligneHFCPositif = derniereLigne
    End If
     
    If feuille = "HFC NEGATIF" Then
        ligneHFCNegatif = derniereLigne
    End If
     
    End Function
     
    Function calculTrancheKS(celluleCalculKS As Long)
     
    trancheMinimun = celluleCalculKS * 0.75
    trancheMaximum = celluleCalculKS * 1.25
     
    End Function
     
    Function triTableauDynamique()
     
     
    Quick tableauDynamique(), LBound(tableauDynamique), UBound(tableauDynamique), 1, True
     
     
    End Function
     
    Sub afficheRechercheTrouve()
     
    Call conditionMultiple
    Call triTableauDynamique
     
    'MsgBox (tableauDynamique(n, 6))
     
     
     
    End Sub

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par fnallet94 Voir le message
    Je ne sais pas non plus comment faire un tri dans ce tableau.
    Il est beaucoup plus simple de faire un tri de données enregistrées dans des cellules.
    Pour faire un tri dans un tableau de variable, il va falloir développer un algorithme beaucoup plus compliqué parce qu'à ma connaissance, il n'existe ni fonction ni instruction qui fasse ça.

    L'argumentation qui serait erroné est "ReDim Preserve tableauDynamique(n, 5)"
    L'erreur est "L'indice n'appartient pas à la sélection"
    Juste avant ton Redim, tu mets n=0. Ca te semble logique ?

  3. #3
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    plusieures petites choses.

    1) ReDim tableauDynamique(n, 5) n'est pas bon car on redimentionne que sur la dernière valeur du tableau donc : ReDim tableauDynamique(5,n) ton tableau sera dans un autre sens mais c'est pareil

    2) je te conseille de mettre Option base 1 qui met le premier élement à 1 au lieu de 0 c'est plus facile à gérer

    3) J'aurais déclarer le tableau non pas comme un objet mais comme une variable du genre :
    Public Tablo(5,1) as string (et c'est ton 1 tu incrémentes par un redim preserve)

    tu dis

    A+

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Cela fonctionne maintenant etje vous en remercie.

    Voici les modifications apportées :

    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
    For Each Cell In Selection
     
        If marque = Cell.Value And typeEvaporateur = Cell.Offset(0, 1).Value And famille = Cell.Offset(0, 3).Value Then
     
            celluleKS = Cell.Offset(0, -1).Value
     
            If celluleKS > trancheMinimun And celluleKS < trancheMaximum Then
     
                ReDim Preserve tableauDynamique(6, n)
     
                tableauDynamique(1, n) = Cell.Offset(0, -1)
                tableauDynamique(2, n) = Cell.Offset(0, 0)
                tableauDynamique(3, n) = Cell.Offset(0, 1)
                tableauDynamique(4, n) = Cell.Offset(0, 3)
                tableauDynamique(5, n) = Cell.Offset(0, 2)
                tableauDynamique(6, n) = Cell.Offset(0, 12)
     
                n = n + 1
     
            End If
        End If
     
    Next Cell
    Il y avait aussi une erreur dans la valeur de la cellule a ajouter dans le tableau.

    J ai annulé ActiveCell.Offset par Cell.Offset car il reprenait la valeur de la 1ere ligne de la sélection.

    Par contre, pouvez vous me dire comment faire un tri croissant sur la 6eme valeur du Tableau ?

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par fnallet94 Voir le message
    Par contre, pouvez vous me dire comment faire un tri croissant sur la 6eme valeur du Tableau ?
    Je te l'ai déjà dit : fais le tri sur les cellules Excel avant de placer les valeurs dans ta variable.
    Ca se fait en une ligne : https://msdn.microsoft.com/fr-fr/lib.../ff840646.aspx

    Je ne vois vraiment pas l'intérêt d'attendre que tes données soient dans des variables : ça sera beaucoup plus compliqués à coder et beaucoup plus long en temps d'exécution (et plus risqué aussi).

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour Menhir,

    Je ne peux faire de modifications sur le fichier de base car il ne m'appartient pas.
    Par contre je peux éventuellement recopier sur un tableau Excel les informations récupérées dans mon tableau Dynamique, les trier et les remettre dans un tableau Array.

    Merci a vous tous pour vos conseils.

    cordialement.

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par fnallet94 Voir le message
    Je ne peux faire de modifications sur le fichier de base car il ne m'appartient pas.
    Dans ce cas, recopie l'intégralité de la feuille ou même du classeur et supprime la copie après avoir récupéré les données triées.
    Ca te fera trois lignes de code au lieu d'une mais c'est toujours moins que ce qu'imposerait le tri de variables.

    Sans compter que rien ne t'empêche de trier tes données dans ton fichier de base et de ne pas enregistrer cette modification (par exemple en le fermant avec un Close SaveChanges:=False).
    Au final, tu obtiens ce que tu souhaites sans l'avoir modifié.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/07/2015, 18h34
  2. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  3. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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