【问题标题】:VBA - EXCEL Remove columns except specified rangeVBA - EXCEL 删除指定范围以外的列
【发布时间】:2014-11-26 13:57:02
【问题描述】:

我一直在寻找答案,但找不到如此具体的答案。

我正在尝试编写对没有任何编程知识的人来说易于使用的宏。

因此,我们使用定价模板,您可以在其中查看许多不同国家/地区的价格。我想创建一个宏,它将复制整个选项卡并删除不需要的列,这取决于它创建文件的国家/地区。 (需要保留公式,我仍然想要所有的计算而不是值)。

因此,前几列将保留,因为它们对所有国家/地区都是通用的,然后应删除除选定范围之外的所有列。范围在单独的选项卡中指定,并将存储在数组中。

示例: 比利时 第一栏:CJ 最后一栏:CQ

假设在第一个循环中存储了第一列和最后一列的值,我希望宏删除从 H 到 CI 的列,然后从 CR 到 HF。

但是,在下一个循环中,first 和 last 会发生变化,因此必须重新计算删除范围。

我尝试使用公式 ASC 和 CHR,但它不适用于两个字母代码。

【问题讨论】:

  • 每列是否有唯一的标题?
  • 几乎...是的,有唯一的标题,但在第三行
  • 如果可以使用唯一标题来标识您想要保留的列,您可以简单地遍历从 H 到数据末尾的列,并删除不符合模式的列。
  • 如果你要循环,你最好从头开始工作并向前移动,否则你的所有列都会在每次删除时向前移动。
  • 向后迭代(例如,For LoopControl = 214 To 1 Step -1: If LoopControl >96 Or (LoopControl <= {Last column in next block to be deleted} And LoopControl > {First column in that same block}) Or ... Then ActiveSheet.Columns(LoopControl).Delete: Next LoopControl)。如果需要速度,再次从最后一组列开始,ActiveSheet.Columns(96).Resize(, 118).Delete 等。

标签: vba excel


【解决方案1】:

好吧,如果您已经知道要使用的范围,那么像这样的子例程可以删除一个列范围,减去一个异常范围。

我只是遍历列并检查交叉点。如果正在测试的列与异常范围之间没有交集,我们将其添加到要删除的列列表中。

Public Sub RemoveColumnsExcept(removeRange As Range, exceptRange As Range)
  Dim deletionRange As Range
  Dim columnRange As Range

  For Each columnRange In removeRange.Columns
    If Intersect(columnRange, exceptRange) Is Nothing Then
      If deletionRange Is Nothing Then
        Set deletionRange = columnRange
      Else
        Set deletionRange = Union(deletionRange, columnRange)
      End If
    End If
  Next columnRange

  If Not deletionRange Is Nothing Then
    deletionRange.Delete xlShiftToLeft
  End If
End Sub

Public Sub Test()
  RemoveColumnsExcept Sheet1.[B:J], Sheet1.[G:I]
End Sub

您可以使用命名范围来跟踪要删除的列。该或列标题和一个循环在特定行中寻找一些值,如国家代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2014-02-22
    相关资源
    最近更新 更多