IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro à Terminer


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Par défaut Macro à Terminer
    *Bonjour *

    J'ai déja la macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Explicit
    Option Base 1
     
    Const codeb = 19
    Const lideb = 20
    Const lifin = 619
    Const cofin = 158
    Const nbco = cofin - codeb + 1
    Const nbli = lifin - lideb + 1
    Const nbcas = 9
    Const FeuilleSource = "Data"
    Const coldeb = "S"
    Const colfin = "FB"
    Const plage = coldeb & lideb & ":" & colfin & lifin
    Const colonnes = "A:FB"
    Const NomGeneriqueFeuille = "Cas "
     
    Sub RemplirUneFeuille(nucas As Long)
    Dim li As Long, co As Long, lires As Long, nbchange As Long
    Dim Tligne
    Dim Tchange
    Dim ligne As String
    Dim vcour As Variant, vprec As Variant
    Dim FeuilleRes As String
     
     
     
      FeuilleRes = NomGeneriqueFeuille & nucas
      lires = lideb 'liresdeb
        ' on met la ligne li dans Tligne, on initialise Tchange
        For li = lideb To lifin
          ligne = coldeb & li & ":" & colfin & li
          Tligne = Sheets(FeuilleSource).Range(ligne).Value
          Tchange = Tligne
        '  MsgBox (Tligne(1, 34))
          For co = 1 To nbco
            If Tligne(1, co) = "" Then
              Tchange(1, co) = ""
            Else
              Tchange(1, co) = 0
            End If
          Next co
          ' on traite les changements ligne li
          nbchange = 0
            For co = 1 To nbco - 1
              vprec = Tligne(1, co)
              vcour = Tligne(1, co + 1)
              If (vcour = "" Or vprec = "") Then
                ' rien
              Else
                If vcour <> vprec Then
                  nbchange = nbchange + 1
                  If nbchange = nucas Then
                    Tchange(1, co + 1) = nbchange
                    nbchange = 0
                  End If
                End If
              End If
            Next co
          ' affichage de Tchange en ligne lires de FeuilleRes
          Sheets(FeuilleRes).Range(ligne).Value = Tchange
          lires = lires + 1
        Next li
    End Sub
     
    Sub Toutes()
    Dim numcas As Long, nbfeuilles As Long
    Dim NomFeuille As String, Feuille As Variant
      ' creation des nbcas feuilles
      Application.ScreenUpdating = False
      Application.DisplayAlerts = False
     
      For Each Feuille In Sheets
    If Feuille.Name <> "Data" Then Feuille.Delete
      Next
     
      Application.DisplayAlerts = True
     
      For numcas = 1 To nbcas
         NomFeuille = NomGeneriqueFeuille & numcas
         nbfeuilles = Sheets.Count
         ' ajouter une feuille
         Sheets.Add
         ActiveWindow.Zoom = 75
         ActiveSheet.Name = NomFeuille
     
         ActiveSheet.Columns(colonnes).HorizontalAlignment = xlCenter
     
         With ActiveSheet.Range(plage)
           .FormatConditions.Delete
           .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreaterEqual, Formula1:="1"
           .FormatConditions(1).Interior.ColorIndex = 40
     
     
         End With
     
         Sheets(NomFeuille).Move after:=Sheets(Sheets.Count)
      Next numcas
      Application.ScreenUpdating = True
      ' remplir les nbcas feuilles
      For numcas = 1 To nbcas
        RemplirUneFeuille (numcas)
      Next numcas
    End Sub
    en module2 la macro marche bien mais ne fait pas de différence si le chiffre augmente ou diminu elle met juste un 1(pour le premier cas) si le chiffre change d'une colonne à l' autre sur une meme ligne, un 2 au deuxième changement pour le cas 2...jusqu'au cas 9)que j'arrive pas à développer comme je le veux
    J'ai des chiffres dans la feuille Data et je veux:
    pour le premier onglet à créer par exemple pour la ligne 20 que la macro me mette un 0 si le chiffre est le meme que la colonne précédente, un -1 si le chiffre est inferieur à la colonne précédente et un 1 si le chiffre est superieur.
    et ce jusqu'à la ligne 619(j'ai commencé ce cas dans le feuille que j'ai appelé Cas1que je veux)
    Pour le cas2 je l'ai aussi commencé dans la feuille que j'ai appelé cas2que je veux:
    pour ce cas on met un -2 au deuxième -1 qu'on a sur la ligne et le premier -1 jveux le mettre à 0 et un +2 au deuxième 1 qu'on a sur la meme ligne....et ca jusqu'au cas 3.
    Merci il doit pas y avoir grand chose à modifier j'ai essayé en module 3 mais ca marche pas ca me met des 0 partout, si c fesable avec des formules excel je vois pas comment faire mais c bon aussi.

    Merci beaucoup.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    salut,

    ca me parait bien complique tout ce que tu racontes la

    Entre le code et les explications, je suis personnellement completement paume.

    A quoi correspondent tes "Cas"?

    Serait-il possible que tu fasses une serie de questions precises sur ce que tu souhaites / ce que tu as obtenu jusqu'a present/ ce sur quoi tu bloques / la ou tu as besoin d'aide stp ?

    Merci pour nous
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Par défaut
    Merci beaucoup de me répondre jpcheck
    Par exemple supposons qu'à la ligne 20(première ligne ou j'ai mes chiffres)
    on a les chiffres suivant de la colonne BA à BT :

    25 25 25 26 26 21 21 29 29 38 38 38 37 37 37 49 49 49 10 10

    alors avec ma macro j'ai (pour l'onglet cas 1) de BA20 à BT20:
    0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0(donc un 1 si sur cette ligne le chiffre change d'une colonne à l'autre et 0 sinon sans se préocuper si le chiffre augment ou diminu)

    et pour le cas 2 dans mon onglet cas 2 :
    0 0 0 0 0 2 0 0 0 2 0 0 0 0 0 2 0 0 0 0 (donc un 2 sur la ligne en question au deuxième changement de chiffre et 0 sinon) ....jusqu'au cas9

    Ce que je veux c modifier la macro ou avec des formules excel pourquoi pas mais je sais pas comment faire, de sorte à prendre en compte le fait que la chiffre augment ou diminu:avec la nouvelle macro, j'aimerai en onglet cas 1:
    0 0 0 1 0 -1 0 1 0 1 0 0 -1 0 0 1 0 0 -1 0

    et en cas 2:
    0 0 0 0 0 0 0 2 0 0 0 0 -2 0 0 2 0 0 -0 0 donc un 2 si le chiffre augmente pour la deuxième fois(si ya déja un 1 avant puis remettre le compteur à 0) et un -2 si le chiffre augmente pour la deuxième fois (consécutivement ou pas, si y'a déja un -1 avant et remettre le compteur à 0)

    merci encore

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    pour la detection par formule de la modification tu peux partir sur un simple
    en B2 pour la ligne 1 par exemple
    =SI(B1<>A1,1,0)
    ensuite, tu compliques d'un cran en mettant +1 si tu as B1>A1 et -1 si B1<A1
    =SI(B1<>A1,SI(B1>A1,1,-1),0)
    pour le coup du cas 2, tu peux faire une somme progressive
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    @ andrea
    Si tu pourras mettre ici un exemple concret des données brutes et du résultat escompté.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Par défaut
    Merci à vous deux de me répondre.

    une somme progressive, ca veut dire rajouter un autre si?? sinon j'essai mais j'arrive pas ou plutot je vois pas car pour avoir un -2 on peut avoir un ou plusieurs +1 entre les deux -1, donc un -2 n'arrive pas après deux -1 consécutif.

    Merci mercatog à toi aussi, j'avais mis un fichier excel sur cijoint.fr, j'avais mis l'adresse ici mais ca a du etre bloquer jcomprends pas c pas possible de déposer des fichiers excel sur ce site???

  7. #7
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Tu peux toujours déposer ton fichier exemple mais pas en premier lieu.
    Je voudrai bien une fichier exemple permettant de voir les données brutes et le résultat attendu

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Par défaut
    Merci encore

    le revoila:http://www.cijoint.fr/cjlink.php?fil...cijYk68vcU.xls
    je veux donc modifier la macro en module 2 pour différencier cette fois si le chiffre augment ou diminu, si il augmente mettre un +1 et un -1 si il diminu pour le cas 1 comme j'ai commencé à le faire à la main en onglet cas1quejeveux(ca c pour le cas1)
    pour le cas 2 je veux mettre un -2 au deuxième -1(consécutif ou pas) et un +2 au deuxième +1 (consécutif ou pas)
    ca jusqu'au cas avec +3 et -3
    donc pour faire propre 6 onglets un pour le cas que avec des +1, un avec des -1, un pour les -2 un pour les +2, un pour les -3 et un pour les +3.
    Merci mercatog.

  9. #9
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    J'ai refais une proposition simpliste mais se complique quand je l'adapte à ton fichier (vu que les lignes ne sont pas homogènes en terme de nombre de cellule ou de la cellule de départ)
    Fichier avec une seule feuille Data avec un CommandButton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Function Retapp(Tbl As Variant, Ind As Byte) As Integer()
    Dim Temp() As Integer
    Dim i As Integer, j As Integer, k As Integer
    Dim Hi As Integer
    Dim Lo As Byte
     
    Lo = LBound(Tbl): Hi = UBound(Tbl)
    ReDim Temp(Lo To Hi)
    i = Lo + 1
    Do While i <= Hi
       If Tbl(i) > Tbl(i - 1) And Tbl(i) > 0 Then
          j = j + 1
       ElseIf Tbl(i) < Tbl(i - 1) And Abs(Tbl(i)) > 0 Then
          k = k - 1
       End If
       If j = Ind Then
          Temp(i) = Ind
          j = 0
       ElseIf k = -Ind Then
          Temp(i) = -Ind
          k = 0
       End If
       i = i + 1
    Loop
    Retapp = Temp
    Erase Temp
    End Function
    '----------------------------------
    Private Sub CommandButton1_Click()
    Dim Sh As Worksheet
    Dim Tbl() As Integer, s As Integer
    Dim LastLig As Long, i As Long
    Dim j As Byte, k As Byte, Deb As Byte
    Dim Plage As Range, c As Range
     
    Application.ScreenUpdating = False
    With Sheets("Data")
       LastLig = .Cells(.Rows.Count, "FB").End(xlUp).Row
       For i = 20 To LastLig
          Set Plage = .Range("AL" & i & ":FB" & i)
          Set c = Plage.Find("*")
          If Not c Is Nothing Then
             Deb = c.Column
             Set c = Nothing
             ReDim Tbl(1 To 159 - Deb)
             For k = 1 To 159 - Deb
               Tbl(k) = .Cells(i, k + Deb - 1).Value
             Next k
             For j = 1 To 9
                On Error Resume Next
                Set Sh = Sheets("CAS_" & j)
                On Error GoTo 0
                If Sh Is Nothing Then
                   Set Sh = Sheets.Add(After:=Worksheets(Worksheets.Count))
                   Sh.Name = "CAS_" & j
                   Sh.Cells.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, Formula1:="=0"
                   Sh.Cells.FormatConditions(1).Interior.ColorIndex = 53
                End If
                Tbl = Retapp(Tbl, j)
                Sh.Range(Sh.Cells(20 + s, Deb), Sh.Cells(20 + s, 158)).Value = Tbl
                Sh.UsedRange.Columns.AutoFit
                Sh.Range("A1:AL1").ColumnWidth = 1
                Set Sh = Nothing
             Next j
             s = s + 1
             Erase Tbl
          End If
          Application.StatusBar = "               Traitement en cours... " & Application.RoundUp(100 * (i - 20) / (LastLig - 20), 1) & "%"
          DoEvents
       Next i
       MsgBox "Traitement terminé..."
       .Activate
    End With
    Application.StatusBar = ""
    Application.ScreenUpdating = True
    End Sub

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Par défaut
    Enocre merci mercatog pour ton aide.

    J'ai lancé la macro, et verifiant au hasard la ligne 40 pour le cas 2 on a un 2 en
    colonne BF alors qu'on BE40 on a 68 en feuille Data et en BF40 on a aussi 68,
    par contre le cas 1 semble marcher correctement.
    Pour le cas 3 j'ai qu'un -3 et aucun 3 alors que pour chaque ligne en Feuille Data on a souvent plusieurs 1 et -1 donc on devrait en avoir plus que ca.

    Jvois pas pour l'instant ou est l'erreur mais jcontinu à chercher:
    la macro jlai lancé les résultats sont ici:http://www.cijoint.fr/cjlink.php?fil...cijJNtJg5J.xls

    par contre pour CAS5 CAS 6 CAS 7 CAS8 et CAS9, y'a que des 0 et ca c normal.
    Merci.

  11. #11
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Après le cas 1, le résultat est de compter le nombre de 1 ou de -1 (successif ou non)
    Si c'est le cas, essaies ceci (Remarque, pour le gain de temps, le processus s'arrête dès que les résultat est partout nul ligne par ligne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Function Reform(Tb As Variant) As Integer()
    Dim Tmp() As Integer
    Dim i As Integer, Hi As Integer
    Dim Lo As Byte
     
    Lo = LBound(Tb): Hi = UBound(Tb)
    ReDim Tmp(Lo To Hi)
    Tmp(Lo) = 0
    For i = Lo + 1 To Hi
       If Tb(i) > Tb(i - 1) Then
          Tmp(i) = 1
       ElseIf Tb(i) < Tb(i - 1) Then
          Tmp(i) = -1
       End If
    Next i
    Reform = Tmp
    Erase Tmp
    End Function
    Private Function Retapp(Tblo As Variant, Ind As Byte) As Integer()
    Dim TM() As Integer, TT() As Integer
    Dim i As Integer, j As Integer, k As Integer
    Dim Hi As Integer
    Dim Lo As Byte
     
    Lo = LBound(Tblo): Hi = UBound(Tblo)
    ReDim TM(Lo To Hi)
    ReDim Tabl(Lo To Hi)
    If Ind = 1 Then
       TM = Reform(Tblo)
    Else
       TT = Reform(Tblo)
       For i = Lo To Hi
          If TT(i) > 0 Then
             j = j + 1
          ElseIf TT(i) < 0 Then
             k = k - 1
          End If
          If j = Ind Then
             TM(i) = Ind
             j = 0
          ElseIf k = -Ind Then
             TM(i) = -Ind
             k = 0
          End If
       Next i
    End If
    Retapp = TM
    Erase TM
    Erase TT
    End Function
     
    Private Function ArrayZero(Tbl As Variant) As Boolean
    ArrayZero = (Application.Max(Tbl) = 0) And (Application.Min(Tbl) = 0)
    End Function
     
    'TRAITEMENT
    Private Sub APPLIQUER()
    Dim Sh As Worksheet
    Dim Tbl() As Integer, Temp() As Integer, s As Integer
    Dim LastLig As Long, i As Long
    Dim j As Byte, k As Byte, Deb As Byte
    Dim Plage As Range, c As Range
     
    Application.ScreenUpdating = False
    With Sheets("Data")
       LastLig = .Cells(.Rows.Count, "FB").End(xlUp).Row
       For i = 20 To LastLig
          Set Plage = .Range("AL" & i & ":FB" & i)
          Set c = Plage.Find("*")
          If Not c Is Nothing Then
             Deb = c.Column
             Set c = Nothing
             ReDim Tbl(1 To 159 - Deb)
             For k = 1 To 159 - Deb
                Tbl(k) = .Cells(i, k + Deb - 1).Value
             Next k
             ReDim Temp(1 To 159 - Deb)
             For j = 1 To 9
                Temp = Retapp(Tbl, j)
                If ArrayZero(Temp) Then Exit For
                On Error Resume Next
                Set Sh = Sheets("CAS_" & j)
                On Error GoTo 0
                If Sh Is Nothing Then
                   Set Sh = Sheets.Add(After:=Worksheets(Worksheets.Count))
                   Sh.Name = "CAS_" & j
                   Sh.Cells.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, Formula1:="=0"
                   Sh.Cells.FormatConditions(1).Interior.ColorIndex = 53
                End If
                Sh.Range(Sh.Cells(20 + s, Deb), Sh.Cells(20 + s, 158)).Value = Temp
                Sh.Range("A1:BF1").ColumnWidth = 1
                Sh.UsedRange.Columns.AutoFit
                Set Sh = Nothing
             Next j
             s = s + 1
             Erase Tbl
          End If
          DoEvents
          Application.StatusBar = String(100, " ") & "Traitement en cours... " & Application.RoundUp(100 * (i - 20) / (LastLig - 20), 0) & "%"
       Next i
       .Activate
    End With
    Application.StatusBar = ""
    Application.ScreenUpdating = True
    MsgBox "Traitement terminé..."
    End Sub

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Par défaut
    J'ai pas encore répondu car je me demande si y'a pas un décalage de ligne car:

    Par exemples,En ligne 38 on a le premier chiffre en EE en feuille data et sur les CAS1 CAS2..
    on a des 0 à partir de AM en ligne 38
    pour la ligne 37 on a des chiffres en feuille data à partir de AM et dans les feuilles crer CAS1.... on a rien en ligne 37.
    Merci

  13. #13
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Sur la ligne 38, tu as un seul nombre 19 (aucun changement) de la colonne EE à FB

    EDIT: Oui, c'était à cause des lignes vides (exemple ligne 28)

    Modifier la sub APPLIQUER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Sub APPLIQUER()
    Dim Sh As Worksheet
    Dim Tbl() As Integer, Temp() As Integer, s As Integer
    Dim LastLig As Long, i As Long
    Dim j As Byte, k As Byte, Deb As Byte
    Dim Plage As Range, c As Range
     
    Application.ScreenUpdating = False
    With Sheets("Data")
       LastLig = .Cells(.Rows.Count, "FB").End(xlUp).Row
       For i = 20 To LastLig
          Set Plage = .Range("AL" & i & ":FB" & i)
          Set c = Plage.Find("*")
          If Not c Is Nothing Then
             Deb = c.Column
             Set c = Nothing
             ReDim Tbl(1 To 159 - Deb)
             For k = 1 To 159 - Deb
                Tbl(k) = .Cells(i, k + Deb - 1).Value
             Next k
             ReDim Temp(1 To 159 - Deb)
             For j = 1 To 9
                Temp = Retapp(Tbl, j)
                If ArrayZero(Temp) Then Exit For
                On Error Resume Next
                Set Sh = Sheets("CAS_" & j)
                On Error GoTo 0
                If Sh Is Nothing Then
                   Set Sh = Sheets.Add(After:=Worksheets(Worksheets.Count))
                   Sh.Name = "CAS_" & j
                   Sh.Cells.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, Formula1:="=0"
                   Sh.Cells.FormatConditions(1).Interior.ColorIndex = 53
                End If
                Sh.Range(Sh.Cells(20 + s, Deb), Sh.Cells(20 + s, 158)).Value = Temp
                Sh.Range("A1:BF1").ColumnWidth = 1
                Sh.UsedRange.Columns.AutoFit
                Set Sh = Nothing
             Next j
             s = s + 1
             Erase Tbl
          Else
             s = s + 1
          End If
          DoEvents
          Application.StatusBar = String(80, " ") & "Traitement en cours... " & Application.RoundUp(100 * (i - 20) / (LastLig - 20), 0) & "%"
       Next i
       .Activate
    End With
    Application.StatusBar = ""
    Application.ScreenUpdating = True
    MsgBox "Traitement terminé..."
    End Sub

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Par défaut
    Merci Mercatog

  15. #15
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Ici une amelioration du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Explicit
    Private Function Normalize(Tb As Variant) As Integer()
    Dim Tmp() As Integer
    Dim i As Integer, Hi As Integer
    Dim Lo As Byte
     
    Lo = LBound(Tb): Hi = UBound(Tb)
    ReDim Tmp(Lo To Hi)
    Tmp(Lo) = 0
    For i = Lo + 1 To Hi
       If Tb(i) > Tb(i - 1) Then
          Tmp(i) = 1
       ElseIf Tb(i) < Tb(i - 1) Then
          Tmp(i) = -1
       End If
    Next i
    Normalize = Tmp
    Erase Tmp
    End Function
    Private Function Reorganize(Tblo As Variant, Ind As Byte) As Integer()
    Dim tmpTblo() As Integer
    Dim i As Integer, j As Integer, k As Integer
    Dim Hi As Integer
    Dim Lo As Byte
     
    Lo = LBound(Tblo): Hi = UBound(Tblo)
    ReDim tmpTblo(Lo To Hi)
    For i = Lo To Hi
       If Tblo(i) > 0 Then
          j = j + 1
       ElseIf Tblo(i) < 0 Then
          k = k - 1
       End If
       If j = Ind Then
          tmpTblo(i) = Ind
          j = 0
       ElseIf k = -Ind Then
          tmpTblo(i) = -Ind
          k = 0
       End If
    Next i
    Reorganize = tmpTblo
    Erase tmpTblo
    End Function
     
    Public Function ArrayZero(Tbl As Variant) As Boolean
    ArrayZero = (Application.Max(Tbl) = 0) And (Application.Min(Tbl) = 0)
    End Function
     
    Sub APPLIQUER()
    Dim Sh As Worksheet
    Dim Tbl() As Integer, normTbl() As Integer
    Dim LastLig As Long, i As Long
    Dim j As Byte, k As Byte, Deb As Byte
    Dim Plage As Range, c As Range
     
    Application.ScreenUpdating = False
    With Sheets("Data")
        LastLig = .Cells(.Rows.Count, "FB").End(xlUp).Row      'Dernière ligne de donnée (Colonne BF comme référence)
        For i = 20 To LastLig
            Set Plage = .Range("AL" & i & ":FB" & i)           'On cherche pour chaque ligne i la colonne de debut des données Deb
            Set c = Plage.Find("*")
            If Not c Is Nothing Then                           'Si la ligne n'est pas vide
                Deb = c.Column
                Set c = Nothing
                ReDim Tbl(1 To 159 - Deb)                      'On met dans tbl les données de la ligne i (de Deb jusqu'à la colonne BF)
                For k = 1 To 159 - Deb
                    Tbl(k) = .Cells(i, k + Deb - 1).Value
                Next k
                ReDim normTbl(1 To 159 - Deb)
                normTbl = Normalize(Tbl)                       'On normalise Tbl
                '-----------------------------------------------Pour chaque ligne i, on boucle sur tous les cas de 1 à 9
                For j = 1 To 9
                    If j = 1 Then
                        Tbl = normTbl                          'Pour la cas1 le tableau final est celui normalisé
                    Else
                        Tbl = Reorganize(normTbl, j)           'Pour les autres cas j on réorganise le tableau en fonction de j
                    End If
                    If ArrayZero(Tbl) Then Exit For            'Si le tableau résultat ne comporte que des 0, on arrête et on passe à la ligne i suivante
                    On Error Resume Next                       'à partir d'ici, création des feuilles CAS_j si elle n'exisyent pas et report des tableaux réorganisés pour chaque ligne
                    Set Sh = Sheets("CAS_" & j)
                    On Error GoTo 0
                    If Sh Is Nothing Then
                        Set Sh = Sheets.Add(After:=Worksheets(Worksheets.Count))
                        Sh.Name = "CAS_" & j
                        Sh.Cells.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, Formula1:="=0"
                        Sh.Cells.FormatConditions(1).Interior.ColorIndex = 53
                    End If
                    Sh.Range(Sh.Cells(i, Deb), Sh.Cells(i, 158)).Value = Tbl
                    Sh.Range("A1:BF1").ColumnWidth = 1
                    Sh.UsedRange.Columns.AutoFit
                    Set Sh = Nothing
                    Erase Tbl
                Next j
                '-----------------------------------------------
            End If
            Erase normTbl
            Set Plage = Nothing
            DoEvents
            Application.StatusBar = String(80, " ") & "Traitement en cours... " & Application.RoundUp(100 * (i - 20) / (LastLig - 20), 0) & "%"
        Next i
        .Activate
    End With
    Application.StatusBar = ""
    Application.ScreenUpdating = True
    MsgBox "Traitement terminé..."
    End Sub

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Par défaut
    dsl de revenir dessus c plus simplme comme ca plutot que de rouvrir un autre post et tout rééxpliquer, mais j'ai des cellules vides là ou jvoudrais des 0, par exemple, pour le cas 5 de AM47 à FB47, j'ai rien alors que dans l'onglet data j'ai des chiffres, et donc j'aimerais des 0 à ces endroits là meme si c correct y'a pas de 5 ou -5 à cette ligne là, idem pour toutes les autres lignes et les autres cas1....
    Merci, j'essaye de la modifier la macro mais jla comprends pas assez pour le faire
    Merci beucoup.

  17. #17
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    C'était fait exprès pour gagner un peux de temps (un tableau rempli de 0 est sans utilité) mais bon
    Voilà la modification (Sub APPLIQUER)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Function Normalize(Tb As Variant) As Integer()
    Dim Tmp() As Integer
    Dim i As Integer, Hi As Integer
    Dim Lo As Byte
     
    Lo = LBound(Tb): Hi = UBound(Tb)
    ReDim Tmp(Lo To Hi)
    Tmp(Lo) = 0
    For i = Lo + 1 To Hi
       If Tb(i) > Tb(i - 1) Then
          Tmp(i) = 1
       ElseIf Tb(i) < Tb(i - 1) Then
          Tmp(i) = -1
       End If
    Next i
    Normalize = Tmp
    Erase Tmp
    End Function
     
    Private Function Reorganize(Tblo As Variant, Ind As Byte) As Integer()
    Dim tmpTblo() As Integer
    Dim i As Integer, j As Integer, k As Integer
    Dim Hi As Integer
    Dim Lo As Byte
     
    Lo = LBound(Tblo): Hi = UBound(Tblo)
    ReDim tmpTblo(Lo To Hi)
    For i = Lo To Hi
       If Tblo(i) > 0 Then
          j = j + 1
       ElseIf Tblo(i) < 0 Then
          k = k - 1
       End If
       If j = Ind Then
          tmpTblo(i) = Ind
          j = 0
       ElseIf k = -Ind Then
          tmpTblo(i) = -Ind
          k = 0
       End If
    Next i
    Reorganize = tmpTblo
    Erase tmpTblo
    End Function
     
    Public Function ArrayZero(Tbl As Variant) As Boolean
    ArrayZero = (Application.Max(Tbl) = 0) And (Application.Min(Tbl) = 0)
    End Function
     
    Sub APPLIQUER()
    Dim Sh As Worksheet
    Dim Tbl() As Integer, normTbl() As Integer
    Dim LastLig As Long, i As Long
    Dim j As Byte, k As Byte, Deb As Byte
    Dim Plage As Range, c As Range
     
    Application.ScreenUpdating = False
    With Sheets("Data")
        LastLig = .Cells(.Rows.Count, "FB").End(xlUp).Row                'Dernière ligne de donnée (Colonne BF comme référence)
        For i = 20 To LastLig
            Set Plage = .Range("AL" & i & ":FB" & i)                     'On cherche pour chaque ligne i la colonne de debut des données Deb
            Set c = Plage.Find("*")
            If Not c Is Nothing Then                                     'Si la ligne n'est pas vide
                Deb = c.Column
                Set c = Nothing
                ReDim Tbl(1 To 159 - Deb)                                'On met dans tbl les données de la ligne i (de Deb jusqu'à la colonne BF)
                For k = 1 To 159 - Deb
                    Tbl(k) = .Cells(i, k + Deb - 1).Value
                Next k
                ReDim normTbl(1 To 159 - Deb)
                normTbl = Normalize(Tbl)                                 'On normalise Tbl
                '-----------------------------------------------Pour chaque ligne i, on boucle sur tous les cas de 1 à 9
                For j = 1 To 9
                    If j = 1 Then
                        Tbl = normTbl                                    'Pour la cas1 le tableau final est celui normalisé
                    Else                                                 'Pour les autres cas j on réorganise le tableau en fonction de j
                        If Not ArrayZero(Tbl) Then Tbl = Reorganize(normTbl, j)    'Si le tableau résultat ne comporte que des 0, on arrête l'organisation des données
                    End If
                    On Error Resume Next                                 'à partir d'ici, création des feuilles CAS_j si elle n'exisyent pas et report des tableaux réorganisés pour chaque ligne
                    Set Sh = Sheets("CAS_" & j)
                    On Error GoTo 0
                    If Sh Is Nothing Then
                        Set Sh = Sheets.Add(After:=Worksheets(Worksheets.Count))
                        Sh.Name = "CAS_" & j
                        Sh.Cells.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, Formula1:="=0"
                        Sh.Cells.FormatConditions(1).Interior.ColorIndex = 53
                    End If
                    Sh.Range(Sh.Cells(i, Deb), Sh.Cells(i, 158)).Value = Tbl
                    Sh.Range("A1:BF1").ColumnWidth = 1
                    Sh.UsedRange.Columns.AutoFit
                    Set Sh = Nothing
                Next j
                '-----------------------------------------------
            End If
            Erase normTbl
            Set Plage = Nothing
            DoEvents
            Application.StatusBar = String(80, " ") & "Traitement en cours... " & Application.RoundUp(100 * (i - 20) / (LastLig - 20), 0) & "%"
        Next i
        .Activate
    End With
    Application.StatusBar = ""
    Application.ScreenUpdating = True
    MsgBox "Traitement terminé..."
    End Sub

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Par défaut
    merci encore

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 61
    Par défaut
    juste une toute petite dernière chose encore desole
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sh.Cells.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, Formula1:="=0"
                        Sh.Cells.FormatConditions(1).Interior.ColorIndex = 53
    avec ca, ca me colorie en couleur 53 tout ce qui est différent de 0 et comme je veux rajouter des calculs dans les onglets ca me colorie en couleur 53
    et donc j'ai essayé xlEqual, Formula1:="=j"
    pour essayer de colorier que les cellules ou on a un j ou un -j mais ca ne marche pas
    Merci

  20. #20
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    Au lieu d'appliquer la MFC à toutes les cellules de ta feuille, applique la à ta plage de données utile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sh.Range("TaPlage").FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, Formula1:="=0"
                        Sh.Cells.FormatConditions(1).Interior.ColorIndex = 53

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vérification Macro Terminée
    Par EnzoExcel dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/12/2014, 11h11
  2. [XL-2003] Double conditions pour terminer une macro
    Par ThSPB dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/03/2011, 16h28
  3. Message "terminé" apres execution d'un macro
    Par VELO1222 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/01/2011, 19h09
  4. Macro timer sur terminal Bray
    Par kurtabar dans le forum Autres systèmes
    Réponses: 1
    Dernier message: 09/07/2009, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo