Aide

hobine

XLDnaute Nouveau
je suis nouveau dans la programmation vba excel. J'ai ecrit un programme mais il y a faute qui apparait au niveau Tableau(i, 1) = Str(Tableau(i, 1)) dans mon programme lorsque je compile. n'ayant pas assez d'experiences et de connaissances, pouvez vous m'aider? vous verez le programme totale en dessous



Sub listeDoublonsPlage()
Dim Plage As Range
Dim Tableau(), Resultat() As String
Dim Tableau_sans_zero() As String
Dim Tableau_cinq_jours() As Double
Dim Tableau_moy_lis() As Double
Dim i As Integer, j As Integer, m As Integer


Set Un = New Collection
'La plage de cellules (sur une colonne) à tester
Set Plage = Range("B10:B" & Range("B65536").End(xlUp).Row)

'lecture de la colonne B et affecter les valeurs dans Array
Tableau = Plage.Value

' il transforme les valeurs en string
For i = 1 To Plage.Count
Tableau(i, 1) = Str(Tableau(i, 1))
Next i

' il compte le nombre des elements vides

ncount = 0
For i = 1 To Plage.Count
If Tableau(i, 1) = " 0" Then
ncount = ncount + 1
End If
Next i
'ndim2 est la dim de la nouvelle array sans les elts vides
ndim2 = Plage.Count - ncount
' il definit la nouvelle dim
ReDim Tableau_sans_zero(ndim2)

' il met toutes les valeurs non nulles de l 'ancien tableau dans le nouveau tableau
ndim_count = 0
For i = 1 To Plage.Count
If Tableau(i, 1) <> " 0" Then
ndim_count = ndim_count + 1
Tableau_sans_zero(ndim_count) = Tableau(i, 1)
End If
Next i



'MsgBox ndim2
'MsgBox Tableau_sans_zero(0)
'MsgBox Tableau_sans_zero(ndim2 - 1)

som_dim = 0
' verification k le dernier elt est bien la somme des autres
For i = 1 To (ndim2 - 1)
som_dim = som_dim + Tableau_sans_zero(i)
Next i

If (som_dim - Tableau_sans_zero(ndim2) = 0) Then
ndim2 = ndim2 - 1
End If

' MsgBox ndim2

' ndim2 est le nombre de semaines travaillées

' moyenne de la production par semaine
moy = 0
For i = 1 To ndim2
moy = moy + Tableau_sans_zero(i)

Next i
moy = moy / ndim2
' MsgBox moy

' compter les semaines en moyenne 5 jrs travaillés
ndim3 = 0
For i = 1 To ndim2
tmp = Tableau_sans_zero(i) - (moy / 2)
If (tmp > 0) Then
ndim3 = ndim3 + 1
End If
Next i

ReDim Tableau_cinq_jours(ndim3)

MsgBox moy / 2
MsgBox ndim3

'remplir le tableau avec les elts sup moy/2
ndim_count = 0
For i = 1 To ndim2
tmp = Tableau_sans_zero(i) - (moy / 2)
If tmp > 0 Then
ndim_count = ndim_count + 1
Tableau_cinq_jours(ndim_count) = Tableau_sans_zero(i)


End If
Next i



ReDim Tableau_moy_lis(ndim3 - 2)

' calcul de toutes les moyennes lissées
For i = 3 To ndim3
Tableau_moy_lis(i - 2) = (1 / 3) * (Tableau_cinq_jours(i) + Tableau_cinq_jours(i - 1) + Tableau_cinq_jours(i - 2))
Next i

' MsgBox Tableau_moy_lis(1)
' MsgBox Tableau_moy_lis(ndim3 - 2)

' calcul de la somme du tableau 5 jours travaillés
OcQuad = 0
For i = 1 To ndim3
OcQuad = OcQuad + Tableau_cinq_jours(i)
Next i

' MsgBox OcQuad
' calcul du max 3SL

maxLS = 0
For i = 1 To (ndim3 - 2)
If Tableau_moy_lis(i) > maxLS Then
maxLS = Tableau_moy_lis(i)
End If
Next i
MsgBox maxLS
' sortir le max de 3SL et OcQuad pour afficher dans une fenetre

Cells(64, 8) = maxLS
'Worksheets("Feuil2" ).Cells(7, i + 1) = 2 + i
'Worksheets("TCD PMMECA").Cells(64, 8) = maxLS
'MsgBox Plage.Count

End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Aide

Bonjour Hobine, bonjour le forum,

Sans vraiment regarder ton code de près... As-tu essayé de remplacer Str(Tableau(i, 1)) par CStr(Tableau(i,1)) ? Car voici ce que dit l'aide VBA sur la fonction Str :

Note La fonction Str ne reconnaît que le point (.) comme séparateur décimal valide. Lorsqu'il est nécessaire d'utiliser un autre séparateur décimal (par exemple, pour des applications internationales), utilisez la fonction CStr pour convertir un nombre en chaîne.
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Aide

Salut hobine et le forum
Comme j'ai la flemme de décrypter ta macro, quelques remarques :
- Mettre les balises de code (icone # en mode avancé) facilite la lecture du code.
- Dépanner un code demande : le code et ce qu'il est supposé faire (ou les données avant/après) ! À ma connaissance, il n'y a ni devin, ni télépathe sur ce site.
- Mettre des instructions inutiles ou en commentaire ne facilite pas le dépannage.
- Mettre un code faux, sans explications de ce qu'il doit faire me parait être une bonne méthode pour s'entraîner à être patient...
- Tant qu'à déclarer les variables, pourquoi ne pas toutes les déclarer ? Certaines sont déclarées en variables globales ?

Je comprends pas tout : tu transformes une plage (de nombres ?) en chaîne de caractères, pour... les utiliser en tant que nombres ????
Mais ne connaissant rien d'autres que le code (qui est faux)... peut-être que c'est impératif... ailleurs
A+
J'ai lu la remarque ci-dessus, et ne suis pas sûr de la comprendre : Str(Long) => ce sont donc des nombres entiers, non ?
 
Dernière édition:

hobine

XLDnaute Nouveau
Re : Aide

Autre question, comment associer une lettre qui declengera une macro à partir de sa saisie sur une feuille excel , autrement dit, chaque fois que j'ecrit par exple "z" sur une feuille excel, ma macro se met automatiquement en marche?
 
Dernière édition: