Excel VBA - Boucle de calcul ne marche pas

Bonjour,

Les 2 boucles de mon progamme ne fonctionnent pas :
1) la première pour le calcul des deltas, doit faire la somme d'une certaine colonne si la condition de la colonne adjacente est respectée (boucle if then else ou select case ne fonctionnent pas, je dois certainement oublié qqch d'important)
2) la deuxième doit calculer le N° de la semaine à partir d'une date et faire la somme d'une certaine colonne pour chaque semaine

Private Sub Import_Données_Fichier_Suivi_Click()
Workbooks.Open ("C:\Home\st31879\Test_Fichier_Suivi_WP11_Entrée_Air_W51.xls")
Windows("Test_Fichier_Suivi_WP11_Entrée_Air_W51.xls").Activate
Dim i As Variant
Dim j As Variant
'Calcul des deltas
Dim cpt_dmoins1 As Variant
Dim cpt_d1 As Variant
Dim cpt_d2 As Variant
Dim cpt_d3 As Variant
cpt_dmoins1 = 0
cpt_d1 = 0
cpt_d2 = 0
cpt_d3 = 0
j = 26
For i = 6 To 10
'Calcul des D-1
'If Cells(i, 26).Value = "D-1" Then
'cpt_dmoins1 = cpt_dmoins1 + Cells(i, 25).Value
'Calcul des D1
'ElseIf Cells(i, 26).Value = D1 Then
'cpt_d1 = cpt_d1 + Cells(i, 25).Value
'Calcul des D2
'elseIf Cells(i, 26).Value = D2 Then
'cpt_d2 = cpt_d2 + Cells(i, 25).Value
'Calcul des D3
'ElseIf Cells(i, 26).Value = D3 Then
'cpt_d3 = cpt_d3 + Cells(i, 25).Value
'End If
Select Case Range("Z" & i).Value
Case Is = D1
cpt_d1 = cpt_d1 + Range("Y" & i).Value
Case Is = D2
cpt_d2 = cpt_d2 + Range("Y" & i).Value
Case Is = D3
cpt_d3 = cpt_d3 + Range("Y" & i).Value
Case Is = D-1
cpt_dmoins1 = cpt_dmoins1 + Range("Y" & i).Value
End Select
Next i
Workbooks("Test_Reporting_WP11_Entrée_Air.xls").Activate
Cells(13, 4) = cpt_dmoins1
Cells(12, 4) = cpt_d1
Cells(11, 4) = cpt_d2
Cells(10, 4) = cpt_d3
Workbooks("Test_Fichier_Suivi_WP11_Entrée_Air_W51.xls").Activate
'Workbooks("Test_Fichier_Suivi_WP11_Entrée_Air_W51.xls").Close

'Calcul des gammes
‘Calcul du N° de la semaine puis du nombre prévu de gammes à lancer chaque semaine et du nombre réel d 'gammes lancées chaque semaine
Dim Semaine As Variant
Dim Sem_Gamme_Prevue()
j = 6
For i = 0 To 100
Sem_Gamme_Prevue(i) = DatePart("ww", Cells(j, 17), 2, 2)
j = j + 1
Next i
Windows("Test_Reporting_WP11_Entrée_Air.xls").Sheets("RAMSES").Activate
j = 3
For Sem = 38 To 52
Cells(49, j) = Application.CountIf(Sem_Gamme_Prevue(), Sem)
j = j + 1
Next Sem
End Sub

Merci par avance pour votre aide.

Lilith2231
Configuration: Windows XP
Firefox 3.0.14

