macro et chiffres décimaux, modification

K

Kaze

Guest
Bonjour à tout le forum,

Je suis novice en VBA et je voudrais adapter la macro du fichier joint (réalisée pour des chiffres entiers) avec des chiffres décimaux.

Dans le fichier exemple toutes les données des colonnes D et E sont des chiffres entiers pour permettre d'utiliser correctement la macro. Mais toutes ces données étaient du type 1.2324 (ligne 25 remplace la ligne 2)et l'écart entre 2 chiffres est 0.0001 au lieu de 1 pour les chiffres entiers. Que faut il modifier pour que les résultats des calculs effectuées par la macro affichent les 4 chiffres après la virgule?

D'autre part je voudrais augmenter le nombre maxi de lignes de données pris en compte par la macro qui actuellement 22 à 46 lignes. la modification de cette ligne de code For j = 1 To 46 suffit elle? J'ai un doute.

Une question pour finir: Dans les rares cas où les données sont des chiffres comportant seulement 2 chiffres après la virgule, écart entre 2 chiffres étant de 0,01 faut il que je fasse une macro spécifique ou une seule macro destinée aux chiffres décimaux suffit?

Je vous remercie par avance pour votre aide et vous souhaite un bon dimanche.

Olivier
 

Blunet

XLDnaute Occasionnel
Salut Kaze
Les boucles permettent de répeter une action et de faire un balayage.
Donc tu peux aisément utiliser For j=1 to 46, seulement il faudarit t'assuere de l'exactitude des positions de ton compteur. Tout endroit du code où intervient une ligne de données que tu voudrais atteindre doit avoir le compteur i.
Pour t'assurer que tu as le résultat escompté faut assi te rassurer que les données qui utilisent ou recoivent des données provenant de ta plage de 46 lignes soient aussi intégrer dans le balayage via le compteur i.

Concernant les formats :NumberFormat = '#0.0000' suffit a écrire tes chiffres avec 4 chiffres après la virgule.

Si tu vexu passer à 2 chiffres faudrait modifier le formatage ou simplement créer une fonction qui te permet de passer à 2 chiffres (Inutile). En fait tu peux conserver le même formatage pour toutes des données et les écarts seront a une même échelle.

Ciao [file name=va_20060129093658.zip size=11731]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/va_20060129093658.zip[/file]
 

Pièces jointes

  • va_20060129093658.zip
    11.5 KB · Affichages: 28

JeanMarie

XLDnaute Barbatruc
Bonjour

Change tes valeurs en décimal, spécifie le format des cellules, et essaye ce code, fait attention à la déclaration des variables dans cette ligne
Dim TargetCel1, TargetCel2, TargetCel3, TargetCel4, TargetCel5 As Range
seule TargetCel15 sera de type Range, les autres seront de types Variant

Code:
Option Explicit
Option Base 1

Sub ValueArea()

Dim TopCel As Range
Set TopCel = Range('H2:L2')
Range(TopCel, TopCel.End(xlDown)).ClearContents

Set TopCel = Range('A2')

'Pour affichage
Dim k As Integer
k = 1
Dim TargetCel1 as Range, TargetCel2 as Range, TargetCel3 as Range, TargetCel4 as Range, TargetCel5 As Range
Set TargetCel1 = Range('H2')
Set TargetCel2 = Range('I2')
Set TargetCel3 = Range('J2')
Set TargetCel4 = Range('K2')
Set TargetCel5 = Range('L2')

While Not IsEmpty(TopCel)

'Détermination du range

Dim varRowsCount As Integer
varRowsCount = 1
While TopCel(varRowsCount + 1) = TopCel
    varRowsCount = varRowsCount + 1
Wend

Dim varHigh As Single, varLow As Single, varN As Integer
varHigh = Application.Max(Range(TopCel(1, 4), TopCel(varRowsCount, 4)))
varLow = Application.Min(Range(TopCel(1, 5), TopCel(varRowsCount, 5)))
varN = ((varHigh - varLow) * 10000) + 1

Dim varDailyRange() As Single
ReDim varDailyRange(1 To varN)
Dim i As Integer
For i = 1 To varN
    varDailyRange(i) = varLow + (i / 10000) - 0.0001
Next i

'calcul des TPO

