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 02/01/2012, 16h55   #1
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 23
Points : 5
Points : 5
Par défaut Probème avec strings.replace

Bonjours je suis actuellement étudiant en mécanique et production et je suis en train de faire un petit module Excel pour me faciliter la vie. Malheureusement je débute tout juste et certaines fonctions me donnent du file retordre...

En gros pour ceux qui connaissent les ajustements arbre alésage, je fais une macro qui automatise le système. C'est plus rapide et plus sûr que de se référer à 3 tableaux en même temps ^^

Donc voila dans une colonne de mon tableau se trouve dans toute les cellules une valeur plus delta (ex: -1+D), et je souhaite remplacer le "+D" par rien ("") pour ensuite utilisé la valeur (ici -1) dans un calcul. Je suis alors tombé sur Strings.replace qui apparemment résout mon problème mais ça marche toujours pas et je viens de passer quelque heures sur la question. Voici la partie du code concerné:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
If col = 18 Or col = 20 Or col = 23 Then
 
    Dim celmod As String
        celmod = Strings.Replace(Worksheets("Alesages").Cells(ligne, col), "+D", "")
 
    Dim celval As Double
        celval = Val(celmod)
        ES = celval + Worksheets("Alesages").Cells(ligne, colq)
 
End If
le but étant de remplacer le "+D" par rien pour ensuite ajouter la valeur de la cellule en colonne "col" a la valeur de la cellule en colonne "colq".

Voila j'espère que vous pourez m'aider et je vous en remercie d'avance. Désolé pour le manque de clarté..

Cordialement
Paro. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 17h07   #2
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 774
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 774
Points : 2 094
Points : 2 094
Bonjour,

Peut être comme ceci ? (pas testé) :
Code :
1
2
3
4
5
6
7
8
9
10
 
If col = 18 Or col = 20 Or col = 23 Then
 
    With Worksheets("Alesages")
 
        ES = CDbl(Replace(.Cells(ligne, col), "+D", "") + .Cells(ligne, colq))
 
    End With
 
End If
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/01/2012, 17h07   #3
Membre chevronné
 
Avatar de defluc
 
Architecte
Inscription : mai 2002
Messages : 1 057
Détails du profil
Informations personnelles :
Âge : 62

Informations professionnelles :
Activité : Architecte

Informations forums :
Inscription : mai 2002
Messages : 1 057
Points : 745
Points : 745
Il faudrait que tu nous montres le contenu des cellules.
En pas à pas, que donne le contenu de ta variable après StringReplace ?
Il peut y avoir des problèmes liés au format des cellules (numérique, texte, scientifique)?

Pour la propreté de la programmation, il vaut mieux placer les déclarations en début de programme et indenter les instructions.

Bonne année deux mille douce
defluc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 17h07   #4
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
Bonjour,

Peux-tu préciser où se situe ton problème : ça ne se lance pas ? ça se lance mais il y a un bug ? pas de bug mais ça ne fait pas ce que tu veux ?

