1. Ce site utilise des "témoins de connexion" (cookies) conformes aux textes de l'Union Européenne. Continuer à naviguer sur nos pages vaut acceptation de notre règlement en la matière. En savoir plus.

Tableaux dans vba

Discussion dans 'Forum Excel' démarrée par akni, 8 Mars 2017.

?

Tableau

  1. Choix du sondage...

  2. Choix du sondage...

Les résultats sont uniquement visibles après avoir voté.
  1. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14943
    "J'aime" reçus :
    925
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Bonjour.
    Je pense que j'ajouterais une colonne au TS où je mettrais 1 pour la ligne de total, et que je le ferais à la fin, après le versement du TS, soit avec une mise en forme conditionnelle d'après cette colonne soit avec un SpecialCells(xlCelTypeConstants).
     
  2. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    Bonjour le fil,
    Merci Jean marie et Lone-wolf. Je vais tester vos propositions.
    @jean marie, Toujours le plaisir de te lire.

    OK pour Interior.Color=xlNone, mais pour Font.Color, je dois donner une couleur (noire par ex ) sinon on ne voit plus rien.

    KIM
     
  3. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    Bonjour Dranreb, et les amis,
    @Dranreb,
    Dans TS j'ai rajouté une ligne pour le cumul avec en première colonne "Total pour " & OP.ID. Je peux mettre seulement "Total" en 1è col et dans la suivante " pour " & OP.ID
    Est-ce que cela n'est pas suffisant pour formater la ligne ou apparait "Total" ? et si oui comment?

    Merci
    KIM
     
  4. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14943
    "J'aime" reçus :
    925
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Je n'ai pas dis de rajouter une ligne, mais une colonne, qui servira à identifier s'il s'agit d'une ligne de Total en y mettant 1.
     
  5. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    @Dranreb,
    La ligne du total existe déjà. Le cumul commence à la col 4 du TS. En col 1 j'ai mis le texte "Total ..." pour identifier cette ligne des autres lignes à la lecture du tableau.
    Dans la col 1, il n'y a que du texte. Je peux mettre 1 pour la ligne du total. Quelle est la syntaxe complète pour identifer cette ligne avec 1 et mettre en gras et en jaune le fond.
    Merci
    KIM
     
  6. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14943
    "J'aime" reçus :
    925
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Ça dépend de la solution que tu veux mettre en œuvre pour ça.
    Il vaut mieux une nouvelle colonne en fin qui n’interagit pas avec ce qu'il peut y avoir dedans à d'autres lignes.
    La plus simple c'est avec une MeFC. Dans ce cas il ne reste qu'à mettre le format de nombre ;;; pour que le contenu de la colonne en cause ne se voie pas. Sinon un With LaFameuseColonne.SpecialCells(xlCelTypeConstants).EntireRow sera une excellente 1ère instruction pour y changer .Font (.Color, .Bold) et .Interior.Color, et la colonne ayant servi de critère peut ensuite être supprimée.
     
  7. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    Merci Dranreb, je vais essayer.
    KIM
     
  8. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    Bonjour Dranreb,
    J'ai créé la col avec valeur = 1 et formaté la ligne selon une boucle classique :
    Code (Text):
    For L = 5 To derl
                If FTS.Range("O" & L).Value = 1 Then
                    FTS.Range("C" & L, "N" & L).Interior.ColorIndex = 6
                    FTS.Range("C" & L, "N" & L).Font.Bold = True
                    FTS.Range("C" & L, "N" & L).NumberFormat = "#,##0"
                End If
        Next L
    Je n'ai pas réussi à utiliser ta méthode avec
    With LaFameuseColonne.SpecialCells(xlCelTypeConstants).EntireRow
    sachant que sur une feuille j'ai plusieurs tableaux et sont créés de la manière suivante :
    'CFIN est déjà calculé et = 13
    'FTS.[C4].Resize(100, CFIN).ClearContents
    'FTS.[C4].Resize(L, CFIN).Value = TS

    Merci d'avance de ton aide pour intégrer ce formatage après avoir recopié le tableau TS à partir d'une cellule C4 par exemple.
    KIM
     

    Pièces jointes:

  9. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14943
    "J'aime" reçus :
    925
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Bonjour
    Si tu avais mis Option Explicit en tête du module tu aurais eu avant toute tentative d'exécution des messages clairs de variables non définies dans With FTS.Columns(O).SpecialCells(xlCelTypeConstants).EntireRow, d'abord sur xlCelTypeConstants, mal orthographié, c'est de ma faute et ensuite sur O, c'est de la tienne. Comme ça ça ne plante plus :
    Code (Visual Basic):
    PlgDon.Interior.Color = xlNone
    With FTS.Columns("O").SpecialCells(xlCellTypeConstants).EntireRow
       .Interior.ColorIndex = 6
       .Font.Bold = True
       .NumberFormat = "#,##0"
       End With
     
  10. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    Merci Dranreb,
    la ligne de code : With FTS.Columns("O").SpecialCells(xlCellTypeConstants).EntireRow
    formate toute la ligne (EntireRow).
    Comment modifier cette ligne de code pour dire :
    formater à partir de la 1è col du tableau en se déplaçant de CFIN -1 col
    car
    Mon souci est que j'ai plusieurs tableaux dans ma feuille et chaque tableau est recopié via :
    dans mon exemple CFIN=13
    FTS.[C4].Resize(25, CFIN).ClearContents
    'FTS.[C4].Resize(L, CFIN).Value = TS
    un autre
    FTS.[R4].Resize(50, CFIN).ClearContents
    'FTS.[R4].Resize(L, CFIN).Value = TS

    Pour chaque tableau CFIN est calculée de la façon suivante :
    Set DicTit = GigIdx.DicInvent(LOt, ColTitre, ColDep): CFin = ColDep + DicTit.Count + 1

    Merci d'avance
    KIM
     

    Pièces jointes:

  11. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14943
    "J'aime" reçus :
    925
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Et bien fais une intersection avec la plage résultante
    With Intersect(FTS.[C:C].Resize(, CFIN - 1), FTS.Columns("O").SpecialCells(xlCellTypeConstants).EntireRow)
     
  12. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    Mzeci Dranreb,
    Cela fonctionne mais c'est limité pour mes feuilles avec un nombre de tableaux important.
    Est-il possible de prendre en compte les 2 cas suivants dans la ligne de commande With Intersect ... ?

    Modifier : With Intersect(FTS.[C:C].Resize(, CFIN - 1), FTS.Columns("O").SpecialCells(xlCellTypeConstants).EntireRow)
    pour
    1/ Comment modifier Intersect(FTS.[C:C]. pour prendre en compte le tableau suivant : de la C4 jusqu à 22 lignes au dessous, jusqu à la col CFIN
    FTS.[C4].Resize(25, CFIN).ClearContents
    'FTS.[C4].Resize(L, CFIN).Value = TS
    2/ FTS.Columns("O").SpecialCells :
    Je ne connais pas à l'avance la col O. je ne connais que la valeur CFIN : c'est CFIN colonnes après la col de départ col C.

    Merci d avance
    KIM
     
  13. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14943
    "J'aime" reçus :
    925
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    De toute façon il n'y a pas de 1 dans la colonne CFIN ailleurs que dans les lignes où tu l'a mis alors tu peux bien prendre les colonnes entières, non ? Ou alors définit une RngRés pour la manipuler plus facilement. Moi c'est ce que je ferais. Set RngRés = FTS.[C4].Resize(25, CFin) comme ça c'est Intersect(RngRés, RngRés.Columns(CFin).EntireRow)
     
    Dernière édition: 12 Août 2018
  14. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    J'ai simplifié la présentation du résultat. En réalité j'ai plusieurs tableaux l'un derrière l'autre et ensuite d'autres tableaux à droite.
    Sur la même feuille
    FTS.[A4].Resize(10, CFin).ClearContents
    FTS.[A4].Resize(L, CFin).Value = TSop
    '
    FTS.[A20].Resize(22, CFin).ClearContents
    FTS.[A20].Resize(L, CFin).Value = TSopdpt
    '
    FTS.[A50].Resize(22, CFin).ClearContents
    FTS.[A50].Resize(L, CFin).Value = TSopcho
    '
    FTS.[X4].Resize(500, CFin).ClearContents
    FTS.[X4].Resize(L, CFin).Value = TSopDptEqp

    Je vais tester ta proposition.
    Merci encore
    KIM
     
  15. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    Voilà le code selon tes recommandations :
    1/ j'ai formaté la ligne des titres du tableau avec :
    With FTS.[C4].Resize(1, CFIN)
    2/ le reste du tableau est formaté avec la ligne de code suivante :
    With Intersect(RngRés, RngRés.Columns(CFIN).SpecialCells(xlCellTypeConstants).EntireRow)

    As-tu des commentaires ou améliorations ?

    Merci encore
    KIM

    Code (Visual Basic):
    Set RngRés = FTS.[C4].Resize(25, CFIN)
    RngRés.Interior.Color = xlNone
    RngRés.Font.ColorIndex = xlAutomatic

    With FTS.[C4].Resize(1, CFIN)
       .Interior.ColorIndex = 11
       .Font.Bold = True
       .Font.ThemeColor = xlThemeColorDark1
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
    End With

    With Intersect(RngRés, RngRés.Columns(CFIN).SpecialCells(xlCellTypeConstants).EntireRow)

       .Interior.ColorIndex = 6
       .Font.Bold = True
       .NumberFormat = "#,##0"
       End With
     
    End Sub
     
     

    Pièces jointes:

  16. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14943
    "J'aime" reçus :
    925
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Non, pas grand chose. Si ce n'est que FTS.[C4].Resize(1, CFIN) du coup c'est RngRés.Rows(1)
    Quand on définit un Range c'est pour ne plus avoir à utiliser d'expression Worksheet.Range et par exemple si besoin la changer de place dans une seule instruction.
     
  17. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    Pour mieux maitriser la ligne de code With Intersect(RngRés, RngRés.Columns(CFIN).SpecialCells(xlCellTypeConstants).EntireRow)
    Comment je peux la modifier pour dire :
    Si je retrouve le mot "Total" dans la 1è col du tableau, formater la ligne :
    With Intersect(RngRés, RngRés.Columns(2).SpecialCells(xlCellTypeConstants).Find("Total").EntireRow)
    ne formate que la ligne du 1ier "Total" trouvé.
    Pourquoi?
    Merci Dranreb
    KIM
     
  18. Dranreb

    Dranreb XLDnaute Barbatruc

    Inscrit depuis le :
    31 Janvier 2011
    Messages :
    14943
    "J'aime" reçus :
    925
    Sexe :
    Masculin
    Habite à:
    Belfort
    Utilise:
    Excel 2016 (PC)
    Bon j'ai des fonctions de service qui renvoient un objet Range de cellules obéissant à une condition :
    Code (Visual Basic):
    Function ColLignesOùRelat(ByVal CelDéb As Range, ByVal ColQuoi, ByVal OPé As String, ByVal Valeur) As Range
    Rem. ——— Cellules partant de CelDéb dans sa colonne où la colonne ColQuoi est en relation Opé avec Valeur.
       Set ColLignesOùRelat = Intersect(LignesOùRelat(CelDéb, ColQuoi, OPé, Valeur), CelDéb.EntireColumn)
       End Function
    Function LignesOùRelat(ByVal LigneDéb As Range, ByVal ColQuoi, ByVal OPé As String, ByVal Valeur) As Range
    Rem. ——— Lignes entières partant de LigneDéb où la colonne ColQuoi est en relation Opé avec une Valeur.
       If Not IsNumeric(ColQuoi) Then ColQuoi = LigneDéb.Worksheet.Columns(ColQuoi).Column
       If VarType(Valeur) = vbString Then Valeur = """" & Replace(Valeur, _
          """", """""") & """" Else Valeur = Trim$(Str$(Valeur))
       Set LignesOùRelat = LignesOùCondR1C1(LigneDéb, CondR1C1:="RC" & ColQuoi & OPé & Valeur)
       End Function
    Function ColLignesOùCondR1C1(ByVal CelDéb As Range, ByVal CondR1C1 As String) As Range
    Rem. ——— Cellules partant de CélDéb dans sa colonne dont les lignes vérifient une condition R1C1 CondR1C1.
       Set ColLignesOùCondR1C1 = Intersect(LignesOùCondR1C1(CelDéb, CondR1C1), CelDéb.EntireColumn)
       End Function
    Function LignesOùCondR1C1(ByVal LigneDéb As Range, ByVal CondR1C1 As String) As Range
    Rem. ——— Lignes entières partant de LigneDéb qui vérifient une condition R1C1 CondR1C1.
       Dim Lignes As Range, ColTrv As Range
       With LigneDéb.Worksheet.UsedRange
          Set Lignes = LigneDéb.EntireRow.Resize(.Rows.Count + .Row - LigneDéb.Row)
          Set ColTrv = Intersect(.Columns(.Columns.Count + 1), Lignes): End With
       ColTrv.FormulaR1C1 = "=1/(" & CondR1C1 & ")"
       On Error Resume Next
       Set LignesOùCondR1C1 = ColTrv.SpecialCells(xlCellTypeFormulas, 1).EntireRow
       ColTrv.Delete xlShiftToLeft
       End Function
    Le truc c'est qu'elles partent d'une ligne spécifiée et l'applique pour tout le reste de la feuille. Alors il faudrait soit que tous les tableaux aient ce "Total" dans la même colonne soit faire ces mises en forme après constitution de chaque tableau.
    Mais ça permettrait d'écrire un truc du genre :
    Code (Visual Basic):

    With ColLignesOùCondR1C1(RngRés, "LEFT(RC3,5)=""Total""")
     
    Dernière édition: 12 Août 2018
  19. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    Bonjour Dranreb,
    Merci pour ces fonctions, elles vont m'être utiles. je vais les tester.
    Est-ce que je peux copier ces fonctions dans le module MGigogne ou dans le module de classe SsGr, ou plustôt MTableaux ?
    Ces fonctions et la fonction SpecialCells(xlCellTypeConstants) vont me faire gagner du temps. En effet, mon classeur "Carnet de bord" contient 29 feuilles de tableaux construits à partir de 4 feuilles de données. Le formatage de ces tableaux de bord est manuel, 1 fois à la construction du tableau. Mais s'il y a modification des titres selon les données, la mise à jour du formatage doit se faire manuellement aussi. Avec ce que j'ai appris ces 2 jours, je vais automatiser le formatage des tableaux de bord.
    Si tu as d'autres fonctionnalités pratiques pour améliorer la construction et la présentation, je suis preneur.
    Merci encore.
    KIM
     
  20. KIM

    KIM XLDnaute Accro

    Inscrit depuis le :
    7 Avril 2005
    Messages :
    1255
    "J'aime" reçus :
    1
    Utilise:
    Excel 2010 (PC)
    Bonjour Dranreb,
    J'essaye d'utiliser tes fonctions.
    Dans l'exemple, With ColLignesOùCondR1C1(RngRés, "LEFT(RC3,5)=""Total""")
    RC3 veut dire même ligne, 3è colonne.
    Le texte "Total de la ..." se trouve dans le 1è col du tableau. J'ai essayé plusieurs combinaison avec RC, RC1, Column(1) sans résultat.
    Comment dire dans With ColLignesOùCondR1C1(RngRés, "LEFT(....)=""Total""") que la col de référence est la colonne 1 du tableau?

    Merci d'avance
    KIM
     
Chargement...
Discussions similaires - Tableaux vba Forum Date
vba dupliquer certaines en-tête sur plusieurs tableaux sur une même feuille Forum Excel 18 Novembre 2018
Tableaux VBA Forum Excel 16 Août 2018
XL 2013 Graphique tableaux VBA Forum Excel 28 Juin 2017
Tableaux _ VBA Forum Excel 17 Mai 2017
XL 2016 Aide VBA pour concaténation de 3 tableaux Forum Excel 25 Août 2016

Partager cette page