Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/12/2011, 12h17   #1
Invité de passage
 
Femme Mary In The Sky
Acheteuse
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations personnelles :
Nom : Femme Mary In The Sky
Localisation : Belgique

Informations professionnelles :
Activité : Acheteuse
Secteur : Industrie

Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 3
Points : 3
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 :
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 :
1
2
 
PrixCurrency.FormatConditions(1).Formula1
Quelqu'un pourrait-il m'aider ?

D'avance merci !
Marie
marie.taquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 13h29   #2
Membre Expert
 
Avatar de Fvandermeulen
 
Frédéric Vandermeulen
Inscription : juillet 2007
Messages : 1 730
Détails du profil
Informations personnelles :
Nom : Frédéric Vandermeulen
Âge : 36
Localisation : Belgique

Informations forums :
Inscription : juillet 2007
Messages : 1 730
Points : 2 131
Points : 2 131
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 :
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.
__________________
N'oubliez pas le si votre problème est solutionné.
Fvandermeulen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 15h42   #3
Invité de passage
 
Femme Mary In The Sky
Acheteuse
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations personnelles :
Nom : Femme Mary In The Sky
Localisation : Belgique

Informations professionnelles :
Activité : Acheteuse
Secteur : Industrie

Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 3
Points : 3
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 :
nerror = Range("Report_PrixCurrency").FormatConditions.Count
Le test que j'utilisais "fonctionne" :
Code :
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 :
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 ?
marie.taquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 16h11   #4
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
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 :
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 16h59   #5
Invité de passage
 
Femme Mary In The Sky
Acheteuse
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations personnelles :
Nom : Femme Mary In The Sky
Localisation : Belgique

Informations professionnelles :
Activité : Acheteuse
Secteur : Industrie

Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 3
Points : 3
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
Type de fichier : zip Fichiers_Marie.zip (193,1 Ko, 3 affichages)
marie.taquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 18h14   #6
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
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 :
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 :
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 :
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 :
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 :
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 :
=SI(Report_DaNr="25xxxxxx";VRAI();FAUX())
Code :
=Report_DaNr="25xxxxxx"
suffit.
Voir même
Code :
=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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 19h30   #7
Invité de passage
 
Femme Mary In The Sky
Acheteuse
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations personnelles :
Nom : Femme Mary In The Sky
Localisation : Belgique

Informations professionnelles :
Activité : Acheteuse
Secteur : Industrie

Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 3
Points : 3
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 ?
marie.taquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 20h22   #8
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Citation:
Eh bien, j'aurai appris des choses aujourd'hui. Merci beaucoup Monsieur Qwaz
Pas de soucis avec plaisir.

Citation:
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 :
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....)

Citation:
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

Citation:
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.

Citation:
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/12/2011, 20h30   #9
Invité de passage
 
Femme Mary In The Sky
Acheteuse
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations personnelles :
Nom : Femme Mary In The Sky
Localisation : Belgique

Informations professionnelles :
Activité : Acheteuse
Secteur : Industrie

Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 3
Points : 3
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
marie.taquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 20h37   #10
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

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

Pour ton autre morceau de code, voila un simplification possible
Code :
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 :
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 12h24   #11
Invité de passage
 
Femme Mary In The Sky
Acheteuse
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations personnelles :
Nom : Femme Mary In The Sky
Localisation : Belgique

Informations professionnelles :
Activité : Acheteuse
Secteur : Industrie

Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 3
Points : 3
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 :
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
marie.taquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 21h33   #12
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
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 :
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 :
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 :
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
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 09h45   #13
Invité de passage
 
Femme Mary In The Sky
Acheteuse
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations personnelles :
Nom : Femme Mary In The Sky
Localisation : Belgique

Informations professionnelles :
Activité : Acheteuse
Secteur : Industrie

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

Code :
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 :
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.
marie.taquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 10h25   #14
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

