如何使用vba在Excel2007中一次隐藏多个列

如何使用vba在Excel2007中一次隐藏多个列,excel,hide,vba,Excel,Hide,Vba,我想在excel工作表中隐藏多个列。这在以下情况下效果非常好: ActiveSheet.Range(“R10:CO10”).entireclumn.Hidden=True “R10”是要隐藏的第一个和固定列。第二列和要隐藏的所有列将根据其日期值动态确定 样本编码: Private Sub Worksheet_Activate() Dim c As Range Dim start As String Dim ende As String start = "R10"

我想在excel工作表中隐藏多个列。这在以下情况下效果非常好:

ActiveSheet.Range(“R10:CO10”).entireclumn.Hidden=True

“R10”是要隐藏的第一个和固定列。第二列和要隐藏的所有列将根据其日期值动态确定

样本编码:

Private Sub Worksheet_Activate()
    Dim c As Range
    Dim start As String
    Dim ende As String
    start = "R10"
    ende = "CO10"
    Dim d As Date
    d = Date
    For Each c In Range("R10:HU10")
        If c = (d - 8) Then
            ende = **how to assign???**
        End If
        If c = (d - 7) Then
            Application.Goto c, True
        End If
    Next c
    'ActiveSheet.Range(**"start:ende"**).EntireColumn.Hidden = True
End Sub
第10行保存日期值,我想隐藏所有日期超过7天的列,我找不到任何关于使用变量或列标识符或列编号等隐藏多个列的提示


变量的使用最终导致运行时错误1004。

正如Scott指出的,我的第一个答案并不完整。您可以使用以下功能:

Function GetColChars(col As Integer) As String

    Dim coldown As Integer 'Column Countdown
    Dim colrem As Integer 'Coumn Value Remaining
    Dim colname As String 'Temporary String value for column name

    Const alphanums = 26
    Const aposition = 64
    coldown = col
    colname = ""

    While coldown > 0

        colrem = coldown Mod alphanums
        If colrem = 0 Then colrem = 26
        newchar = Chr(64 + colrem)
        colname = newchar & colname
        coldown = Int((coldown - 1) / alphanums)

    Wend

    GetColChars = colname

 End Function
然后调用函数以获取列字母:

ende = GetColChars(c.column)

正如斯科特指出的,我的第一个答案并不完整。您可以使用以下功能:

Function GetColChars(col As Integer) As String

    Dim coldown As Integer 'Column Countdown
    Dim colrem As Integer 'Coumn Value Remaining
    Dim colname As String 'Temporary String value for column name

    Const alphanums = 26
    Const aposition = 64
    coldown = col
    colname = ""

    While coldown > 0

        colrem = coldown Mod alphanums
        If colrem = 0 Then colrem = 26
        newchar = Chr(64 + colrem)
        colname = newchar & colname
        coldown = Int((coldown - 1) / alphanums)

    Wend

    GetColChars = colname

 End Function
然后调用函数以获取列字母:

ende = GetColChars(c.column)

我已经测试了Scotts解决方案方法,并最终使其工作。在这种情况下,其他一些人将与同样的问题作斗争,获得有效的解决方案,以下是我的解决方案:

Private Sub Worksheet_Activate()

Dim lastDateRangeColumn As Range
Dim givenDateRange As Range 
Set givenDateRange = ActiveSheet.Range("R10:HU10")
Dim firstDateRangeColumn As Range 
Set firstDateRangeColumn = ActiveSheet.Range("R10")

Dim todaysDate As Date: todaysDate = Date

For Each tempDateRangeColumn In givenDateRange
    If tempDateRangeColumn < (todaysDate - 7) Then
        Set lastDateRangeColumn = ActiveSheet.Range(tempDateRangeColumn.Address)
    End If
    If tempDateRangeColumn = (todaysDate - 7) Then
        Application.Goto tempDateRangeColumn, True
    End If
Next tempDateRangeColumn

Dim firstColumnNumber As Long  
Dim lastColumnNumber  As Long
firstColumnNumber = Range(firstDateRangeColumn.Address).Column  
lastColumnNumber  = Range(lastDateRangeColumn.Address).Column

Dim rangeToBeHidden   As Range 
Set rangeToBeHidden = Range(Cells(1, firstColumnNumber), Cells(1, lastColumnNumber))

rangeToBeHidden.EntireColumn.Hidden = True

