é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:

Dranreb

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

Dim TE(), LE&, CE&, TS(), LS&, CS& ' Partout les 1ères lettres
' de Taleau, Ligne, Colonne, Entrée, Sortie.
Bon ben ça ce sont les déclarations des variables. Les () demande un tableau dynamique, c'est à dire de dimensions indéterminées, d'éléments de type Variant. Les & sont une abréviation pour As Long soit entier codé sur 4 octets.

TE = Intersect(Feuil1.[D5:XFD1048576], Feuil1.UsedRange).Value
Feuil1.[D5:XFD1048576] établit au moyen de la méthode Evaluate de l'objet worksheet dont le nom est Feuil1 la plage allant de la cellule D5 jusqu'à la dernière cellule de la feuille
Feuil1.
UsedRange représente la plage effectivement utilisée dans cette même feuille.
Intersect est une méthode de l'objet Application qui rend un objet range représentant l'intersection entre les 2, donc ici de D5 à la dernière utilisée. La propriété Value du Range obtenu est un tableau d'éléments de type Variant, qui est affecté à TE.

ReDim TS(1 To UBound(TE, 1) * UBound(TE, 2), 1 To 6)
Donne ses dimensions au tableau dynamique. UBound(TE, 1) représente le nombre de lignes de TE, UBound(TE, 2) le nombre de colonnes.
For CE = 5 To UBound(TE, 2) - 1
For LE = 3 To UBound(TE, 1) - 1
If TE(LE, CE) <> 0 Then
Comme vous le voyez, un élément de tableau se spécifie par son nom suivi des indices entre parenthèses.

Bon. Vous avez peut être déjà assez à lire jusque là, et j'espère que le reste découlera de soit pour vous…
 
Dernière édition:

tben08

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

Quand j'essaie de renommer feuil1 par report et feuill2 par base ça ne fonctionne plus.

Il me dit variable non définie.

Pouvez-vous m'aider?

j'aurais également aimé que la macro commence à la ligne B2.

Merci pour ton aide
 

Dranreb

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

Bonjour.

Attention : j'ai parlé
de l'objet worksheet dont le nom est Feuil1
et non pas du nom Excel de la feuille que cet objet représente. Si vous voulez savoir quel nom il faut mettre pour l'objet Workseet représentant une feuille qui s'appellerait "base" pour Excel, vous pouvez exécuter dans une petite procédure : MsgBox Worksheets("base").CodeName. Vous pouvez aussi changer ce nom coté VBA dans la fenêtre de propriété en le sélectionnant dans la rubrique Microsoft Excel Objets.
Pour changer la cellule de début des plages d'entrée ou de sortie ça se situe au niveau des adresses spécifiées entres crochets droits. C'est aussi ça l'intérêt de travailler l'essentiel avec des tableux en mémoire, il n'y a que le début ou la fin à changer si les infos changent de place.
 
Dernière édition:

tben08

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

Je commence à comprendre.

par contre j'ai rentré la macro dans le fichier réel et ça ne fonctionne plus. je pense avoir trouvé le problème :

HTML:
TE = Intersect(Feuil1.[D5:XFD1048576], Feuil1.UsedRange).Value

le XFD1048576 correspond au point le plus bas du tableau virtuel sauf que cette donnée peut varier car je peux avoir plus de ligne et plus de colonnes.

J'ai voulu lui dire de commencer en E5 car je souhaite avoir les comptes français et ça ne fonctionne pas non plus
 

Dranreb

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

XFD1048576 correspond à la dernière cellule possible d'une feuille. Je ne vois pas ce qui cloche. À moins que la feuille soit vide à partir de la cellule D5, auquel cas il ne saurait y avoir d'intersection entre le reste de la feuille à partir de cette cellule et la UsedRange.
 

tben08

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

voici le fichier tel qu'il sera en version définitive mais en fonction du nombre de société les colonnes peuvent varier et pareil pour les comptes comptables.
 

Pièces jointes

  • test3.xlsx
    103.3 KB · Affichages: 30
  • test3.xlsx
    103.3 KB · Affichages: 30

tben08

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

XFD1048576 correspond à la dernière cellule possible d'une feuille. Je ne vois pas ce qui cloche. À moins que la feuille soit vide à partir de la cellule D5, auquel cas il ne saurait y avoir d'intersection entre le reste de la feuille à partir de cette cellule et la UsedRange.

regarde le tableau que j'ai mis, si on prend la dernière cellule possible ça va me prendre du texte.
 

Dranreb

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

J'avais dé jà fait For CE = 5 To UBound(TE, 2) - 1 pour éviter la colonne total. Mais là il vaudrait peut être mieux ne plus charger de trop nombreuses cellules inutiles. Déclarez un Plage As Range, décomposez en plusieurs instructions le chargement: Set Plage = Intersect(etc. puis Set Plage = Plage.Resize(Plage.Rows.Count - 1, Plage.Columns.Count - LeNombreDeColonnesInutiles) et enfin TE = Plage.Value et ne mettez plus les - 1 derrière les Ubound(TE, …) dans les For
 
Dernière édition:

Dranreb

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

Il serait possible de mettre un nom dans le classeur qui se réfèrerait à la bonne plage.
Il suffirait alors de faire TE = [LeNom].Value
À défaut un nom à la colonne Total serait pas mal.
On peut aussi chercher avec un Find la cellule contenant "Total"
Mettre les données sous forme de tableau apporterait d'autres possibilités.

Essayez comme ça :
VB:
Sub For_X_to_Next_Colonne()
Dim PlageDon As Range, TE(), LE&, CE&, TS(), LS&, CS& ' Partout les 1ères lettres
'                                     de Talbeau, Ligne, Colonne, Entrée, Sortie.
Set PlageDon = Feuil1.Rows(5).Find(What:="Total", After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Offset(, -1)
Set PlageDon = Intersect(Feuil1.Range(Feuil1.Columns("D"), PlageDon),Feuil1.[5:1048576], Feuil1.UsedRange)
TE = PlageDon.Resize(PlageDon.Rows.Count - 1).Value
ReDim TS(1 To UBound(TE, 1) * UBound(TE, 2), 1 To 6)
For CE = 5 To UBound(TE, 2)
   For LE = 3 To UBound(TE, 1)
… (et la suite pareil)
 
Dernière édition:

tben08

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

en fait juste avant la ligne des totaux j'ai une ligne et une colonne qui resteront toujours vide. j'ai donc pris la cellule du croisement de cette ligne et colonne et je lui ai donné un nom que j'ai incorporé à la macro. 9a semble fonctionner. Qu’en penses-tu?

HTML:
Sub recopieok()
Dim TE(), LE&, CE&, TS(), LS&, CS& ' Partout les 1ères lettres
'                   de Taleau, Ligne, Colonne, Entrée, Sortie.
TE = Intersect(Feuil4.[D5:fin], Feuil4.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
Feuil19.Cells.ClearContents
With Feuil19.[B2].Resize(LS, 6)
   .Columns(1).Resize(, 5).NumberFormat = "@"
   .Columns(6).NumberFormat = "0.00"
   .Value = TS
   .Columns.AutoFit
   End With
End Sub
 

Discussions similaires

Réponses
0
Affichages
153
Réponses
7
Affichages
534

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 229
Messages
2 086 426
Membres
103 206
dernier inscrit
diambote