• Initiateur de la discussion Initiateur de la discussion hobine
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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
 
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:
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:
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:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
232
Réponses
8
Affichages
233
Réponses
2
Affichages
124
Réponses
10
Affichages
281
Réponses
2
Affichages
201
Réponses
4
Affichages
177
Réponses
6
Affichages
86
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
479
Retour