End Sub
Private子工作表\u Activate()
将LastDateRange列设置为范围
变暗给定范围
设置givenderange=ActiveSheet.Range(“R10:HU10”)
Dim FirstDateRange列作为范围
设置firstDateRangeColumn=ActiveSheet.Range(“R10”)
Dim todaysDate As Date:todaysDate=日期
对于给定词汇中的每个TempDateRange列
如果TempDateRange列<(今天-7),则
设置lastDateRangeColumn=ActiveSheet.Range(tempDateRangeColumn.Address)
如果结束
如果tempDateRangeColumn=(todaysDate-7),则
Application.Goto tempDateRangeColumn,True
如果结束
下一个tempdaterange列
将第一列数字变长
将最后一列的数字变长
firstColumnNumber=范围(firstDateRangeColumn.Address).Column
lastColumnNumber=范围(lastDateRangeColumn.Address).Column
变暗范围为隐藏范围
设置rangeToBeHidden=范围(单元格(1,firstColumnNumber),单元格(1,lastColumnNumber))
rangeToBeHidden.Entirecumn.Hidden=True
端接头

我已经测试了Scotts解决方案方法,并最终使其正常工作。在这种情况下,其他一些人将与同样的问题作斗争,获得有效的解决方案,以下是我的解决方案:

Private Sub Worksheet_Activate()

Dim lastDateRangeColumn As Range
Dim givenDateRange As Range 
Set givenDateRange = ActiveSheet.Range("R10:HU10")
Dim firstDateRangeColumn As Range 
Set firstDateRangeColumn = ActiveSheet.Range("R10")

Dim todaysDate As Date: todaysDate = Date

For Each tempDateRangeColumn In givenDateRange
    If tempDateRangeColumn < (todaysDate - 7) Then
        Set lastDateRangeColumn = ActiveSheet.Range(tempDateRangeColumn.Address)
    End If
    If tempDateRangeColumn = (todaysDate - 7) Then
        Application.Goto tempDateRangeColumn, True
    End If
Next tempDateRangeColumn

Dim firstColumnNumber As Long  
Dim lastColumnNumber  As Long
firstColumnNumber = Range(firstDateRangeColumn.Address).Column  
lastColumnNumber  = Range(lastDateRangeColumn.Address).Column

Dim rangeToBeHidden   As Range 
Set rangeToBeHidden = Range(Cells(1, firstColumnNumber), Cells(1, lastColumnNumber))

rangeToBeHidden.EntireColumn.Hidden = True

End Sub
Private子工作表\u Activate()
将LastDateRange列设置为范围
变暗给定范围
设置givenderange=ActiveSheet.Range(“R10:HU10”)
Dim FirstDateRange列作为范围
设置firstDateRangeColumn=ActiveSheet.Range(“R10”)
Dim todaysDate As Date:todaysDate=日期
对于给定词汇中的每个TempDateRange列
如果TempDateRange列<(今天-7),则
设置lastDateRangeColumn=ActiveSheet.Range(tempDateRangeColumn.Address)
如果结束
如果tempDateRangeColumn=(todaysDate-7),则
Application.Goto tempDateRangeColumn,True
如果结束
下一个tempdaterange列
将第一列数字变长
将最后一列的数字变长
firstColumnNumber=范围(firstDateRangeColumn.Address).Column
lastColumnNumber=范围(lastDateRangeColumn.Address).Column
变暗范围为隐藏范围
设置rangeToBeHidden=范围(单元格(1,firstColumnNumber),单元格(1,lastColumnNumber))
rangeToBeHidden.Entirecumn.Hidden=True
端接头

只需在循环过程中隐藏:
c.EntireColumn.Hidden=c
代替整个if语句。易于实现,工作正常,但在按顺序隐藏每列时屏幕会闪烁。这就是为什么我想一次隐藏一系列列,然后关闭屏幕更新
Application.ScreenUpdate=False
在子文件的开头,而
Application.ScreenUpdate=True
在文件的结尾。谢谢Scott-简单的解决方法和结果计数。很高兴看到它如何处理保存范围值的变量,但您的解决方案非常适合我的需要…查看UNION(),您可以在列中循环,如果少于7天,则将单元格添加到UNION(),最后可以隐藏UNION创建的整个范围列。或者查看单元格()并保存=8天的列号,并在单元格中使用该列号设置结束范围。只需在循环过程中隐藏:
c.entireclumn.Hidden=c<(d-7)
代替整个if语句。易于实现,工作正常,但在按顺序隐藏每列时屏幕会闪烁。这就是为什么我想一次隐藏一系列列,然后关闭屏幕更新
Application.ScreenUpdate=False
在子文件的开头,而
Application.ScreenUpdate=True
在文件的结尾。谢谢Scott-简单的解决方法和结果计数。很高兴看到它如何处理保存范围值的变量,但您的解决方案非常适合我的需要…查看UNION(),您可以在列中循环,如果少于7天,则将单元格添加到UNION(),最后可以隐藏UNION创建的整个范围列。或者查看单元格()并保存=8天的列号,然后在单元格中使用该列号设置结束范围。您好,我明天将尝试您的解决方案。非常感谢。您好,明天我将尝试您的解决方案。非常感谢你。