Dim varTPO() As Integer
ReDim varTPO(1 To varN)
Dim j As Integer
Dim CelAux1 As Range, CelAux2 As Range
Set CelAux1 = TopCel(1, 4)
Set CelAux2 = TopCel(1, 5)
For i = 1 To varN
    varTPO(i) = 0
    For j = 1 To 46
        If (varDailyRange(i) >= CelAux2(j).Value) And (varDailyRange(i)  varMaxTPO Then
        varMaxTPO = varTPO(i)
    End If
Next i

'détermination de l'indice du POC
Dim varIndices() As Integer
Dim varAux As Integer
varAux = 0
For i = 1 To varN
    If varTPO(i) = varMaxTPO Then
        varAux = varAux + 1
        ReDim Preserve varIndices(varAux)
        varIndices(varAux) = i
    End If
Next i

'détermination du POC

Dim varPOC, varPOCIndice As Integer
varPOCIndice = varIndices(1)

'cas particulier : non unicité du POC

If varAux > 1 Then
    Dim varDistanceToMid() As Single
    ReDim varDistanceToMid(1 To varAux)
    For i = 1 To varAux
        varDistanceToMid(i) = Abs(varIndices(i) - 0.5 * (varN + 1))
    Next i
    For i = 1 To varAux - 1
        If varDistanceToMid(i + 1) < varDistanceToMid(i) Then
            varPOCIndice = varIndices(i + 1)
        End If
    Next i
End If

varPOC = varDailyRange(varPOCIndice)

'CALCUL DE LA VALUE AREA

Dim varSUM As Integer
Dim varVA_up As Single
Dim varVA_low As Single
Dim varAuxUp, varAuxDown As Integer
varSUM = varTPO(varPOCIndice)
varVA_up = varPOC
varVA_low = varPOC
varAuxUp = varPOCIndice
varAuxDown = varPOCIndice

While varSUM  varN Then
        varSUM = varSUM + (varTPO(varAuxDown - 1) + varTPO(varAuxDown - 2))
        varVA_low = varDailyRange(varAuxDown - 2)
        varAuxDown = varAuxDown - 2
    End If
    
    If (varAuxDown - 2) = (varTPO(varAuxDown - 1) + varTPO(varAuxDown - 2)) Then
            varVA_up = varDailyRange(varAuxUp + 2)
            varSUM = varSUM + (varTPO(varAuxUp + 1) + varTPO(varAuxUp + 2))
            varAuxUp = varAuxUp + 2
        Else
            varVA_low = varDailyRange(varAuxDown - 2)
            varSUM = varSUM + (varTPO(varAuxDown - 1) + varTPO(varAuxDown - 2))
            varAuxDown = varAuxDown - 2
        End If
    End If

Wend


'AFFICHAGE

TargetCel1(k) = TopCel
TargetCel2(k).Value = varVA_low
TargetCel3(k).Value = varPOC
TargetCel4(k).Value = varVA_up
TargetCel5(k).Value = varMaxTPO

k = k + 1

Set TopCel = TopCel(1 + varRowsCount)

Wend

End Sub

@+Jean-Marie

Message édité par: JeanMarie, à: 29/01/2006 10:33
 
K

kaze

Guest
Bonjour Blunet et Jean Marie,

Merci à tous les deux de vous être penché sur mon problème. Pour ce qui est du formatage je n'arrive pas au résultat voulu que j'ai indiqué dans le nouveau fichier et dont les données sont celles d'origine(nbrs decimaux).La macro est celle d'origine avec en plus celle du formatage.
Jean Marie, j'ai un problème de lecture sur ta macro: TargetCel3 as&nbsp ,le signe & (and)est il correct? Je remarque d'autre part que tu as modifié cette ligne: While varSUM < Int(0.7 * varTotTPO)qui me semble correcte vu que TPO est un nombre entier. Pourrais tu poster un fichier avec les modifications de la macro?
@ +
Olivier [file name=va1.zip size=11164]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/va1.zip[/file]
 

Pièces jointes

  • va1.zip
    10.9 KB · Affichages: 25
K

kaze

Guest
Bonjour à tous,

J'ai essayé de faire des modifications sur la macro en particulier la déclaration des variables As Range ou As Variant mais je n'arrive pas au résultat voulu. Le code fourni par Jean Marie aurait pu m'aider s'il apparaissait correctement sur mon écran mais il y a plusieurs lignes en rouge où des erreurs se sont produites (espaces,signe &), ce qui le rend inexploitable.
J'ai vérifié, la représentation est la même avec les nombres entiers ou ces mêmes nombres changés en nombres décimaux. Le résultat à obtenir avec la macro est donc le suivant:
I2=1.2303, J2=1.2311, K2=1.2321, L2=16
Merci encore pour votre aide.
@+
Olivier
 

Discussions similaires

Statistiques des forums

Discussions
312 615
Messages
2 090 243
Membres
104 464
dernier inscrit
alzerco