3 réponses

  1. Contributeur
    bonjour,
    merci de mettre ton code entre les balises "codes" fournie au 4° onglet en haut de ton message: la lecture sera digeste! sois sympa de modifier

    tu as "D-1" puis D1,D2,D3 sans apostrophe (variables publiques d'une autre sub ?)
    plus bas
    D-1 n'a plus d'apostrophe

    c'est une 1° lecture, donc...
    0
    1. ok

      est ce que c'est bon comme suit ?

      Private Sub Import_Données_Fichier_Suivi_Click()
      Workbooks.Open ("C:\Home\st31879\Test_Fichier_Suivi_WP11_Entrée_Air_W51.xls")
      Windows("Test_Fichier_Suivi_WP11_Entrée_Air_W51.xls").Activate
      Dim i As Variant
      Dim j As Variant
      'Calcul des deltas
      Dim cpt_dmoins1 As Variant
      Dim cpt_d1 As Variant
      Dim cpt_d2 As Variant
      Dim cpt_d3 As Variant
      cpt_dmoins1 = 0
      cpt_d1 = 0
      cpt_d2 = 0
      cpt_d3 = 0
      j = 26
      For i = 6 To 10
          'Calcul des D-1
          'If Cells(i, 26).Value = "D-1" Then
              'cpt_dmoins1 = cpt_dmoins1 + Cells(i, 25).Value
          'Calcul des D1
          'ElseIf Cells(i, 26).Value = D1 Then
              'cpt_d1 = cpt_d1 + Cells(i, 25).Value
          'Calcul des D2
          'elseIf Cells(i, 26).Value = D2 Then
              'cpt_d2 = cpt_d2 + Cells(i, 25).Value
          'Calcul des D3
          'ElseIf Cells(i, 26).Value = D3 Then
              'cpt_d3 = cpt_d3 + Cells(i, 25).Value
          'End If
          Select Case Range("Z" & i).Value
              Case Is = "D1"
                  cpt_d1 = cpt_d1 + Range("Y" & i).Value
              Case Is = "D2"
                  cpt_d2 = cpt_d2 + Range("Y" & i).Value
              Case Is = "D3"
                  cpt_d3 = cpt_d3 + Range("Y" & i).Value
              Case Is = "D-1"
                  cpt_dmoins1 = cpt_dmoins1 + Range("Y" & i).Value
          End Select
      Next i
      Workbooks("Test_Reporting_WP11_Entrée_Air.xls").Activate
      Cells(13, 4) = cpt_dmoins1
      Cells(12, 4) = cpt_d1
      Cells(11, 4) = cpt_d2
      Cells(10, 4) = cpt_d3
      Workbooks("Test_Fichier_Suivi_WP11_Entrée_Air_W51.xls").Activate
      'Workbooks("Test_Fichier_Suivi_WP11_Entrée_Air_W51.xls").Close
      
      'Calcul des gammes
      Dim Semaine As Variant
      Dim Sem_Gamme_Prevue()
      j = 6
      For i = 0 To 100
          Sem_Gamme_Prevue(i) = DatePart("ww", Cells(j, 17), 2, 2)
          j = j + 1
      Next i
      Windows("Test_Reporting_WP11_Entrée_Air.xls").Sheets("RAMSES").Activate
      j = 3
      For Sem = 38 To 52
          Cells(49, j) = Application.CountIf(Sem_Gamme_Prevue(), Sem)
          j = j + 1
      Next Sem
      End Sub
      0
  2. Contributeur
    OK,
    Quelques remarques:

    1/Pourquoi tout déclarer en variant ? (i et j pourrait être en byte et les cpt_xxxx en single ou double si décimaus ou long si entier

    2/Est tu sûre d''être sur la bonne feuille lorsque tu ouvres un fichier ?

    3/Dim Semaine As Variant ---> dim sem as byte

    4/Suis sceptique sur le fonctionnement de la partie calcul des gammes (voir edit)

    tu dis, il y a d'autre trucs question optimisation et rapidité mais on verra demain (serai certainement bloqué at home because neige)

    edit: 19h15

    ci dessous tite macro d'école pour alimenter un tableau (nombres<256 dans A1:A17)
    Dim tablo() As Byte
    ReDim tablo(0)
    For cptr = 1 To 17
    tablo(cptr - 1) = Cells(cptr, 1)
    ReDim Preserve tablo(cptr)
    Next
    0
    1. Contributeur
      Bonjour,

      Ci joint maquette de W pour le calcul des gammes à adapter à tes classeurs
      https://www.cjoint.com/?bik2Wqhn44

      macro proposée

      Option Explicit
      Option Base 1 'pour commencer indexation à 1 plutôt que 0
      
      Sub calculer_gammes()
      'Déclarations
      Dim Sem As Byte
      Dim tablo_sem() As Byte
      Dim cptr As Byte
      
      Application.ScreenUpdating = False 'fige défilement de l'écran
      
      With ThisWorkbook.Sheets(1)
          ReDim tablo_sem(53)
          For cptr = 1 To 100
              Sem = DatePart("ww", .Cells(cptr + 5, 17), 2, 2) 'calcule le N° de semaine ISO
              tablo_sem(Sem) = tablo_sem(Sem) + 1 ' calcule le nbre de gammes(?) par semaine
      Next
      End With
      
      'Windows("Test_Reporting_WP11_Entrée_Air.xls").Sheets("RAMSES").Activate
      With Workbooks("classeur2.xls").Sheets(1)
          .Range("C49:R49").ClearContents
          For Sem = 38 To 53
              .Cells(49, Sem - 35) = tablo_sem(Sem) 'restitue les nombres par semaine
          Next
      End With
      Msgbox "calculs des gammes terminé"
      End Sub
      0
      1. Merci !

        Je vais regarder tout ça de près !

        Lilith2231
        0