éviter qu'une macro remonte des valeurs à 0 [résolu]

tben08

XLDnaute Occasionnel
Bonjour,

Dans mon fichier j'ai une macro qui va me créer un tableau avec en colonne A les numéros de société qui sont en colonne, en colonne B les numéros de compte qui sont en lignes et et colonne C les valeurs dans le tableau. Ma macro fonctionne correctement sauf qu'elle me remonte les valeurs à zéro et je ne souhaiterais pas que la macro les remonte, est-ce possible?

voici la macro :

HTML:
Sub For_X_to_Next_Colonne()
    firstline = 7
    lastline = 27
    accountcol = 5
    testligne = 1
    testcolonne = 1
    testmontant = 1
    'Boucle société
    
    i = 8
    Sheets("Feuil1").Select
    
    Do While (Cells(5, i).Value <> "")
       
        j = firstline
        
        Do While (j <= lastline)
        company = Cells(5, i).Value
        compte = Cells(j, 4).Value
        If montant = 0 Then
        Loop
        montant = Cells(j, i).Value
        Sheets("Feuil3").Select
        Cells(testligne, 1).Value = StringFormat("=""{0}""", company)
        testligne = testligne + 1
        Cells(testcolonne, 2).Value = compte
        testcolonne = testcolonne + 1
        Cells(testmontant, 3) = montant
        testmontant = testmontant + 1
        j = j + 1
        
        Sheets("Feuil1").Select
         
        Loop

        i = i + 1
    Loop
End Sub

Merci pour votre aide.
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : éviter qu'une macro remonte des valeurs à 0

bonjour tben08

a tester:
Code:
....
testcolonne = testcolonne + 1
if montant=0 then montant=""
Cells(testmontant, 3) = montant
......

Bien entendu la cellule de réception doit etre au format General et non numerique
 

tben08

XLDnaute Occasionnel
Re : éviter qu'une macro remonte des valeurs à 0

Merci Pierrejean mais j'ai du mal m'exprimer.

En fait là quand je lance la macro si j'ai un montant ) zéro ça va me donner ça :

colonne A : 0100000
Colonne B : 1500000
Colonne C : 0

Ce que je voudrais c'est qu'il ne m'affiche pas du tout la ligne car elle ne me sert à rien.

Suis-je plus clair?

Merci pour ton aide
 

Dranreb

XLDnaute Barbatruc
Re : éviter qu'une macro remonte des valeurs à 0

Bonjour.
Utilisez des variables différentes pour les indices de lignes d'entrée et de sortie, et n'incrémentez celle de sortie que si le montant n'est pas nul. Mais faites tout ça avec des tableaux, pas en travaillant directement sur les cellules, c'est trop long.
 

Dranreb

XLDnaute Barbatruc
Re : éviter qu'une macro remonte des valeurs à 0

Salut Pierrejean.
En fait il en à joint un à cette discussion meême avec la macro, mais le modèle du résultat souhaité.
Désolé mais je n'ai pas compris grand chose
Ça veut dire que votre procédure devra comporter les éléments suivants :
VB:
Sub For_X_to_Next_Colonne()
Dim TE(), LE&, CE&, TS(), LS&, CS&
TE() = Feuil1.[D7:N67].Value
ReDim TS(1 To 500, 1 To 500)
…
     TS(LS, CS) = TE(LE, CE)
…
Feuil3.[B2].Resize(LS, 500).Value = TS
End Sub
Après il faut mettre autour les For LE et For CE qui vont bien et incrémenter quand il faut les CS et LS


Ce qui peut donner quelque chose comme ça :
VB:
Sub For_X_to_Next_Colonne()
Dim TE(), LE&, CE&, TS(), LS&, CS&
TE() = Feuil1.[D5:M67].Value
ReDim TS(1 To 500, 1 To 500)
For CE = 5 To UBound(TE, 2)
   CS = 1
   For LE = 3 To UBound(TE, 1) - 1
      If TE(LE, CE) <> 0 Then
         If CS = 1 Then LS = LS + 1: TS(LS, CS) = TE(1, CE)
         CS = CS + 1
         TS(LS, CS) = TE(LE, CE) '(?)
         End If: Next LE, CE
Feuil2.Cells.ClearContents
Feuil2.[B2].Resize(LS, 500).Value = TS
End Sub
(Testé: ça marche. Je ne sais pas si ça donne ce que vous voulez par contre.)
 
Dernière édition:

tben08

XLDnaute Occasionnel
Re : éviter qu'une macro remonte des valeurs à 0

Non ce c'est pas tout à fait ce que je veux.

Dans le fichier ci-joint vous trouverez le résultat de ma macro en feuil3 et ce que j'aimerais en Feuil2.

Alors je pourrais lancer une 2 nde macro pour supprimer les lignes vides mais je préfèrerais que ce soit la première macro qui le fasse directement.
 

Pièces jointes

  • test2.xlsm
    28.1 KB · Affichages: 34
  • test2.xlsm
    28.1 KB · Affichages: 35

Dranreb

XLDnaute Barbatruc
Re : éviter qu'une macro remonte des valeurs à 0

C'est très proche du code que je vous ai proposé en fin de compte dans l'autre discussion, sauf que les colonnes 2 à 4 des données ne sont pas reproduites.
Je le repropose ici :
VB:
Option Explicit