Et n'oublie pas quand tu écris du code d'utiliser la balise (en appuyant sur le # dans l'éditeur)
__________________
« 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 10
Vieux 03/01/2012, 07h52   #5
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 23
Points : 5
Points : 5
Merci pour vos réponse, j'ai tester sa ne marche pas non plus donc voici le worksheets concerné:



en rouge les colone 18,20 et 23.
en vert les valeur de Delta (D).

et voici le worksheet ou j'ai les donné entré et sortie:



En rouge ce sont les donné d'entré, celle qui nous concerne sont les 3 première donnés.
En vert clair j'ai la serie qui correspond a "col"
la recherce de la ligne se fait automatiquement avec le diamètre.
En Bleu j'ai l'endoit ou s'applique l'erreur.
En vert l'endroit ou s'applique ma fonction, il s'agit du EI et il se calcul a partir du ES du code du mon premier poste.

l'erreur que j'obtient est une erreur #VALEUR, toute les series marche sauf les serie K, M et N.

Merci encore pour votre aide!

[hide]
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
Private Sub result_Click()
 
diam12.Text = diam1.Text & " " & class1.Text & " " & qualite1.Text
 
diam13.Value = diam1.Text & " " & class2.Text & " " & qualite2.Text
 
Dim col1, col2, ligne1 As Integer
 
col1 = 2 + Val(qualite1.Text)
col2 = 2 + Val(qualite2.Text)
ligne1 = 5
 
While Val(diam1.Text) < Worksheets("IT").Cells(ligne1, 1) Or Val(diam1.Text) > Worksheets("IT").Cells(ligne1, 2)
ligne1 = ligne1 + 1
Wend
 
IT1.Value = Worksheets("IT").Cells(ligne1, col1)
IT2.Value = Worksheets("IT").Cells(ligne1, col2)
 
'ecarts alesage'
 
Dim EI, ES As Double
Dim col, colq, ligne As Byte
 
'ecart inferieur'
 
col = 3
ligne = 6
 
While Val(diam1.Text) < Worksheets("alesages").Cells(ligne, 1) Or Val(diam1.Text) > Worksheets("alesages").Cells(ligne, 2)
ligne = ligne + 1
Wend
 
While class1.Text <> Worksheets("Alesages").Cells(4, col)
col = col + 1
Wend
 
EI = Worksheets("Alesages").Cells(ligne, col)
 
If col = 14 Then
EI = -(Val(IT1.Text) / 2)
End If
 
'ecart superieur'
 
If Val(qualite1.Text) = 3 Then
colq = 38
End If
 
If Val(qualite1.Text) = 4 Then
colq = 39
End If
 
If Val(qualite1.Text) = 5 Then
colq = 40
End If
 
If Val(qualite1.Text) = 6 Then
colq = 41
End If
 
If Val(qualite1.Text) = 7 Then
colq = 42
End If
 
If Val(qualite1.Text) = 8 Then
colq = 43
End If
 
If col >= 15 Then
 
col = 15
ligne = 6
 
While class1.Text <> Worksheets("alesages").Cells(4, col)
col = col + 1
Wend
 
While Val(diam1.Text) < Worksheets("alesages").Cells(ligne, 1) Or Val(diam1.Text) > Worksheets("alesages").Cells(ligne, 2)
ligne = ligne + 1
Wend
 
If col = 15 Then
col = 15 - 6 + Val(qualite1.Text)
End If
 
ES = Worksheets("Alesages").Cells(ligne, col)
 
If col >= 26 And Val(qualite1.Text) <= 7 Then
ES = (Worksheets("Alesages").Cells(ligne, col) + Worksheets("Alesages").Cells(ligne, colq))
End If
 
EI = ES - Val(IT1.Text)
 
End If
 
ei1.Value = EI
 
'ecarts arbre'
 
Dim ESa, EIa As Double
Dim cola, lignea As Integer
 
'ecart superieur'
 
cola = 3
lignea = 6
 
While class2.Text <> Worksheets("Arbres").Cells(4, cola)
cola = cola + 1
Wend
 
While Val(diam1.Text) < Worksheets("Arbres").Cells(lignea, 1) Or Val(diam1.Text) > Worksheets("arbres").Cells(lignea, 2)
lignea = lignea + 1
Wend
 
ESa = Worksheets("Arbres").Cells(lignea, cola)
 
If cola = 14 Then
ESa = Val(IT2.Text) / 2
End If
 
'ecart inferieur'
 
If cola >= 15 Then
 
cola = 15
lignea = 6
 
While class2.Text <> Worksheets("Arbres").Cells(4, cola)
cola = cola + 1
Wend
 
While Val(diam1.Text) < Worksheets("Arbres").Cells(lignea, 1) Or Val(diam1.Text) > Worksheets("arbres").Cells(lignea, 2)
lignea = lignea + 1
Wend
 
If cola = 15 And Val(qualite2.Text) <> 5 Then
cola = 15 - 6 + Val(qualite2.Text)
End If
 
If cola = 15 And Val(qualite2.Text) = 5 Then
cola = 15
End If
 
If cola = 19 And Val(qualite2.Text) <= 3 Then
cola = cola + 1
End If
 
EIa = Worksheets("Arbres").Cells(lignea, cola)
ESa = EIa + Val(IT2.Text)
 
End If
 
es2.Value = ESa
 
If Val(diam1.Text) > 1 Then
 
ei2.Value = Val(es2.Text) - Val(IT2.Text)
es1.Value = Val(ei1.Text) + Val(IT1.Text)
 
End If
 
jma.Value = (Val(es1.Text) - Val(ei2.Text)) / 1000
jmi.Value = (Val(es2.Text) - Val(ei1.Text)) / 1000
 
End Sub
[/hide]
Paro. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 09h58   #6
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
Pour mieux comprendre ce qui se passe, il faudrait que tu nous dises ce qu'il y a dans Worksheets("Alesages").Cells(ligne, col) grace au débuggeur.
Au fait, c'est normal le colq ou c'est une faute de frappe ?

EDIT : pardon je n'avais pas relu ton premier post en entier.

Si tu as un #VALEUR, c'est que tu as mis une formule dans la cellule. Il faudrait je pense ton code complet pour mieux t'aider.
__________________
« 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 10
Vieux 04/01/2012, 13h15   #7
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 23
Points : 5
Points : 5
Message précédant éditer avec le code

PS: J'ai converti toute la macro en UserForm pour donner quelque chose de sympa mais l'erreur se répète toujours avec K,M et N. C'est le code que j'ai fourni, il est plus propre
Paro. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 14h11   #8
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 ne vois plus de Replace dans ton nouveau code.

Et tu devrais utiliser Option Explicit et bien typer toutes tes variables, comme ça au moins tu auras une erreur (si tu n'en as pas déjà) si à un moment il essaie de mettre du texte dans un numérique.
__________________
« 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 10
Vieux 04/01/2012, 14h26   #9
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 23
Points : 5
Points : 5
Oui, pardon.

Code :
1
2
3
4
5
6
7
8
9
If col = 18 Or col = 20 Or col = 23 Then
 
    With Worksheets("Alesages")
 
        ES = CDbl(Replace(.Cells(ligne, col), "+D", "") + .Cells(ligne, colq))
 
    End With
 
End If
C'est comme si le remplacement marchai mais que le chiffre restant et toujours considérai comme tu texte, je pense que c'est pour ca que ca plante mais je n'est aucune idée et pas assez de savoir pour résoudre ca.
Paro. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 14h29   #10
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
Essaie de faire ton CDbl seulement sur le Replace
__________________
« 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 10
Vieux 04/01/2012, 14h38   #11
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 23
Points : 5
Points : 5
Toujours #VALEUR, il y a pas un moyen pour changer le type de la cellule une fois le remplacement fait?

EDIT: Et qu'est ce que option explicit?
Paro. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 15h35   #12
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
Option Explicit t'oblige à déclarer toutes tes variables, sinon, il y a erreur à la compilation. Ça peut paraître contraignant mais ça évite des erreurs liées au fautes de frappe par exemple.

Tu pourrais mettre ton fichier ou pas ? Ça me parait plus simple, parce que là, je ne vois pas d'où ça peut venir.
__________________
« 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 10
Vieux 04/01/2012, 15h44   #13
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 23
Points : 5
Points : 5
Je l'ai ajouter en fichier joint.
Merci pour le temps que tu m'accorde.

Edit: apparemment le fichier avec userform est non valide donc je met l'ancien
Fichiers attachés
Type de fichier : xls Ajustement_2.xls (99,0 Ko, 4 affichages)
Paro. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 16h10   #14
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
Ton problème était simplement que tu n'avais mis le Replace qu'à un endroit alors qu'il y a 3 endroits où il devait être. J'ai modifié ton code pour que ça renvoie une valeur.
Par contre, je n'ai pas essayé de tout comprendre en détail, mais ça m'étonnerait que ton code fasse ce que tu veux, tu cherches 2 fois la colonnes, il y a des tonnes de If qui ne sont pas exclusifs, du coup, la moitié ne servent à rien. As-tu écris sur un papier en français ce que tu voulais faire avant de rédiger 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
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
Function ALESAGE_EI(diametre As Double, classe As String, qualite As Byte) As Double
 
'Création des élements'
 
    Dim ES, EI As Double
    Dim col, ligne, colq As Integer
 
'Définition de EI'
 
    'Classe de A à H'
 
        col = 3
        ligne = 6
 
        While classe <> Worksheets("Alesages").Cells(4, col)
            col = col + 1
        Wend
 
        While diametre < Worksheets("Alesages").Cells(ligne, 1) Or diametre > Worksheets("Alesages").Cells(ligne, 2)
            ligne = ligne + 1
        Wend
 
        EI = CDbl(Replace(Worksheets("Alesages").Cells(ligne, col), "+D", ""))
 
    'Classe de J a ZC'
 
 
        'Valeur de Delta'
 
            If qualite = 3 Then
            colq = 38
            End If
 
            If qualite = 4 Then
            colq = 39
            End If
 
            If qualite = 5 Then
            colq = 40
            End If
 
            If qualite = 6 Then
            colq = 41
            End If
 
            If qualite = 7 Then
            colq = 42
            End If
 
            If qualite = 8 Then
            colq = 43
            End If
 
 
        If col >= 15 Then
 
            col = 15
            ligne = 6
 
            While classe <> Worksheets("Alesages").Cells(4, col)
                col = col + 1
            Wend
 
            While diametre < Worksheets("Alesages").Cells(ligne, 1) Or diametre > Worksheets("Alesages").Cells(ligne, 2)
                ligne = ligne + 1
            Wend
 
            If col = 15 Then
                col = 15 - 6 + qualite
            End If
 
            ES = CDbl(Replace(Worksheets("Alesages").Cells(ligne, col), "+D", ""))
 
            If col = 18 And qualite > 8 Then
                col = col + 1
            End If
 
             If col = 20 And qualite > 8 Then
                col = col + 1
            End If
 
             If col = 23 And qualite > 8 Then
                col = col + 1
            End If
 
If col = 18 Or col = 20 Or col = 23 Then
 
    With Worksheets("Alesages")
 
        ES = CDbl(Replace(.Cells(ligne, col), "+D", "")) + .Cells(ligne, colq)
 
    End With
 
End If
 
 
            If col >= 26 And qualite <= 7 Then
                ES = Worksheets("Alesages").Cells(ligne, col) + Worksheets("Alesages").Cells(ligne, colq)
            End If
 
            EI = ES - Worksheets("Ajustement").Cells(13, 9)
 
        End If
 
'Classe js'
 
        If col = 14 Then
            EI = -Val(Worksheets("Ajustement").Cells(13, 9)) / 2
        End If
 
'Résultat appliqué a la fonction'
 
    ALESAGE_EI = EI / 1000
 
End Function
__________________
« 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 30
Vieux 04/01/2012, 16h49   #15
Membre chevronné
 
Avatar de defluc
 
Architecte
Inscription : mai 2002
Messages : 1 057
Détails du profil
Informations personnelles :
Âge : 62

Informations professionnelles :
Activité : Architecte

Informations forums :
Inscription : mai 2002
Messages : 1 057
Points : 745
Points : 745
Je commencerais par revoir les déclarations pour que toutes les variables soient définies par le type voulu.
Code :
1
2
    Dim ES As Double, EI As Double
    Dim col As Integer, ligne As Integer, colq As Integer
Ensuite, je remplacerais
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
            If qualite = 3 Then
            colq = 38
            End If
 
            If qualite = 4 Then
            colq = 39
            End If
 
            If qualite = 5 Then
            colq = 40
            End If
 
            If qualite = 6 Then
            colq = 41
            End If
 
            If qualite = 7 Then
            colq = 42
            End If
 
            If qualite = 8 Then
            colq = 43
            End If
par
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        Select Case qualite
          Case 3
            colq = 38
          Case 4
            colq = 39
          Case Is = 5
            colq = 40
          Case 6
            colq = 41
          Case 7
            colq = 42
          Case Is = 8
            colq = 43
        End Select
en ajoutant un Case else.
defluc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2012, 17h09   #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 pense qu'il faut même revoir plus en profondeur le code. Si tu nous expliques ce que tu veux calculer et comment ça se calcule (j'avoue que mes connaissances en mécaniques sont un peu loin), on pourra mieux t'aider.
__________________
« 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 10
Vieux 04/01/2012, 18h14   #17
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 23
Points : 5
Points : 5
Pour faire court:

Un alésage correspond a un trou d'un certain diamètre dans une pièce, un arbre et un cylindre qui rentre dedans.
Au niveau mécanique d'usinage on a définie (H, JS, K, zc...) des classes avec lesquelles on obtient des diamètre compris entre deux valeurs extrêmement précise (écart supérieur, écart inférieur) (quand une usine un alésage ou arbre le but étant de d'obtenir un diamètre compris entre les deux valeur) selon des qualités (1 étant un qualité impossible a obtenir, 7 une qualité moyenne).
Tout ceci dans le but de prévoir le jeu maximum et le jeu minimum de l'arbre dans l'alésage.
Le jeu peu aussi bien être voulu négatif pour obtenir un assemblage serré que positif pour avoir un jeu possible.

Des tableaux on était définie, IT, Alésage, Arbre. Mes feuilles correspondent à ces tableaux.

La valeur de l'IT, intervalle de tolérance et défini en fonction du diamètre et de la qualité. Une fois l'IT obtenu on va voir la tableau des alésage et selon la classe on obtient, en fonction du diamètre de la classe et de plusieurs critère, soit l'écart supérieur soit l'écart inférieur. (Un écart supérieur tel que "-0.05" veut dire que le diamètre maxi à obtenir est "diamètre+écart supérieur. Si diamètre = 30 mm >>>> diamètre maxi=29.95). Et de même pour les arbres.

J'espère avoir été clair je sais que sait pas facile de comprend juste en lisant un petit paragraphe (de plus très mal écrit ^^).

Tout les If correspond au conditions étant débutant en VB je ne connai que ça. Que veut dire If exclusif?

A part ça le programme marche, j'ai vérifié avec des valeurs calculées à la main, je te remercie Zebreloup!
Pour faire plus propre j'attend donc vos conseil et je penser remplacer la "replace" par une "strings.instr" et une "strings.left", la .Instr chercherai le "+D" et la .Left permettrai de ne pas prendre en compte les deux dernier caractère pour le calcul (ici +D).

Pour l'histoire des deux colonnes, "col" correspond a la colonne ou se trouve la valeur finale (ES ou EI), et "colq" correspond a la colonne ou se trouve la valeur du delta (D) qu'il faut ajouter au résultat dans le cas de classe K M et N.

Désolé pour ce calvaire...

EDIT:
@defluc >> Je ne connais pas "case", il me semble, mais je me trompe surement, que ca ne pourrai marcher mais faudrai que tu m'explique un peu plus.
Sinon le fait de de dim une valeur a la fois change quoi?
Paro. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 18h47   #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
Quand je parle des If exclusifs, c'est la structure
Code :
If ... ElseIf ... ElseIf ... Else ... End
Par exemple, tu calcules une première fois EI quelle que soit la colonne. Ensuite si on est en ES, tu l'écrases et donc ton premier calcul ne sert à rien. De même pour la classe js.
Ensuite, j'ai l'impression que tu ne gères pas les degrés de tolérance pour les ES, tu prends toujours la première colonne.
Enfin, tu ne gères pas le cas où l'on rentre un paramètre incorrect.

Pour ce qui est des degrés de tolérance pour les ES, le problème c'est qu'il va falloir faire du cas par cas si tu ne veux pas modifier la structure de ton onglet Alesage. Tu pourras utiliser par exemple Select Case
__________________
« 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 10
Vieux 05/01/2012, 07h28   #19
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 23
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 23
Points : 5
Points : 5
Bon voici se que j'ai fait, j'ai surtout essayé d'ordonner et de simplifier le code pour le rendre le plus compréhensible possible. J'ai également remplacé les If par des If exclusif et utilisé Select case (j'ai juste copié le code de defluc).

Enfin voila tout marche, c'est propre et c'est bien mieux!

Merci encore pour votre aide.

Si vous voyez d'autre chose qui pourrai être modifier dites moi, vu mes faibles connaissances il y en a surement ^^

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
Option Explicit
Private Sub result_Click()
 
    diam12.Text = diam1.Text & " " & class1.Text & " " & qualite1.Text
 
    diam13.Text = diam1.Text & " " & class2.Text & " " & qualite2.Text
 
        Dim col1, col2, ligne1, ITal, ITab, D, Q1, Q2 As Integer
 
    D = Val(diam1.Text)
    Q1 = Val(qualite1.Text)
    Q2 = Val(qualite2.Text)
 
        With Worksheets("IT")
 
            col1 = 2 + Val(qualite1.Text)
            col2 = 2 + Val(qualite2.Text)
            ligne1 = 5
 
                While D < .Cells(ligne1, 1) Or D > .Cells(ligne1, 2)
                    ligne1 = ligne1 + 1
                Wend
 
            IT1.Value = .Cells(ligne1, col1)
            IT2.Value = .Cells(ligne1, col2)
            ITal = Val(IT1.Text)
            ITab = Val(IT2.Text)
 
        End With
 
    'ecarts alesage'
 
        Dim EIal, ESal As Double
        Dim colal, cold, ligneal As Byte
        Dim C1 As String
 
    colal = 3
    ligneal = 6
    C1 = class1.Text
 
        With Worksheets("alesages")
 
            'ecart inferieur'
 
                While D < .Cells(ligneal, 1) Or D > .Cells(ligneal, 2)
                    ligneal = ligneal + 1
                Wend
 
                While C1 <> .Cells(4, colal)
                    colal = colal + 1
                Wend
 
            EIal = CDbl(Replace(.Cells(ligneal, colal), "+D", ""))
 
                If colal = 14 Then
                    EIal = -(ITal / 2)
                End If
 
            'ecart superieur'
 
                Select Case Q1
                    Case 3
                        cold = 38
                    Case 4
                        cold = 39
                    Case Is = 5
                        cold = 40
                    Case 6
                        cold = 41
                    Case 7
                        cold = 42
                    Case Is = 8
                        cold = 43
                End Select
 
                If colal >= 15 Then
 
                colal = 15
                ligneal = 6
 
                    While C1 <> .Cells(4, colal)
                        colal = colal + 1
                    Wend
 
                    While D < .Cells(ligneal, 1) Or D > .Cells(ligneal, 2)
                        ligneal = ligneal + 1
                    Wend
 
                    If colal = 15 Then
                        colal = 15 - 6 + Q1
 
                        ESal = CDbl(Replace(.Cells(ligneal, colal), "+D", ""))
 
                    ElseIf colal = 18 And Q1 > 8 Then
                        colal = colal + 1
 
                    ElseIf colal = 20 And Q1 > 8 Then
                        colal = colal + 1
 
                    ElseIf colal = 23 And Q1 > 8 Then
                        colal = colal + 1
 
                    ElseIf colal = 18 Or colal = 20 Or colal = 23 Then
 
                        ESal = CDbl(Replace(.Cells(ligneal, colal), "+D", "")) + .Cells(ligneal, cold)
 
                    ElseIf colal >= 26 And Q1 <= 7 Then
                        ESal = (.Cells(ligneal, colal) + .Cells(ligneal, cold))
 
                    End If
 
                EIal = ESal - ITal
 
                End If
 
        End With
 
    ei1.Value = EIal
 
    'ecarts arbre'
 
        Dim ESab, EIab As Double
        Dim colab, ligneab As Integer
        Dim C2 As String
 
        With Worksheets("arbres")
 
        'ecart superieur'
 
        Q2 = Val(qualite2.Text)
        C2 = class2.Text
        colab = 3
        ligneab = 6
 
            While C2 <> .Cells(4, colab)
                colab = colab + 1
            Wend
 
            While D < .Cells(ligneab, 1) Or D > .Cells(ligneab, 2)
                ligneab = ligneab + 1
            Wend
 
        ESab = .Cells(ligneab, colab)
 
            If colab = 14 Then
                ESab = ITab / 2
            End If
 
        'ecart inferieur'
 
            If colab >= 15 Then
 
            colab = 15
            ligneab = 6
 
                While C2 <> .Cells(4, colab)
                    colab = colab + 1
                Wend
 
                While D < .Cells(ligneab, 1) Or D > .Cells(ligneab, 2)
                    ligneab = ligneab + 1
                Wend
 
                If colab = 15 And Q2 <> 5 Then
                    colab = 15 - 6 + Q2
 
                ElseIf colab = 15 And Q2 = 5 Then
                    colab = 15
 
                ElseIf colab = 19 And Q2 <= 3 Then
                    colab = colab + 1
 
                End If
 
            EIab = .Cells(ligneab, colab)
            ESab = EIab + ITab
 
            End If
 
        End With
 
    es2.Value = ESab
    es1.Value = EIal + ITal
    ei2.Value = ESab - ITab
 
    'Calcul des jeux MAXI et MINI
 
    jma.Value = (ESal - EIab) / 1000
    jmi.Value = (EIal - ESab) / 1000
 
End Sub
Paro. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 09h38   #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
En survolant ton nouveau code (plus difficile à comprendre car je suppose que tu passes par un UserForm que nous ne connaissons pas), j'ai l'impression qu'il y a toujours quelques calculs inutiles, et surtout que tu ne gères toujours pas le couple Série/Degré de tolérance pour ceux où il y a un choix (J, K, M, N, P).
__________________
« 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 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h43.


 
 
 
 
Partenaires

Hébergement Web