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 07/12/2011, 16h41   #1
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 32
Points : 7
Points : 7
Par défaut Problème traduction formule excel en VBA

Bonjour,

J'ai absolument besoin de traduire en VBA une formule excel, cependant je ne sais pas faire cela..

Je vous explique pourquoi j'ai besoin de cette traduction :

J'ai une macro (comme vous pourrez le voir dans mon code) qui lance un inputbox, l'utilisateur choisit une valeur comprise entre 1 et 20, puis un 2ème inputbox lui demande de renseigner une date.
Selon la valeur du 1er inputbox, la date se stock à un endroit différent.

Ce que je cherche à faire, c'est, en plus de cela, que par rapport à l'endroit où va se renseigner la date, la cellule qui se trouve 2 colonnes plus loin (sur la même ligne) soit remplacée par la formule suivante (celle que je veux tradurie en VBA):

Code :
=SI(IV5="";"";SI(C5<>"Aerostructure Service";"";SI(OU(ET(G5="Flex";KK5<=MOIS.DECALER(IV5;'parameters'!$B$2));ET(G5="OSW-Capacity";KK5<=MOIS.DECALER(IV5;parameters'!$B$3)));"";SI(G5="Flex";MOIS.DECALER(IV5;parameters'!$B$2);SI(G5="OSW-Capacity";MOIS.DECALER(IV5;'parameters'!$B$3))))))
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
Option Base 1
Option Explicit
Private Sub Bouton4_Clic()
Dim liste(), DerLig As Long, l As Long, rev As Variant, mdir As Variant
With Worksheets("Workpackages Database & PP")
    DerLig = .Range("A" & .Rows.Count).End(xlUp).Row
    liste = .Range("A2:A200" & DerLig).Value
End With
rev = InputBox("Enter 1 for REV1, 2 for REV2, etc.", "REV Date Modification")
If rev = "" Or Not IsNumeric(rev) Then
    MsgBox "Canceled, Please Enter a number"
    Exit Sub
End If
If rev < 1 Or rev > 20 Then
    MsgBox "wrong rev number"
    Exit Sub
End If
rev = CInt(rev)
mdir = InputBox("SELECT THE DATE: (dd/mm/yy)", "REV x")
If Not IsDate(mdir) Then
    MsgBox "Canceled"
    Exit Sub
End If
For l = LBound(liste) To UBound(liste)
    Select Case rev
    Case 1
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("IV" & l + 1).Value = CDate(mdir)
    Case 2
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("IX" & l + 1).Value = CDate(mdir)
    Case 3
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("IZ" & l + 1).Value = CDate(mdir)
    Case 4
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JB" & l + 1).Value = CDate(mdir)
    Case 5
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JD" & l + 1).Value = CDate(mdir)
    Case 6
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JF" & l + 1).Value = CDate(mdir)
    Case 7
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JH" & l + 1).Value = CDate(mdir)
    Case 8
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JJ" & l + 1).Value = CDate(mdir)
    Case 9
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JL" & l + 1).Value = CDate(mdir)
    Case 10
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JN" & l + 1).Value = CDate(mdir)
    Case 11
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JP" & l + 1).Value = CDate(mdir)
    Case 12
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JR" & l + 1).Value = CDate(mdir)
    Case 13
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JT" & l + 1).Value = CDate(mdir)
    Case 14
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JV" & l + 1).Value = CDate(mdir)
    Case 15
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JX" & l + 1).Value = CDate(mdir)
    Case 16
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("JZ" & l + 1).Value = CDate(mdir)
    Case 17
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("KB" & l + 1).Value = CDate(mdir)
    Case 18
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("KD" & l + 1).Value = CDate(mdir)
    Case 19
        If Range("A2") = liste(l, 1) Then Sheets("Workpackages Database & PP").Range("KH" & l + 1).Value = CDate(mdir)
End Select
Next
 
End Sub
Merci!

Cordialement,

Adrien
laduche31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 18h47   #2
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

Essai déjà une simplification de ton code

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
Private Sub Bouton4_Clic()
Dim liste(), DerLig As Long, l As Long, rev As Variant, mdir As Variant
 
With Worksheets("Workpackages Database & PP")
    DerLig = .Range("A" & .Rows.Count).End(xlUp).Row
    'Attention la ligne suivnate est faausse je pense
    'liste = .Range("A2:A200" & DerLig).Value
    liste = .Range("A2:A" & DerLig).Value
End With
 
rev = InputBox("Enter 1 for REV1, 2 for REV2, etc.", "REV Date Modification")
If rev = "" Or Not IsNumeric(rev) Then
    MsgBox "Canceled, Please Enter a number"
    Exit Sub
End If
 
If rev < 1 Or rev > 20 Then
    MsgBox "wrong rev number"
    Exit Sub
End If
 
rev = CInt(rev)
 
mdir = InputBox("SELECT THE DATE: (dd/mm/yy)", "REV x")
 
If Not IsDate(mdir) Then
    MsgBox "Canceled"
    Exit Sub
End If
 
 
For l = LBound(liste) To UBound(liste)
    If Range("A2") = liste(l, 1) Then
        With Sheets("Workpackages Database & PP").Cells(l + 1, "IT").Offset(0, 2 * rev)
            'On pointe la colonne IT et on se décale en fonction de la valeur de rev
            .Value = CDate(mdir)
            'On place la formule 2 colonne plus loin
            '.offset(0,2).formula =
        End With
    End If
Next
 
End Sub
Pour ta formule essai déjà en utilisant l'enregistreur de macro, il te donnera la formule comme elle doit être utilisé, ensuite il faudra nous dire au cas ou tu n'arriverais pas à la modifier toi même, quelles parties doivent être variable en fonction de la ligne ou la formule est inscrite.

++
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 08/12/2011, 08h57   #3
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 32
Points : 7
Points : 7
Bonjour!

MErci pour la simplification de code c'est en effet beaucoup plus pratique

En ce qui concerne l'enregistreur de macro, oui je vais essayer ça et je reviendrais vers vous!

Merci!
laduche31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 09h16   #4
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 32
Points : 7
Points : 7
Bonjour!

Le hic est que la fonction MOIS.DECALER est une fonction de l'utilitaire d'analyse, VBA ne la reconnaît pas et renvoie une erreur... Voici la formule:

Code :
=IF(RC[-2]="""","""",IF(OR(AND(RC7=""Flex"",RC[39]<=MOIS.DECALER(RC[-2],parameters!R2C2)),AND(RC7=""OSW-Capacity"",RC[39]<=MOIS.DECALER(RC[-2],parameters!R3C2))),"""",SI(RC7=""Flex"",MOIS.DECALER(RC[-2],parameters!R2C2),SI(RC7=""OSW-Capacity"",MOIS.DECALER(RC[-2],parameters!R3C2)))))
Comment faire pour utiliser une autre fonction qui fasse la même chose ou..?

Merci !

Adrien
laduche31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 10h16   #5
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 32
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 32
Points : 7
Points : 7
Bonjour!

La solution a été trouvé, voici le code qui résoud mon problème, pour aider d'autres personnes qui rencontreraient le même problème:

Code :
1
2
3
4
5
6
 
With Intersect(filtre, zone.Areas(i))
  .FormulaR1C1 = F
  .Replace "MOIS.DECALER", "µµ", LookAt:=xlPart 'pour revalider les cellules
  .Replace "µµ", "MOIS.DECALER"
End With
Merci pour votre aide et à bientôt

Adrien
laduche31 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 18h30.


 
 
 
 
Partenaires

Hébergement Web