【问题标题】:VBA for overlaying a smaller table Drop Down list用于覆盖较小表格的 VBA 下拉列表
【发布时间】:2016-11-13 03:38:16
【问题描述】:

以下 VBA 的作用和工作正常: - 我有几个表,并为每个表使用了命名范围。 - 然后,在另一个选项卡(代码所在的位置)上,我有两个下拉列表,以便我的 Excel 报告的用户可以选择他们想要显示数据的表(一次只能一个)。

我的问题是,如果我从下拉列表中选择一个有 30 行的表格,一切看起来都很好 - 表格目标单元格 A2。但是,如果然后我选择一个只有 10 行的表,那么 10 行的新表将覆盖在之前的 30 行表上,但是 10 行表下的 20 行(从 30 行表中剩余)仍然存在。

我的问题是: 我应该如何更改下面的代码,以便从下拉列表中选择 10 rwo 表时不会出现上表中的 20 行?

如果上述内容没有意义,请告诉我。非常感谢。

我当时的代码如下:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim tableName As String
    Dim tableRange As Range
    Dim TypeOfCosts As String
    Application.EnableEvents = False

    If Range("B1").Text = "Fixed Staff Costs" Then
        TypeOfCosts = "_Fixed_Staff"
    ElseIf Range("B1") = "Variable Staff Costs" Then
        TypeOfCosts = "_Variable_Staff"
    ElseIf Range("B1") = "Production Costs" Then
        TypeOfCosts = "_Production"
    ElseIf Range("B1") = "Infrastructure Costs" Then
        TypeOfCosts = "_Infrastructure"
    ElseIf Range("B1") = "Other Costs" Then
        TypeOfCosts = "_Other"
    Else
        TypeOfCosts = ""
    End If

    tableName = Range("A1").Text & TypeOfCosts & "_Costs"

    On Error Resume Next
    Set tableRange = Application.Range(tableName)
    Debug.Print ThisWorkbook.Names.Count
        If Not (tableRange Is Nothing) And Err = 0 Then
        tableRange.Copy Destination:=Range("A3")
    Else
        Err.Clear
    End If
    On Error GoTo 0
    Application.EnableEvents = True
End Sub

【问题讨论】:

  • Range("A3").CurrentRegion.ClearContents 在复制其他范围之前,只要现有表周围有空白空间(并且只要存在现有表)。这实际上取决于工作表的其余部分是什么样的,以及您的所有表格是否都是某种可预测的大小/布局等
  • 谢谢,但我究竟需要在哪里添加您上面建议的代码行?
  • 嗯,您的代码似乎不起作用..有什么想法吗?
  • 所有桌子的宽度/高度都相似吗?他们下面有什么吗?如果没有其他内容可以清除,那么(例如)Range("A3").Resize(1000,10).ClearContents 将清除从 A3 开始的 100 行和 10 列。如果您调整这些数字,以便范围始终覆盖您的表格,那么您应该没问题。
  • 抱歉打扰了,但我需要明天提交这份报告,我已经走到了死胡同。。类似于下面来自 Thomas 的代码,这只是删除了上表的内容,但格式为未删除,例如在新表下的 20 行蓝色空单元格。你能想到别的吗?提前致谢

标签: vba


【解决方案1】:

这是一种非常直率的方法,但不了解您的设置:

With Range("A3").Resize(1000,10)
    .ClearContents
    .ClearFormats
End with

【讨论】:

  • 它有效!你是个天才,非常感谢你,但谢谢:)
【解决方案2】:

ClearContents(清除数据):清除从A3到CurrentRegion最后一个单元格的所有数据,保留任何列标题:

Range("A3",Range("A3").CurrentRegion.SpecialCells(xlCellTypeLastCell)).ClearContents

清除(数据和格式):清除数据和格式:

Range("A3",Range("A3").CurrentRegion.SpecialCells(xlCellTypeLastCell)).Clear

【讨论】:

  • 谢谢,但我究竟需要在哪里添加您的代码行?您能否将它插入我的代码并粘贴整个新的 VBA,以便我可以看到它应该在哪里?干杯
  • 复制新数据之前的任何位置。
  • 嗨,不幸的是,您上面的代码只删除了前一个表格的内容,但格式没有被删除,例如在新表格下的 20 行蓝色空单元格。任何其他建议将不胜感激?
  • @Elena,我更新了我的答案。使用Clear 而不是ClearContents 来清除数据和内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多