首页 > 解决方案 > VBA 帮助:设置具有动态范围的自动运行 VBA

问题描述

所以我拥有的数据是这种格式: 股票数据

'31-Mar-18' 是手动输入,当在那里输入日期时,我试图运行一个函数,该函数将按降序对与输入数据单元格具有相同标题的相应列进行排序。因此,例如,如果输入单元格是“31-Mar-18”,则应根据“31-Mar-18”作为标题的列中值的降序对数据进行排序。

我在玩这段代码,但鉴于我的知识有限,不知道如何继续。任何输入将不胜感激。

Sub SortDataWithHeader()
Range("DataRange").Sort Key1:=Range("B15"), Order1:=xlDescending

End Sub

标签: excelvbasortingdynamic

解决方案


看来您误解了 key1 属性的用法。有关更多详细信息,请参阅此链接。key1 应该包含所有要排序的值(例如在范围对象中),而不是列名。

以下内容可能对您有用,但您需要相应地调整单元格引用并在有意义的地方添加错误捕获。

代码是什么,它在单元格 B15 中查找日期,并尝试在第 17 行中找到包含它的单元格。然后它获取该单元格并将其扩展到末尾,以便定义要排序的单元格。它使用 autofilter.sort 而不是 range.sort,因为从我在您发布的图像中看到的内容,您已经应用了自动过滤器。

Option Explicit

Public Sub sSort()

  Dim headerColumn As Range, headers As Range, foundRange As Range, sortItems As Range
  Dim headerColumnNumber As Long
  Dim lookupValue As Variant

  lookupValue = Sheet1.Range("B15").Value
  Set headers = Sheet1.Range("17:17")
  Set foundRange = headers.Find(lookupValue, LookIn:=xlValues)

  Set sortItems = Range(foundRange.Offset(1, 0), foundRange.End(xlDown))

  Sheet1.AutoFilter.Sort.SortFields.Clear
  Sheet1.AutoFilter.Sort.SortFields.Add Key:=sortItems, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

  With Sheet1.AutoFilter.Sort
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With

End Sub

推荐阅读