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 :

Identification d'erreurs via un Format conditionnel [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Acheteuse
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Acheteuse
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut Identification d'erreurs via un Format conditionnel
    Bonjour,

    J'ai paramétré un format conditionnel dans plusieurs cellules de mon fichier Excel pour identifier des erreurs d'encodage.

    Je souhaiterais, via une macro, compter le nombre d'erreurs dans mon classeur.

    Voici la manière dont j'ai écrit cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Set Report_PrixCurrency = Range("Report_PrixCurrency")
        Report_PrixCurrency.Select
        If PrixCurrency.FormatConditions(1).Formula1 = True Then
            nerror = nerror + 1
        Else
            PrixCurrency = Mid(Report_PrixCurrency, 1, 3)
        End If
    mais voilà, ça ne fonctionne pas. Excel ne compte pas d'erreurs alors que j'en ai trois dans mon fichier.
    Et parfois, le debugger trouve un bug dans la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PrixCurrency.FormatConditions(1).Formula1
    Quelqu'un pourrait-il m'aider ?

    D'avance merci !
    Marie

  2. #2
    Membre Expert Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Par défaut
    Bonjour,

    Il n'y a pas besoin de tester la propriété (de toute façon, je crois pas que ça fonctionne et en plus tu ne fais pas de boucle sur les celulles qui la compose).

    Cette ligne suffit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nerror = Range("Report_PrixCurrency").FormatConditions.Count
    Par contre, pour la ligne où tu extrait une partie du texte, tu dois passer par une boucle. Mais on en revient au test, le mieux serait que tu nous dises ce que contient ces celulles et si on peut les utiliser pour le test (au lieu de tester le format conditionnel)

    A+

    Edit: petite précision, quand je dit que le test sur la MFC ne fonctionne pas c'est dans le cas où la plage contient des celulles SANS mise en forme conditionnelle.

  3. #3
    Membre habitué
    Femme Profil pro
    Acheteuse
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Acheteuse
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut
    En fait, ma macro compile dans un fichier de synthèse (en colonne), les informations qui se situent dans des fichiers indépendants.

    Ces infos se trouvent dans des cellules auxquelles j'ai donné un nom qui commence par Report_QQCH dans les fichiers indépendants et Merge_QQCH dans le fichier de sythèse.

    Chaque cellule du fichier indépendant contient de 2 à 5 critères de mise en forme conditionnelle suivant les différentes incohérences possibles entre les informations.

    Dans une version précédente de la macro, mon collègue avait paramétré toutes les mises en formes conditionnelles dans la macro.
    Le problème de cette méthode, c'est qu'on ne voit pas les erreurs tant qu'on n'a pas executé la macro.

    Report_PrixCurrency contient une monnaie (EUR, USD, GBP) contrôlée par une liste de choix. C'est vrai que le mid() est un peu inutile. J'avoue que c'est une partie de code que j'ai reprise bêtement.

    Je vais essayer le bout de code que tu me proposes et je te dirai si ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nerror = Range("Report_PrixCurrency").FormatConditions.Count
    Le test que j'utilisais "fonctionne" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PrixCurrency.FormatConditions(1).Formula1 = True
    car j'ai des formats conditionnels dans toutes mes cellules et alors nerror est incrémenté à chaque fois que je fais le test car on dirait que la macro teste le fait que la mise en forme conditionnelle est une formule ou pas.

    Rebonjour Frédéric,

    Et bien ça fonctionne, mais ça ne donne pas le résultat qui m'intéresse.

    Voici le code que j'ai inclus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        nerror = 0
     
        Set Report_CapexOpex = Range("Report_CapexOpex")
        Report_CapexOpex.Select
        CapexOpex = Report_CapexOpex
        nerror = nerror + Range("Report_CapexOpex").FormatConditions.Count
     
        Set Report_DaNr = Range("Report_DaNr")
        Report_DaNr.Select
        DaNr = Report_DaNr
        nerror = nerror + Range("Report_PrixCurrency").FormatConditions.Count
    Dans mon fichier, il y a une erreur sur Report_DaNr (la mise en forme conditionnelle est appliquée), mais pas sur Report_CapexOpex.
    Je devrais donc avoir nerror = 1 à la fin du code. Mais le debugger trouve nerror = 2.

    Pfff... je ne suis pas sauvée.

    Est-ce que tu aurais une autre idée ?

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut

    PrixCurrency représente quoi dans ton code?
    Ou alors c'est une erreur de frappe, dans ce cas, je rejoins Fvandermeulen sur le fait qu'il faille boucler sur les cellules contenues dans ta plage nommée.

    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
    Dim Report_PrixCurrency As Range
    Dim nError As Integer
     
        'Set Report_PrixCurrency = Range("Report_PrixCurrency")
     
        'On boucle sur toutes les cellule pointé par Report_PrixCurrency
        'Il vaut mieux péciser sur quel classeur et feuille tu travailles
        For Each Report_PrixCurrency In ThisWorkbook.Sheets("FEuil1").Range("Report_PrixCurrency")
            'Inutile de selectionner la cellule pour travailler avec
            'Report_PrixCurrency.Select
            If Report_PrixCurrency.FormatConditions(1).Formula1 = True Then
                nError = nError + 1
            Else
                Report_PrixCurrency = Mid(Report_PrixCurrency, 1, 3)
            End If
        Next
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre habitué
    Femme Profil pro
    Acheteuse
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Acheteuse
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut
    Je vais mettre les différents fichiers en ligne.
    Comme ça, vous verrez l'ensemble du code. Là, je n'ai copié qu'une partie des 8 pages de code.

    Les déclarations, c'est mieux, c'est vrai. J'ai perdu mes bonnes habitudes de quand je programmais en C++.

    Vous verrez dans la macro que je boucle sur certains de mes champs, quand ceux-ci contiennent plusieurs cellules.
    Mais dans le cas de Report_DaNr, Report_DaNr et Report_PrixCurrency, ça n'est pas le cas.

    Dans la macro, le fichier et la feuille sont aussi bien précisés...

    Pour faire fonctionner le code, il faut changer les chemins d'accès dans l'onglet "table" du formulaire individuel.
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut

    Il te faudra de toute façon a minima utiliser Evaluate() pour évaluer la formule contenu dans ta formula1.

    [Edit]
    J'ai fait quelques essais et recherches, et un autre internaute à eu le même soucis y'a pas longtemps avec les validations, Evaluate() ne prend que des formules en Anglais... Formula1 fait apparaître la formule dans la langue Excel... En français donc...
    *Essai comme ça
    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
    Option Explicit
     
    Sub essai()
    Dim TheCell As Range
    Dim RetourEval As Variant
    Dim Formu1 As String
     
     
    For Each TheCell In Cells
        'On evite une erreur
        If TheCell.FormatConditions.Count > 0 Then
            'On place la formule en francais (dans une cellule temporaire
            [B30].FormulaLocal = TheCell.FormatConditions(1).Formula1
            'On la récupére en Anglais
            Formu1 = [B30].Formula
            'On vide la cellule
            [B30] = ""
            'On teste
            If Application.Evaluate(Formu1) Then Debug.Print TheCell.Address
        End If
    Next
     
    End Sub
    Par contre ça n’accepte pas les formules contenant des fonctions perso...

    [/Edit]

    Pour le reste du code, voila quelques modif, pour alléger un peu.

    Tu utilises énormément de variables alors que tu le les réutilises jamais dans la suite du code. Il me semble qu'en C++ il fait créer un mnémonique pour chaque champs texte et autre (enfin je m'avance un peu beaucoup je crois...) en VBa en tout cas ça n'est pas utile, tu peux directement faire référence au contenu d'une cellule.

    Inutile de selectionner une cellule ou un onglet pour travailler dessus, il suffit de les pointer, soit avec une variable, soit avec With...


    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    Sub Thermometre_Report()
    '
    ' Checks whether Negotiation Report includes errors or not
    '
    Dim SheetDerog As Worksheet
     
        Set SheetDerog = ThisWorkbook.Sheets("Derogation")
     
        With SheetDerog
            nerror = 0
            Calculate
            'Sheets("Derogation").Select
     
            Set Report_Date = .Range("Report_Date")
            'Report_Date.Select
            DateC = Report_Date
     
            Set Report_SegFamily = .Range("Report_SegFamily")
            'Report_SegFamily.Select
            SegFamily = Report_SegFamily
     
            Set Report_CapexOpex = .Range("Report_CapexOpex")
            'Report_CapexOpex.Select
            CapexOpex = Report_CapexOpex
     
            'nerror = nerror + .Range("Report_CapexOpex").FormatConditions.Count
     
            Set Report_BU1 = .Range("Report_BU1")
            Set Report_BU2 = .Range("Report_BU2")
            Set Report_BU_U = .Range("Report_BU_U")
            Set Report_BU_R = .Range("Report_BU_R")
     
            jcount = Report_BU2.Count
            icount = Report_BU1.Count
            i = 1
            Do While i <= icount
                If Report_BU1(i) <> "" Then
                    BU = Report_BU1(i).Offset(0, -1)
                    i = icount + 1
                Else
                    If i = icount Then
                        j = 1
                        Do While j <= jcount
                            If Report_BU2(j) <> "" Then
                                BU = Report_BU2(j).Offset(0, -1)
                                j = jcount + 1
                            Else
                                j = j + 1
                            End If
                        Loop
                    End If
                    i = i + 1
                End If
            Loop
     
            Set Report_ContractManagerU = .Range("Report_ContractManagerU")
            Set Report_ContractManagerR = .Range("Report_ContractManagerR")
     
            If BU <> "Research" Then
                'Report_ContractManagerU.Select
                If EvaluateFr(Report_ContractManagerU.FormatConditions(1).Formula1) Then
                    nerror = nerror + 1
                Else
                    ContractManager = Report_ContractManagerU
                End If
            Else
                'Report_ContractManagerR.Select
                If EvaluateFr(Report_ContractManagerR.FormatConditions(1).Formula1) Then
                    nerror = nerror + 1
                Else
                    ContractManager = Report_ContractManagerR
                End If
            End If
     
            Set Report_Requisitioner = .Range("Report_Requisitioner")
            'Report_Requisitioner.Select
            Requisitioner = Report_Requisitioner
     
            Set Report_DaNr = .Range("Report_DaNr")
            'Report_DaNr.Select
            DaNr = Report_DaNr
     
            'nerror = nerror + Range("Report_PrixCurrency").FormatConditions.Count
     
            Set Report_Description = .Range("Report_Description")
            'Report_Description.Select
            Description = Report_Description
     
            Set Report_ReportNr = .Range("Report_ReportNr")
            'Report_ReportNr.Select
            If Report_ReportNr = "" Or IsNumeric(compress(Mid(Report_ReportNr, 3, 20))) Then
                ReportNr = Report_ReportNr
            Else
                nerror = nerror + 1
            End If
     
            Set Report_Archivage = .Range("Report_Archivage")
            'Report_Archivage.Select
            Archivage = StrConv(Report_Archivage, vbProperCase)
     
            Set Report_NbOfferInLine = .Range("Report_NbOfferInLine")
            'Report_NbOfferInLine.Select
            NbOfferInLine = Report_NbOfferInLine
     
            Set Report_BudgetAmount = .Range("Report_BudgetAmount")
            'Report_BudgetAmount.Select
            BudgetAmount = Report_BudgetAmount
     
            Set Report_BudgetCurrency = .Range("Report_BudgetCurrency")
            'Report_BudgetCurrency.Select
            BudgetCurrency = Report_BudgetCurrency
     
            Set Report_Comment2 = .Range("Report_Comment2")
            Set Report_DerogationNeant = .Range("Report_DerogationNeant")
            If UCase(Mid(Report_Comment2, 1, 5)) = "NEANT" Then
                Comment2 = ""
            Else
                Comment2 = "DEROGATION: " & Report_Comment2
            End If
            DerogationNeant = Report_DerogationNeant
     
            Set Report_Comment3 = .Range("Report_Comment3")
            'Report_Comment3.Select
            Comment3 = Report_Comment3
     
            Set Report_Seuil1 = .Range("Report_Seuil1")
            'Report_Seuil1.Select
            Seuil1 = Report_Seuil1
     
            Set Report_Seuil3 = .Range("Report_Seuil3")
            'Report_Seuil3.Select
            Seuil3 = Report_Seuil3
     
            Calculate
        End With
     
            'Sheets("Rapport de Nego").Select
        With ThisWorkbook.Sheets("Rapport de Nego")
     
            Set Report_PoNr = .Range("Report_PoNr")
            'Report_PoNr.Select
            If Report_PoNr = "6500123456" Then
                PoNr = ""
            Else
                PoNr = Report_PoNr
            End If
     
            Set Report_Purchaser = .Range("Report_Purchaser")
            'Report_Purchaser.Select
    'Tu peux aleger tes structures
            Purchaser = IIf(Report_PoNr = "6500123456", "", Report_Purchaser)
    'Voir même si tu n'utiliser plus Report_Purchaser dans la suite du code ce qui visiblement est le cas de la plupart de tes variables
            Purchaser = IIf(Report_PoNr = "6500123456", "", .Range("Report_Purchaser")) 'et dans ce cas tu vires la ligne Set Report_Purchaser = .Range("Report_Purchaser")
            'If Report_PoNr = "6500123456" Then
            '    Purchaser = ""
            'Else
            '    Purchaser = Report_Purchaser
            'End If
     
            Set Report_PurchaserGlobal = .Range("Report_PurchaserGlobal")
            'Report_PurchaserGlobal.Select
            If Report_PoNr = "6500123456" Then
                PurchaserGlobal = ""
            Else
                PurchaserGlobal = Report_PurchaserGlobal
            End If
     
            Set Report_ExpenditureRecurrence = .Range("Report_ExpenditureRecurrence")
            'Report_ExpenditureRecurrence.Select
            If Report_PoNr = "6500123456" Then
                ExpenditureRecurrence = ""
            Else
                ExpenditureRecurrence = Report_ExpenditureRecurrence
            End If
     
            Set Report_AvgMarketBLAmount = .Range("Report_AvgMarketBLAmount")
            'Report_AvgMarketBLAmount.Select
            If Report_PoNr = "6500123456" Then
                AvgMarketBLAmount = ""
            Else
                AvgMarketBLAmount = Report_AvgMarketBLAmount
            End If
     
            Set Report_AvgMarketBLCurrency = .Range("Report_AvgMarketBLCurrency")
            'Report_AvgMarketBLCurrency.Select
            If Report_PoNr = "6500123456" Then
                AvgMarketBLCurrency = ""
            Else
                AvgMarketBLCurrency = Report_AvgMarketBLCurrency
            End If
     
            Set Report_MinMarketBLAmount = .Range("Report_MinMarketBLAmount")
            'Report_MinMarketBLAmount.Select
            If Report_PoNr = "6500123456" Then
                MinMarketBLAmount = ""
            Else
                MinMarketBLAmount = Report_MinMarketBLAmount
            End If
     
            Set Report_MinMarketBLCurrency = .Range("Report_MinMarketBLCurrency")
            'Report_MinMarketBLCurrency.Select
            If Report_PoNr = "6500123456" Then
                MinMarketBLCurrency = ""
            Else
                MinMarketBLCurrency = Report_MinMarketBLCurrency
            End If
     
            Set Report_PrixAmount = .Range("Report_PrixAmount")
            'Report_PrixAmount.Select
            If Report_PoNr = "6500123456" Then
                PrixAmount = ""
            Else
                PrixAmount = Report_PrixAmount
            End If
     
            Set Report_PrixCurrency = .Range("Report_PrixCurrency")
            'Report_PrixCurrency.Select
            If Report_PoNr = "6500123456" Then
                PrixCurrency = ""
            Else
                PrixCurrency = Report_PrixCurrency
            End If
     
            Set Report_SupplierName = .Range("Report_SupplierName")
            'Report_SupplierName.Select
            If Report_PoNr = "6500123456" Then
                SupplierName = ""
            Else
                SupplierName = Report_SupplierName
            End If
    'idem pour la suite...
            Set Report_SupplierNr = Range("Report_SupplierNr")
            Report_SupplierNr.Select
            If Report_PoNr = "6500123456" Then
                SupplierNr = ""
            Else
                SupplierNr = Report_SupplierNr
            End If
     
            Set Report_Comment1 = Range("Report_Comment1")
            Report_Comment1.Select
            If Report_PoNr = "6500123456" Then
                Comment1 = ""
            Else
                Comment1 = Report_Comment1
            End If
     
            Set Report_Negotiator = Range("Report_Negotiator")
            Report_Negotiator.Select
            If Report_PoNr = "6500123456" Then
                Negotiator = ""
            Else
                Negotiator = Report_Negotiator
            End If
     
            Set Report_NegoQualityDetail1 = Range("Report_NegoQualityDetail1")
            Set Report_NegoQualityDetail2 = Range("Report_NegoQualityDetail2")
            icount = Report_NegoQualityDetail1.Count
            jcount = Report_NegoQualityDetail2.Count
            Dim NegoQualityDetail(14)
            i = 0
            Do While i < icount
                i = i + 1
                'Report_NegoQualityDetail1(i).Select
                If Report_PoNr = "6500123456" Then
    'A quoi fais tu reference avec NegoQualityDetail(i) ?
                    NegoQualityDetail(i) = ""
                Else
                    NegoQualityDetail(i) = Report_NegoQualityDetail1(i)
                End If
            Loop
            j = 0
            Do While j < jcount
                j = j + 1
                'Report_NegoQualityDetail2(j).Select
                If Report_PoNr = "6500123456" Then
                    NegoQualityDetail(i + j) = ""
                Else
                    NegoQualityDetail(i + j) = Report_NegoQualityDetail2(j)
                End If
            Loop
     
    'Ca c'est iinutile je pense, parce que ton fichier est en mode de calcul Auto
            Calculate
    Dans ce code NegoQualityDetail(i) tu souhaites faire référence à quoi?

    J'ai modifié la fonction compress également

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub essai()
    Dim Ret As String
    Ret = compress("ae=fg)g(_-jjk")
    End Sub
    Static Function Compress(Code as string) As String
        compress = LCase(Trim(code))
        compress = Replace(compress, " ", "")
        compress = Replace(compress, "(", "")
        compress = Replace(compress, ")", "")
        compress = Replace(compress, "-", "")
        compress = Replace(compress, "_", "")
    End Function
    '
    J'ai vu ça aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub thermoprint()
    '
    ' hide2 Macro
    ' Macro recorded 04/12/2000 by RUBBERS Paul
    '
    ' Keyboard Shortcut: Ctrl+r
    '
        Range("A9:CM9").EntireColumn.Hidden = False
        Range("g9:h9").EntireColumn.Hidden = True
        Range("n9:t9").EntireColumn.Hidden = True
        Range("af9:ak9").EntireColumn.Hidden = True
    End Sub
    Vu que c'est lié à un raccourci clavier visiblement, il ne semble pas être nécessaire de préciser classeur et feuille, a toi de voir, en tout cas pas besoin de Select

    Je te conseille d'ailleurs de reprendre tous tes codes et de virer les Select, ça rend le code bien plus véloce et en précisant classeur+feuille, ça t'évite d'aller modifier du contenu dans un autre document juste par ce que tu as décider de faire autre chose le temps que ta macro tourne....

    Et pour que tout fonctionne bien j'ai ajouté ça, que j'utilise dans le code du début.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function EvaluateFr(FormuleUS As String) As Boolean
    'Au besoin on peut rajouter un parametre avec la cellule temp à utiliser
        With ThisWorkbook.ActiveSheet
            .[B30].FormulaLocal = FormuleUS
            EvaluateFr = Evaluate(.[B30].Formula)
            .[B30] = ""
        End With
     
    End Function
    Et pour te facilité la vie
    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(Report_DaNr="25xxxxxx";VRAI();FAUX())
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Report_DaNr="25xxxxxx"
    suffit.
    Voir même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =OU(ESTVIDE(Report_DaNr);Report_DaNr="25xxxxxx")
    Ce qui t'évitera d'avoir a gérer FormatCondition(1) et Formatcondition(2)

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Membre habitué
    Femme Profil pro
    Acheteuse
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Acheteuse
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut
    Eh bien, j'aurai appris des choses aujourd'hui. Merci beaucoup Monsieur Qwaz

    Je vais donc virer tous les .select et remplacer ça par un beau With. Le IIf est beau aussi. C'est vrai que c'est tout de suite plus clair et léger

    Dans QualityNegoDetail, je fais une compilation des données qui sont dans Report_NegoQualityDetail1 et Report_NegoQualityDetail2 qui sont deux zones séparées dans mon fichier individuel. Il y a un moyen plus simple de faire, je parie ?

    Enfin, peux-tu m'expliquer ce que fait ta nouvelle fonction ?

    Je vais réessayer de compter les erreurs comme toi. Parce que c'est ce que j'avais essayé ce matin, et parfois, Excel détectait un bug que j'avais du mal à comprendre. Et si j'ai bien compris, tu me dis que si j'ai 5 conditions pour la mise en forme conditionnelle, alors je dois répéter le test avec FormatCondition(1).Formula1, FormatCondition(2).Formula1, FormatCondition(3).Formula1, FormatCondition(4).Formula1 et FormatCondition(5).Formula1 ?

  8. #8
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut
    Eh bien, j'aurai appris des choses aujourd'hui. Merci beaucoup Monsieur Qwaz
    Pas de soucis avec plaisir.

    Enfin, peux-tu m'expliquer ce que fait ta nouvelle fonction ?
    Oui... je l'ai pas commenté, je pensais l'avoir fait... je perd la tête ^^
    J'ai rajouté le blocage du rafraîchissement.

    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
    Function EvaluateFr(FormuleUS As String) As Boolean
    'Au besoin on peut rajouter un parametre avec la cellule temp à utiliser
        With ThisWorkbook.ActiveSheet
            'On empêche le rafraichissement de l'ecran pour ne pas que l'utilisateur voit la manip (+gain de temps sur des gros traitement)
            Application.ScreenUpdating = False
            'On place la formule en francais (dans une cellule temporaire
            .[B30].FormulaLocal = FormuleUS
            'On la récupére en Anglais et on l'évalue
            EvaluateFr = Evaluate(.[B30].Formula)
            'On vide la cellule
            .[B30] = ""
            'On remet en place le refraichissement
            Application.ScreenUpdating = True
        End With
     
    End Function
    En fait il existe une fonction Application.Evaluate(), le bute étant d'évaluer une formule Excel pour savoir quel résultat elle retour. Le problème c'est que cette fonction demande une formule en Anglais et que FormatCondition ne retourne la formule que dans la version linguistique de ta version d'Excel... le français donc.
    Donc pour parait le problème, je passe par une cellule qui elle contient différentes propriété qui renvoie la formule dans des versions linguistiques appropriées (regarde l'aide sur Formula, FormulaR1C1, FormulaLocal....)

    Dans QualityNegoDetail, je fais une compilation des données qui sont dans Report_NegoQualityDetail1 et Report_NegoQualityDetail2 qui sont deux zones séparées dans mon fichier individuel. Il y a un moyen plus simple de faire, je parie ?
    Je vais regarder

    Je vais réessayer de compter les erreurs comme toi. Parce que c'est ce que j'avais essayé ce matin, et parfois, Excel détectait un bug que j'avais du mal à comprendre.
    Je n'ai pas fait beacoup de teste, il se peut donc que le solution est des lacunes. L'une d'elle, comme je te l'ai précisé plus haut, est que Evaluate() ne prend pas en compte les fonction personnalisé, je l'ai vu car j'ai eu une erreur sur une de tes Condition qui faisait référence à une fonction nommée Test() je crois.

    Et si j'ai bien compris, tu me dis que si j'ai 5 conditions pour la mise en forme conditionnelle, alors je dois répéter le test avec FormatCondition(1).Formula1, FormatCondition(2).Formula1, FormatCondition(3).Formula1, FormatCondition(4).Formula1 et FormatCondition(5).Formula1 ?
    Oui, d'où l’intérêt de regroupé toute tes MFC dans une seule quand celles-ci aboutissent à la même mise en forme.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  9. #9
    Membre habitué
    Femme Profil pro
    Acheteuse
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Acheteuse
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut
    Bonsoir Stéphane et merci beaucoup. Je vois que je te fais travailler tard.

    En plus, je suis coincée devant le PC de mon Homme, où seul Office 2003 est installé. Impossible de tester quoi que ce soit d'ici.

    Si je repasse par ma maison demain ou ce week-end, devant mon PC un peu plus évolué j'essaierai les modifications que tu m'as suggérées.
    Et dans tous les cas, je te tiens au courant lundi. C'est quand même le week-end du Nouvel An. C'est pas le moment d'embêter les gens avec du boulot

    A bientôt,
    Marie

  10. #10
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut

    Va falloir lui faire un cadeau pour le nouvelle an à ton Homme

    Pour ton autre morceau de code, voila un simplification possible
    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
        'Attention à la Base des tableau, par defaut on est en base 0 donc numeroté de 0à...n (ici 14)
        'Dans la suite du code, tu l'utilise comme un tableau de base1, pas d'incidence pour le code actuel,
        'juste pour attirer ton attention sur le sujet
        'Dim NegoQualityDetail(14) As String
        Dim NegoQualityDetail(1 To 14) As String 'Pour le forcer en Base 1
     
        'Les chaine sont initialisée à ""
        'Donc plus besoin de les définir pour chaque cellule
        'On peut donc simplifier ainsi
        If Report_PoNr <> "6500123456" Then
            For i = 1 To icount
                NegoQualityDetail(i) = Report_NegoQualityDetail1(i)
                NegoQualityDetail(i + icount) = Report_NegoQualityDetail2(i)
            Next
        End If
    Il reste aussi cette partie, je sent qu'il y a quelque chose a faire, mais je n'ai pas saisi ce que faisait cette partie du 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
            Do While i <= icount
                If Report_BU1(i) <> "" Then
                    BU = Report_BU1(i).Offset(0, -1)
                    '? c'est pas plutot i = i + 1 ?
                    i = icount + 1
                    'Si c'est pour quitter la boucle
                    'Exit Do
                Else
                    If i = icount Then
                        j = 1
                        Do While j <= jcount
                            If Report_BU2(j) <> "" Then
                                BU = Report_BU2(j).Offset(0, -1)
                                j = jcount + 1
                            Else
                                j = j + 1
                            End If
                        Loop
                    End If
                    i = i + 1
                End If
            Loop
    Plus je regarde cette boucle et plus je me demande si y'a pas une erreur, si la case correspondant à PE n'est pas cochée, tu testes les 3 autres en colonne H ? Tu testes pas d'abord les 3 cellules de la colonne F avant de passer à H?
    Passez une bonne soirée
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  11. #11
    Membre habitué
    Femme Profil pro
    Acheteuse
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Acheteuse
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut
    Je serai chez moi dans quelques heures. Je pourrais donc imprimer et tester ce que tu me suggères. Au plus tard demain matin. Je n'arrive jamais à faire la grasse matinée.

    Mais voici d'ores et déjà quelques questions & réponses :

    - dans ton premier code, icount=7, je suppose,
    - et dans ton deuxième code (celui avec les BU), icount devrait être égal à 3, c'est ça ?

    Pour la deuxième partie de code, voici, en bon français, ce que c'est sensé faire :
    1. Vérifier si on n'a pas plus de 1 valeur dans les 6 cellules où on met une croix (Report_BU1et Report_BU2). C'est moi qui ait dû enlever ce test quand j'ai enlevé tout comptage des erreurs.
    2. S'il n'y a pas de doublon, le code doit trouver la valeur non-nulle dans les 6 cases, prendre le titre de la case juste à gauche "Offset(0;-1)" et l'enregistrer dans BU. (Ca, c'est du code de mon prédécesseur que j'ai laissé tel quel. C'est vrai qu'il est un peu tirer par les cheveux...)

    Au fait, avec mes cellules qui contiennent plusieurs conditions pour le même format conditionnel, est-ce que je peux écrire un truc du genre... ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        For Each FormatCondition In ThisWorkbook.Sheets("FEuil1").Range("Report_RRR")
           If EvaluateFr(.Formula1) = True Then
                nError = nError + 1
           Else
                RRR = Report_RRR
           End If
        Next

  12. #12
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut
    Je serais surement dans le quoi demain matin, entre deux passages à la cuisine , préparation du nouvel an oblige!

    Citation Envoyé par marie.taquet Voir le message
    - dans ton premier code, icount=7, je suppose,
    icount est défini au dessus (partie que je n'ai pas affichée) dans ton code d'origine. Donc dans ce cas la oui il y a 7 cellules dans la plage nommée, mais ça fonctionne quelque soit la taille des plages du moment qu'elles sont symétriques.
    D'ailleurs ton prédécesseur (ou toi) à voulu rendre cette partie évolutive en regardant le nombre de cellule contenu dans la plage nommée mais ensuite le tableau qui contient l'ensemble a une dimension fixe.
    il serait préférable si le besoin de flexibilité est réel, de dimensionner le tableau en fonction de icount et jcount
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim LeTableau()
    redim LeTableau(1 to icount+jcount)
    Par exemple.

    Citation Envoyé par marie.taquet Voir le message
    - et dans ton deuxième code (celui avec les BU), icount devrait être égal à 3, c'est ça ?
    Idem, ça marche avec 3 et plus mais je n'ai pas vraiment modifié cette partie, j'attendais de voir ta réponse vis à vis de ma question concernant le comportement de ce code.

    Citation Envoyé par marie.taquet Voir le message
    Pour la deuxième partie de code, voici, en bon français, ce que c'est sensé faire :
    1. Vérifier si on n'a pas plus de 1 valeur dans les 6 cellules où on met une croix (Report_BU1et Report_BU2). C'est moi qui ait dû enlever ce test quand j'ai enlevé tout comptage des erreurs.
    2. S'il n'y a pas de doublon, le code doit trouver la valeur non-nulle dans les 6 cases, prendre le titre de la case juste à gauche "Offset(0;-1)" et l'enregistrer dans BU. (Ca, c'est du code de mon prédécesseur que j'ai laissé tel quel. C'est vrai qu'il est un peu tirer par les cheveux...)
    Dans ce cas la, il serait intéressant de ne travaillé qu'avec une seule plage nommée qui pointe les 6 cellules, une plage nommée n'est pas forcement la représentation de cellules adjacentes. Et le code peut en effet être réduit.

    Citation Envoyé par marie.taquet Voir le message
    Au fait, avec mes cellules qui contiennent plusieurs conditions pour le même format conditionnel, est-ce que je peux écrire un truc du genre... ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        For Each FormatCondition In ThisWorkbook.Sheets("FEuil1").Range("Report_RRR")
           If EvaluateFr(.Formula1) = True Then
                nError = nError + 1
           Else
                RRR = Report_RRR
           End If
        Next
    Oui, par contre, si tes cellules contiennent des MFC différentes, tu ne peux pas faire un traitement en lot, il faut traiter les cellules une par une
    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 FormCondition As FormatCondition
    Dim nError As Integer
    Dim RRR, Report_RRR
    Dim TheCell As Range
     
    For Each TheCell In ThisWorkbook.Sheets("Feuil1").Range("Report_RRR")
        For Each FormCondition In TheCell.FormatConditions
            If EvaluateFr(FormCondition.Formula1) = True Then
                 nError = nError + 1
            Else
                 RRR = Report_RRR
            End If
        Next
    Next
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  13. #13
    Membre habitué
    Femme Profil pro
    Acheteuse
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Acheteuse
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut
    Je ne comprends pas tout dans la fonction qui transforme une formule locale en formule en anglais :

    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
    Sub AlwaysEvaluate()
     
    Dim TheCell As Range
    Dim RetourEval As Variant
    Dim Formu1 As String
    Set temp = .Range("temp")
     
    For Each TheCell In Cells
        If TheCell.FormatConditions.Count > 0 Then
            temp.FormulaLocal = TheCell.FormatConditions(1).Formula1
            Formu1 = temp.Formula
            temp = ""
            If Application.Evaluate(Formu1) Then Debug.Print TheCell.Address
        End If
    Next
     
    End Sub
    Il ne faudrait pas définir les arguments entre parenthèse et définir la valeur à renvoyer ? A quoi sert RetourEval ? Et cette partie du code, qu'est-ce qu'elle fait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Application.Evaluate(Formu1) Then Debug.Print TheCell.Address
    Pour le reste, j'ai déjà viré tous les .Select et j'ai ajouté les Set SheetDero et Set SheetNego as Worksheet. Et je continue à intégrer tes suggestions.

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

Discussions similaires

  1. [AC-2003] Etrange erreur de format conditionnel de cellules
    Par thomas.m dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/04/2011, 17h41
  2. Excel - macro (format conditionnel - run-time error 1004)
    Par Chewi dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/09/2006, 19h18
  3. [Requete]Erreur opération Annulée - Format de Date
    Par Mariboo dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 08/08/2006, 08h56
  4. [ASE][12.0] Erreur via checkdb
    Par Lps dans le forum Sybase
    Réponses: 9
    Dernier message: 07/12/2005, 17h05
  5. [ASE][12.0] Erreur via module ASE
    Par Lps dans le forum Sybase
    Réponses: 9
    Dernier message: 07/12/2005, 11h09

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