Tu as repris un code d'essai, qui permettait juste de mettre en évidence l'utilisation du evaluateFR, Debug.print affiche juste l'adresse des cellules ayant un MFC validé, l'affichage se fait dans la fenêtre Execution de l'environnement VBA.
RetourEval ne sert a rien ici, j'avais utiliser cette variable de type variant pour regardé la valeur retourné par evaluate sans que le code plante si la fonction renvoyé une erreur (le type variant peut contenir n'importe qu'elle type, y les erreur)

Regarde mon message n°9, il y a la fonction EvaluateFr() en état d'utilisation.

N'hésite pas à poster ton code une fois les corrections effectuées.

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 14h19   #15
Invité de passage
 
Femme Mary In The Sky
Acheteuse
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations personnelles :
Nom : Femme Mary In The Sky
Localisation : Belgique

Informations professionnelles :
Activité : Acheteuse
Secteur : Industrie

Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 3
Points : 3
Bon, j'ai fait l'ensemble des modifications que tu m'as suggérées et il me semble voir le bout du tunnel...

J'ai créé la fonction suivante pour évaluer la formule associée à un Format Conditionnel quelle que soit la langue de l'utilisateur :
Code :
1
2
3
4
5
6
7
8
9
Function AlwaysEvaluate(FormuleUS As String) As Boolean
    With ThisWorkbook.ActiveSheet
        Application.ScreenUpdating = False
        .[B2].FormulaLocal = FormuleUS
        AlwaysEvaluate = Evaluate(.[B2].Formula)
        .[B2] = ""
        Application.ScreenUpdating = True
    End With
End Function
Ensuite, je teste chacune des conditions associée à mes cellules de la manière suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim CondFormat As FormatCondition
    Dim nerror As Integer
    Dim theCell As Range
    nerror = 0
 
    With SheetDerog
 
    Set Report_Date = .Range("Report_Date")
    DateC = Report_Date
    For Each theCell In Report_Date
        For Each CondFormat In theCell.FormatConditions
            If AlwaysEvaluate(CondFormat.Formula1) Then
                nerror = nerror + 1
            End If
        Next
    Next
 
    End With
Et ça fonctionne !

Sauf pour deux cellules , et je ne comprends pas pourquoi :
Code :
1
2
3
4
5
6
7
8
9
Set Report_Archivage = .Range("Report_Archivage")
    Archivage = StrConv(Report_Archivage, vbProperCase)
    For Each theCell In Report_Archivage
        For Each CondFormat In theCell.FormatConditions
            If AlwaysEvaluate(CondFormat.Formula1) Then
                nerror = nerror + 1
            End If
        Next
    Next
Le debugger trouve l'Erreur 13: Type mismatch dans cette partie de la fonction AlwaysEvaluate :
Code :
AlwaysEvaluate = Evaluate(.[B2].Formula)
Idem pour cette autre partie du code :
Code :
1
2
3
4
5
6
7
8
9
Set Report_NbOfferInLine = .Range("Report_NbOfferInLine")
NbOfferInLine = Report_NbOfferInLine
For Each theCell In Report_NbOfferInLine
        For Each CondFormat In theCell.FormatConditions
            If AlwaysEvaluate(CondFormat.Formula1) Then
                nerror = nerror + 1
            End If
        Next
Next
Le debugger trouve l'Erreur 9: Subscript out of range dans cette phrase :
Code :
If AlwaysEvaluate(CondFormat.Formula1) Then
Dans cette cellule, j'ai une même formule de MFC s'applique à plusieurs cellules, dont Report_NbOfferInLine. Est-ce que ça pourrait venir de là ?

