Excel 在单元格(另一个选项卡)中输入特定值时删除列

Excel 在单元格(另一个选项卡)中输入特定值时删除列,excel,vba,Excel,Vba,我有一个选项卡,可以在单元格中输入某个数字(介于1和20之间)。当我键入数字时,我想自动删除另一个选项卡中的列 下一个选项卡有一个包含20列的表。如果我在选项卡1的单元格中输入数字1,我希望自动删除选项卡2中的第2列到第20列 我不想手动运行宏,而是在输入值时自动执行删除过程 一开始会是这样吗 Private Sub Workbook_Change(ByVal Target As Excel.Range) If Target.Address = "$B$2" Then

我有一个选项卡,可以在单元格中输入某个数字(介于1和20之间)。当我键入数字时,我想自动删除另一个选项卡中的列

下一个选项卡有一个包含20列的表。如果我在选项卡1的单元格中输入数字1,我希望自动删除选项卡2中的第2列到第20列

我不想手动运行宏,而是在输入值时自动执行删除过程

一开始会是这样吗

Private Sub Workbook_Change(ByVal Target As Excel.Range)

    If Target.Address = "$B$2" Then
        If Target.Value = 1 Then Columns("B:T").Delete
    End If

End Sub
我会把代码直接放在表1中,在那里输入值(比如说在单元格B2中)。然后,如果我输入1值,它将删除B到T列(2到19)

我需要参考第2页来删除这些列

然后我是否应该继续为值2、3、4……添加If语句。。。改为20并更改我的列删除语句

表格的屏幕截图:


第C列至第V列将根据另一张表中输入的数字I删除或添加,第X列将是该行所示数字的总和(从第C列至第V列)。Z列有一个链接到另一张表的公式(现在为空,因此为0),AB列将X列除以Z列。

此方法使用循环。这假设您的第二个工作表名称是
Sheet2
,您有20列,并且您的表从
列A
开始

您可能需要使其更加系统化—第一次使用它时,这将很好地工作,但一旦删除一列,您将移动整个范围。您可能还需要添加提示以验证选择。如果黄油手指碰到的是3而不是2怎么办?您将删除该列,并且无法在VBA中使用CTRL+Z。。。只是一些想法


  • 在执行任何操作之前,请确保更改的单元格为B2
  • 确保
    B2
    的输入实际上是一个数字。此处宏仅限于1-20之间的数字
  • 循环浏览列并删除任何不等于
    B2
    值的列索引

  • Private子工作表\u更改(ByVal目标作为范围)
    将ws设置为工作表:将ws=ThisWorkbook.Sheets(“Sheet2”)设置为0,然后将目标设置为<21
    对于i=1到20
    如果我有目标的话
    ws.Cells(1,i).entireclumn.Delete
    如果结束
    接下来我
    如果结束
    如果结束
    Application.EnableEvents=True
    端接头
    
    看看这场活动。非常可行。谢谢,我用一段代码的开头更新了我的问题。所以你只想保留B2中的列号?你正在使用一个实际格式为表(Ctrl+T)的表吗?@Urderboy:实际上不是,是列小于或等于我输入的数字。B2中的数字表示项目的数量,然后在工作表中,我想为所有项目保留一列,如果我输入5,那么每个项目应该有5列。谢谢@urdearboy,你确实提出了一些好的观点:1-工作表名称会有所不同,但这不是问题。2-它不会从A列开始(我将删除不同的范围,但我想问一个简单的问题)。3-我没有提到的最重要的一点是,我希望它是可逆的,从某种意义上说,如果我按3,它将保留前3列,然后如果我修改为5,它将再添加两列。如果这样做有意义的话,那么您应该只隐藏列。理想情况下,这是我想要做的,但是制作原始excel文档的人在其他选项卡的单元格中放置了大量公式,如果我留下一个未使用的项目列,那么它将在任何地方创建div#0。否则,我会考虑使用数据管理器使公式隐式化并避免这种情况。这将允许隐藏未使用的列,而不具有所有这些依赖项。
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet2") '<-- Sheet with table
    Dim i As Long
    
    Application.EnableEvents = False
        If Not Intersect(Target, Range("B2")) Is Nothing Then
            If Target > 0 And Target < 21 Then
                For i = 1 To 20
    
                    If Target <> i Then
                        ws.Cells(1, i).EntireColumn.Delete
                    End If
    
                Next i
            End If
        End If
    Application.EnableEvents = True
    
    End Sub