【问题标题】:Delete columns when a specific value is entered in cell (in another tab)在单元格中输入特定值时删除列(在另一个选项卡中)
【发布时间】:2020-02-11 22:22:27
【问题描述】:

我有一个选项卡,可以在其中在单元格中输入某个数字(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 列将根据我在另一张表中输入的数字被删除或添加,X 列将是行上指示的数字的总和(从 C 列到 V 列)。 Z 列有一个公式链接到另一个工作表(现在为空,因此为 0),AB 列将 X 列除以 Z 列。

【问题讨论】:

  • 看看Worksheet.Change 事件。非常可行。
  • 谢谢,我已经用代码的开头更新了我的问题。
  • 所以你只想保留放入B2的列号?
  • 您使用的表格实际上是格式化为表格 (Ctrl+T) 的吗?
  • @urdearboy:实际上不,这是小于或等于我输入的数字的列。 B2中的数字将表示项目的数量,然后在Sheet中我想为所有项目保留一列,如果我放5,那么我应该为每个项目保留5列。

标签: excel vba


【解决方案1】:

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

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


  1. 在做任何事情之前确保更改的单元格是B2
  2. 确保B2 的输入实际上是一个数字。此处的宏仅限于 1 - 20 之间的数字
  3. 遍历列并删除任何不等于B2 值的列索引#

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

【讨论】:

  • 谢谢@urdearboy,您确实提出了一些好处: 1 - 工作表名称会有所不同,但这没问题。 2 - 它不会从 A 列开始(我将删除不同的范围,但我想问一个简单的问题开始)。 3 - 我没有提到的最重要的想法是我希望它是可逆的,从某种意义上说,如果我按 3,它会保留前 3 列,然后如果我修改为 5,它会增加两个更多列。如果这有意义
  • 也许你应该只隐藏这些列。然后它可以被撤消,你永远不会改变你正在循环的范围。
  • 理想情况下,这是我想做的,但是做原始excel文档的人在其他选项卡的单元格中放了很多公式,如果我留下一个没有使用的项目列,然后它将在任何地方创建 div#0 。否则,我正在考虑使用数据管理器使公式隐含并避免这种情况。这将允许隐藏未使用的列而不具有所有这些依赖项。
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多