Masquer colonne si cellule vide

Résolu
Bonjour,
je souhaite masquer des colonnes si cellule vide avec la mise en forme conditionnelle ou seulement une macro pour l'ensemble des dates
ci joint fichier avec plus d'info
merci d'avance
https://www.cjoint.com/c/GAosqqKeIYm

6 réponses

  1. Bonjour

    1. est ce que tu as d'autres colonnes après la colonne E ?
    2. est ce que tu as d'autres lignes après la ligne 4 ?

    Cdlmnt
    0
    1. Contributeur
      Bonjour,

      Avec ton exemple, tu n'as aucune colonne vide mais par contre tu n'as qu'une information par date donc tu ne peux pas avoir un traitement global qui puisse masquer puisque tes dates paraissent réparties sur un colonne mois spécifique.
      0
      1. Un début, à mettre dans le module de la feuille à traiter.
        Un double-clic en colonne A pour masquer les colonnes correspondantes

        Option Explicit

        Const codate = 1
        Const cofin = 5

        Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        Dim co As Long, li As Long
        If Target.Value = "" Then Exit Sub
        If Not Intersect(Target, Columns(codate)) Is Nothing Then
        li = Target.Row
        For co = codate + 1 To cofin
        If Cells(li, co).Value = "" Then
        Columns(co).Hidden = True
        Else
        Columns(co).Hidden = False
        End If
        Next co
        End If
        End Sub

        Cdlmnt
        0
        1. Contributeur
          Bonjour ccm81 et bonne année 2017 à toi et tes proches,

          Bien vu comme méthode mais si l'on savait si la colonne est liée à la date ce serait bien plus compréhensible.
          0
      2. Bonjour et merci pour cette réponse rapide et satisfaisante
        réponse a ccm81
        oui les colonnes vont jusqu’à HR mais peuvent aller encore plus loin
        et les lignes jusqu’à 100 c'est a dire 100 dates
        c'est super ça marche bien ,je vais surement l'adopter
        je l'ai arrangé a ma manière , mais n'est pas aussi rapide que la macro que j'avait ,le temps de latence n'est pas monstrueux environ 2.5 secondes
        et l'autre macro était 1 seconde
        j'ai du descendre ces 2 lignes car macro pas accepté
        Const codate = 2
        Const cofin = 230
        voici mon code peut-être est il a améliorer
        Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

        Application.ScreenUpdating = False
        Const codate = 2
        Const cofin = 230
        Dim co As Long, li As Long
        If Target.Value = "" Then Exit Sub
        If Not Intersect(Target, Columns(codate)) Is Nothing Then
        li = Target.Row
        For co = codate + 1 To cofin
        If Cells(li, co).Value = "" Then
        Columns(co).Hidden = True
        Else
        Columns(co).Hidden = False
        End If
        Next co
        End If
        With Worksheets("Analyses")
        .Select
        .Outline.ShowLevels ColumnLevels:=1
        End With
        Application.ScreenUpdating = True
        End Sub


        petite question supplémentaire
        comment le faire commencer a la ligne 5 et finir a la ligne 100
        je gagnerai peut être du temps
        0
        1. 1. Si tu n'as qu'une seul valeur par ligne de date, ceci devrait aller plus vite
          Const codate = "A"
          Const cofinPlusUne = "F" ' dernière colonne occupée plus une

          Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
          Dim co As Long, li As Long, adr As String, co1 As String, co2 As String, co0 As String
          If Target.Value = "" Then Target.Offset(1, 0).Select: Exit Sub
          If Not Intersect(Target, Columns(codate)) Is Nothing Then
          Application.ScreenUpdating = False
          Columns(codate & ":" & cofinPlusUne).Hidden = False
          li = Target.Row
          co = Cells(li, Columns.Count).End(xlToLeft).Column
          adr = Cells(li, co).Address
          co0 = Split(adr, "$")(1)
          If co0 = codate Then Exit Sub
          adr = Cells(li, co).Offset(0, -1).Address
          co1 = Split(adr, "$")(1)
          adr = Cells(li, co).Offset(0, 1).Address
          co2 = Split(adr, "$")(1)
          If co1 <> codate Then Columns("B:" & co1).Hidden = True
          If co2 <> cofinPlusUne Then Columns(co2 & ":" & cofinPlusUne).Hidden = True
          End If
          Application.ScreenUpdating = True
          Target.Offset(1, 0).Select
          End Sub


          2. le nombre de lignes n'a pas d'importance pour la rapidité de l'exécution

          Cdlmnt
          0
          1. Bonjour ccm81
            les valeurs par ligne de date peut aller de 1 a 40 au max
            j'ai essayé ce code mais ne m'affiche même pas une colonne
            si pas mieux j'utiliserais le premier code ,mais effectivement il me semble que cela va plus vite mais bon il ne trouve rien non plus
            merci
            0
        2. Le code n'était valable que pour une seule cellule non vide

          Ceci devrait aller un peu plus vite dans ton cas
          Const codate = 1
          Const cofin = 10

          Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
          Dim co As Long, li As Long
          If Target.Value = "" Then Target.Offset(1, 0).Select: Exit Sub
          If Not Intersect(Target, Columns(codate)) Is Nothing Then
          Columns.Hidden = False
          Application.ScreenUpdating = False
          li = Target.Row
          For co = codate + 1 To cofin
          If Cells(li, co).Value = "" Then
          Columns(co).Hidden = True
          End If
          Next co
          End If
          Application.ScreenUpdating = True
          Target.Offset(1, 0).Select
          End Sub

          Cdlmnt
          1
          1. merci beaucoup cela marche très bien
            a+ pour autre chose
            0