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. 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
  2. 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