J'ai le même cas de figure avec Report_PurchaserGlobal et Report_Negotiator, pour lesquels la même formule de MFC s'applique. J'ai essayé d'exécuter AlwaysEvaluate() sur l'union de ces deux Ranges, mais j'obtiens le même message d'erreur

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
    Set Report_PurchaserGlobal = .Range("Report_PurchaserGlobal")
    PurchaserGlobal = IIf(Report_PoNr = "6500123456", "", Report_PurchaserGlobal)
 
    Set Report_Negotiator = .Range("Report_Negotiator")
    Negotiator = IIf(Report_PoNr = "6500123456", "", Report_Negotiator)
 
    Set Consistancy2 = Application.Union(.Range("Report_Negotiator"), .Range("Report_PurchaserGlobal"))
    For Each theCell In Consistancy2
        For Each CondFormat In theCell.FormatConditions
            If AlwaysEvaluate(CondFormat.Formula1) Then
                nerror = nerror + 1
            End If
        Next
    Next
marie.taquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 14h31   #16
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je prends le truc en cours et je n'ai pas tout regardé en détail, donc veuillez m'excusez si je suis à coté de la plaque.
Mais il y a un question de conception qui me chagrine un peu. A mon sens ce serait plus propre de recompter les cellules qui correspondent aux conditions que tu as mis dans tes MFC plutôt que de tester ce que donne la MFC. Surtout étant donné les problème de langue que ça suggère.
Tu pourrais même créer une fonction de vérification que tu utilises à la fois dans ta MFC et dans ton comptage.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 16h10   #17
Invité de passage
 
Femme Mary In The Sky
Acheteuse
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations personnelles :
Nom : Femme Mary In The Sky
Localisation : Belgique

Informations professionnelles :
Activité : Acheteuse
Secteur : Industrie

Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 3
Points : 3
Bonjour ZèbreLoup,
Tu veux dire écrire la même condition dans la macro et dans la MFC ?
marie.taquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 16h19   #18
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Soit écrire la même condition dans la macro et la MFC
Soit écrire une fonction booléenne qui vérifie les conditions et l'utiliser dans la macro et la MFC

Je manque sans doute d'ouverture d'esprit sur le coup, mais c'est vrai que pour moi, la MFC sert à faire de la "mise en forme", c'est tout. Et je n'aime pas trop passer par de la mise en forme pour tester des choses.
Parce que sinon, pour ton problème, si par exemple ta MFC mets le fond de ta cellules en rouge, il aurait aussi suffit de compter le nombre de cellules avec un fond rouge. C'est simple, mais pour moi, source d'erreurs potentielles.

Tu peux partager ou non mon point de vue, je ne m'offusquerais pas !
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 16h28   #19
Invité de passage
 
Femme Mary In The Sky
Acheteuse
Inscription : décembre 2011
Messages : 12
Détails du profil
Informations personnelles :
Nom : Femme Mary In The Sky
Localisation : Belgique

Informations professionnelles :
Activité : Acheteuse
Secteur : Industrie

Informations forums :
Inscription : décembre 2011
Messages : 12
Points : 3
Points : 3
En fait, ce qui se passe, c'est que j'ai une 30aine d'informations à récupérer par ci par là dans mon fichier Excel et qu'à chacune de ces infos, il peut y avoir de 2 à 5 conditions de MFC.

Au départ, les conditions étaient dans la macro et il n'y avait pas de mise en forme conditionnelle, mais les erreurs reconnues étaient bien moins nombreuses et il fallait attendre d'avoir exécuté la macro pour les reconnaître.

Pour ce qui est de reconnaître la mise en forme (le fond de la cellule, par exemple), j'ai essayé. Mais Excel ne semblait pas faire la différence entre les cellules où la MFC était appliquée et les autres.

Ce que m'a proposé Qwaz marche plutôt bien jusqu'à présent.

Je vais remettre le code en ligne pour que vous le voyez dans son intégralité.
Fichiers attachés
Type de fichier : zip fichier_Marie_corrigé.zip (70,4 Ko, 2 affichages)
marie.taquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 16h54   #20
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Ecoute, si ça marche, c'est l'essentiel. Désolé d'avoir voulu mettre mon grain de sel
En plus je ne peux même pas regarder si mon approche pouvait fonctionner car je suis sous 2003...

Bon courage pour la suite
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h09.


 
 
 
 
Partenaires

Hébergement Web