根据行中的日期隐藏列(甘特图表头)VBA

时间:2015-05-11 20:27:06

标签: excel vba excel-vba

我在Excel中创建了甘特图表,我正在使用宏将日期扩展或折叠为数周,工作周,日历周和月。诀窍是:星期六和星期日使用条件格式进行哈希处理,因此在折叠时不应出现。到目前为止,我已经设法使所有月份选项正常工作。这是我到目前为止崩溃月份的代码:

    Sub Month_Collapse()
    Dim LastCol As Long, x As Long    
    Columns("H:SSS").ColumnWidth = 3.45

'Hide Columns
    LastCol = ActiveSheet.Cells(4, Columns.Count).End(xlToLeft).Column
    For x = 8 To LastCol
        If (Cells(4, x).Text) = 28 And (Cells(5, x).Text) <> "Sat" And (Cells(5, x).Text) <> "Sun" Then
            Columns(x).Hidden = False          'ColumnWidth = 10
        Else
            Columns(x).Hidden = True    
        End If
    Next    

End Sub

第2行填充了几个月。第4行填充了数天。喜欢“14”。第5行用工作日填充文本。喜欢“周一”或“周六”。 我还尝试包含以下内容,但显示的列数太多。

 If (Cells(4, x).Text) = 28 And (Cells(5, x).Text) <> "Sat" And (Cells(5, x).Text) <> "Sun" Then
            Columns(x).Hidden = False
        ElseIf (Cells(4, x).Text) = 29 And (Cells(5, x).Text) <> "Sat" And (Cells(5, x).Text) <> "Sun" Then
            Columns(x).Hidden = False
        ElseIf (Cells(4, x).Text) = 30 And (Cells(5, x).Text) <> "Sat" And (Cells(5, x).Text) <> "Sun" Then
            Columns(x).Hidden = False

我还可以发布生成标题的代码,其中包含日期和折叠周数的代码。不确定在这里发布的时间是否太长......

标题行可见的图片

enter image description here

图片“已崩溃”

enter image description here

编辑:接下来创建标题的宏。在创建之后我会像一个宏一样隐藏除了每个月的最后一天的列之外的所有列。但是,如果这一天是周末,那么宏应该采取上周五。

    Sub Create_Date_Header_Macro()
Dim InitialCell As Range
Dim InitialDate As Date

    '====================================================================================
    'Project starting date
    '''InitialDate = "01.05.2015"  ' example
        InitialDate = Application.InputBox(prompt:="Enter initial date:       (dd.mm.yyyy)")
        If InitialDate = False Then Exit Sub
    '====================================================================================
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False

        ActiveSheet.Unprotect
        Cells.Select
        Selection.Locked = False

        Range("H1:ZZ5").ClearContents
        Range("H1:ZZ5").UnMerge


        Set InitialCell = Range("G1")
        InitialCell.Activate
        ActiveCell.Offset(3, 1) = InitialDate
    '    ActiveCell.Offset(3, 1).NumberFormat = "d-mmm"     'Change date display mode here
        ActiveCell.Offset(3, 1).NumberFormat = "dd"
    'add week number
        ActiveCell.Offset(2, 1).FormulaR1C1 = "=WEEKNUM(R[1]C,2)"
        ActiveCell.Offset(2, 1).NumberFormat = "General"
    'add month
        ActiveCell.Offset(1, 1).FormulaR1C1 = _
        "=IF(MONTH(R[2]C)=1,""January"",IF(MONTH(R[2]C)=2,""February"",IF(MONTH(R[2]C)=3,""March"",IF(MONTH(R[2]C)=4,""April"",IF(MONTH(R[2]C)=5,""May"",IF(MONTH(R[2]C)=6,""June"",IF(MONTH(R[2]C)=7,""July"",IF(MONTH(R[2]C)=8,""August"",IF(MONTH(R[2]C)=9,""September"",IF(MONTH(R[2]C)=10,""October"",IF(MONTH(R[2]C)=11,""November"",IF(MONTH(R[2]C)=12,""December""))))))))))))"
    'add weekday
        ActiveCell.Offset(4, 1).FormulaR1C1 = "=R[-1]C"
        ActiveCell.Offset(4, 1).NumberFormat = "[$-2C09]DDD;@"
    'add year
        ActiveCell.Offset(0, 1).FormulaR1C1 = "=Year(R[3]C)"
        ActiveCell.Offset(0, 1).NumberFormat = "General"
    'Copy formats to next column
        ActiveCell.Offset(0, 1).Range("A1:A5").Select
        ActiveCell.Activate
        Selection.Copy
        ActiveCell.Offset(0, 1).Range("A1").Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
    ' date is equal starting date + 1
        ActiveCell.Offset(3, 0).FormulaR1C1 = "=RC[-1]+1"
    'Fill header
        Selection.AutoFill Destination:=ActiveCell.Range("A1:AE5"), Type:= _
        xlFillDefault

    'Streatch Table Conditional Formats into columns
        Columns("AA:AA").Select
        Selection.AutoFill Destination:=Columns("AA:TT"), Type:=xlFillDefault

    'Select all dates
        Range("H1:H5").Select
        Range(Selection, Selection.End(xlToRight)).Select
    'Copy + Paste Especial: Values
        With Selection
            .Copy
            .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            .Columns.AutoFit
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With


        Call MergeCells
    '    Call Organize

        Range("H8").Select


        Application.DisplayAlerts = True
        Application.ScreenUpdating = True
    End Sub


    Private Sub MergeCells()

        Dim rngMerge As Range, cell As Range
        Set rngMerge = Range("H2:SSS3")     'set ranges to be merged here

    MergeAgain:
        For Each cell In rngMerge
            If cell.Value = cell.Offset(0, 1).Value And IsEmpty(cell) = False Then
                Range(cell, cell.Offset(0, 1)).Merge
                GoTo MergeAgain
            End If
        Next

    'Year cells are formated in same size as month cells
        Rows(2).Select
        Selection.Copy
        Rows(1).Select
        Selection.PasteSpecial Paste:=xlPasteFormats
        Selection.NumberFormat = "General"
        Application.CutCopyMode = False


    End Sub

1 个答案:

答案 0 :(得分:1)

这是一个隐藏除了本月最后一个工作日之外的所有功能的功能。它假定第4行包含实际日期(恰好被格式化为仅显示当天)。

Sub Month_Collapse()

Dim LastCol As Long, x As Long
Dim CurMonth As Integer, PriorMonth As Integer
Dim ColDate As Date, NextMonth As Date
Dim LastWorkingDay As Integer

LastCol = ActiveSheet.Cells(4, Columns.Count).End(xlToLeft).Column
Range(Columns(8), Columns(LastCol)).ColumnWidth = 3.45

For x = 8 To LastCol
    ColDate = Cells(4, x)
    CurMonth = Month(ColDate)
    If CurMonth <> PriorMonth Then
        NextMonth = DateSerial(Year(ColDate), Month(ColDate) + 1, 1)
        LastWorkingDay = Day(Application.WorkDay(NextMonth, -1))
    End If
    If Day(ColDate) <> LastWorkingDay Then
        Columns(x).Hidden = True
    End If
Next x

End Sub