【问题标题】:VBA Help: Setting up an auto running VBA with a dynamic rangeVBA 帮助:设置具有动态范围的自动运行 VBA
【发布时间】:2020-03-06 01:26:44
【问题描述】:

所以我拥有的数据是这种格式: Stock Data

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

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

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

End Sub

【问题讨论】:

    标签: excel vba sorting dynamic


    【解决方案1】:

    您似乎误解了 key1 属性的用法。有关详细信息,请参阅this link。 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多