Sub For_X_to_Next_Colonne()
Dim TE(), LE&, CE&, TS(), LS&, CS& ' Partout les 1ères lettres
'                   de Taleau, Ligne, Colonne, Entrée, Sortie.
TE = Feuil1.[D5:M67].Value
ReDim TS(1 To 150000, 1 To 6)
For CE = 5 To UBound(TE, 2)
   For LE = 3 To UBound(TE, 1) - 1
      If TE(LE, CE) <> 0 Then
         LS = LS + 1
         TS(LS, 1) = TE(1, CE)
         For CS = 2 To 5: TS(LS, CS) = TE(LE, CS - 1): Next CS
         TS(LS, 6) = TE(LE, CE)
         End If: Next LE, CE
Feuil2.Cells.ClearContents
Feuil2.[B2].Resize(LS, 6).Value = TS
End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : éviter qu'une macro remonte des valeurs à 0

Vous pouvez l'améliorer un peu comme ça :
VB:
Sub For_X_to_Next_Colonne()
Dim TE(), LE&, CE&, TS(), LS&, CS& ' Partout les 1ères lettres
'                   de Taleau, Ligne, Colonne, Entrée, Sortie.
TE = Intersect(Feuil1.[D5:AAA999999], Feuil1.UsedRange).Value
ReDim TS(1 To 150000, 1 To 6)
For CE = 5 To UBound(TE, 2) - 1
   For LE = 3 To UBound(TE, 1) - 1
      If TE(LE, CE) <> 0 Then
         LS = LS + 1
         TS(LS, 1) = TE(1, CE)
         For CS = 2 To 5: TS(LS, CS) = TE(LE, CS - 1): Next CS
         TS(LS, 6) = TE(LE, CE)
         End If: Next LE, CE
Feuil2.Cells.ClearContents
Feuil2.[B2].Resize(LS, 6).Value = TS
End Sub
Qu'est ce que vous ne comprenez pas exactement ?
 

tben08

XLDnaute Occasionnel
Re : éviter qu'une macro remonte des valeurs à 0

Vous utilisez des termes que je n'ai jamais utilisé donc très flou pour moi.

j'ai quand même réussi à faire ce que je voulais :

HTML:
Sub For_X_to_Next_Colonne()
    firstline = 7
    lastline = 27
    accountcol = 5
    testligne = 1
    testcolonne = 1
    testmontant = 1
    'Boucle société
    
    i = 8
    Sheets("Feuil1").Select
    
    Do While (Cells(5, i).Value <> "")
       
        j = firstline
        
        Do While (j <= lastline)
        company = Cells(5, i).Value
        compte = Cells(j, 5).Value
        montant = Cells(j, i).Value
        If compte <> 0 Then
        If montant <> 0 Then
            Sheets("Feuil3").Select
            Cells(testligne, 1).Value = StringFormat("=""{0}""", company)
            testligne = testligne + 1
            Cells(testcolonne, 2).Value = compte
            testcolonne = testcolonne + 1
            
            Cells(testmontant, 3) = montant
            testmontant = testmontant + 1
        End If
        End If
        
        j = j + 1
        
        Sheets("Feuil1").Select
         
        Loop

        i = i + 1
    Loop       
            
End Sub

Merci d'avoir pris le temps de me répondre
 

Dranreb

XLDnaute Barbatruc
Re : éviter qu'une macro remonte des valeurs à 0

Peut être reviendrez vous à ma solution, qui demeurera quasi instantanée, quand la vôtre commencera à durer de nombreuses minutes…
J'en livre quand même la dernière version :
VB:
Sub For_X_to_Next_Colonne()
Dim TE(), LE&, CE&, TS(), LS&, CS& ' Partout les 1ères lettres
'                   de Taleau, Ligne, Colonne, Entrée, Sortie.
TE = Intersect(Feuil1.[D5:XFD1048576], Feuil1.UsedRange).Value
ReDim TS(1 To UBound(TE, 1) * UBound(TE, 2), 1 To 6)
For CE = 5 To UBound(TE, 2) - 1
   For LE = 3 To UBound(TE, 1) - 1
      If TE(LE, CE) <> 0 Then
         LS = LS + 1
         TS(LS, 1) = TE(1, CE)
         For CS = 2 To 5: TS(LS, CS) = TE(LE, CS - 1): Next CS
         TS(LS, 6) = TE(LE, CE)
         End If: Next LE, CE
Feuil2.Cells.ClearContents
With Feuil2.[B2].Resize(LS, 6)
   .Columns(1).Resize(, 5).NumberFormat = "@"
   .Columns(6).NumberFormat = "0.00"
   .Value = TS
   .Columns.AutoFit
   End With
End Sub
 
Dernière édition:

tben08

XLDnaute Occasionnel
Re : éviter qu'une macro remonte des valeurs à 0

oui en effet c'est instantané, la mienne prend 5 minutes

est-ce que vous pouvez me la détailler que je puisse la comprendre et l'adapter?


je ne comprends pas les LE, CE, TS, LS, CS, enfin je ne comprends pas grand chose :)
 

Dranreb

XLDnaute Barbatruc
Re : éviter qu'une macro remonte des valeurs à 0

Ce sont des variables locales. Comme indiqué en commentaire, celles commençant par T sont des tableaux en mémoire, les L sont les numéros de ligne, les C de colonnes et tous ces noms se terminent par E pour entrée et S pour sortie. Comme ça on sait toujours ce qu'on fait après. Enfin moi, en tout cas.
 

Discussions similaires

Réponses
7
Affichages
485

Statistiques des forums

Discussions
311 725
Messages
2 081 948
Membres
101 849
dernier inscrit
florentMIG