【问题标题】:Sort an excel sheet by determining the key column dynamically通过动态确定键列对excel表进行排序
【发布时间】:2017-11-03 02:51:27
【问题描述】:

我是 VBA 脚本的新手,想编写一个 VBA 脚本来按多列对 Excel 工作表进行排序。工作表中的列数可能会有所不同,但我需要考虑两列进行排序,即第一列和最后一列。例如。这是两个不同的 Excel 表,我需要根据第一列和最后一列(即 ID 和 RANK)对其进行排序。

sheet1 sheet2

我尝试使用以下方法动态查找最后一列:

LastColumn = Split(sht.Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Cells.Address(1, 0), "$")
(0)

但是我无法在 Range 方法中使用上述变量来选择键。

它抛出运行时错误。

有没有什么方法可以使用变量来选择Range或者任何其他的方式来实现这种排序。

提前致谢。

【问题讨论】:

  • 你是如何声明LastColumn()的?一般来说,我先做Dim lastColumn as Long 然后LastColumn = sht.cells(1,sht.columns.count).End(XlToLeft).Column,然后返回列号...
  • 我刚刚将 LastColumn 声明为 String,它返回最后一列字母而不是列号。
  • 使用@BruceWayne 所述的列号并使用Cells(),它采用列号Cells(RowNumber,ColumnNumber)
  • 我在 Range() 中使用了 Cells(RowNumber,ColumnNumber) ,但它再次给出了运行时错误。下面是我的代码Set sht = Workbooks("test_vba.xlsx").Worksheets("Sheet1") LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row LastColumn = sht.cells(1,sht.columns.count).End(XlToLeft).Column sht.Range(Cells(1, 1), Cells(1,LastColumn) & Sheets("sheet1").Range("A1").End(xlDown).Row).Sort _ Key1:=sht.Range("A:A"), Order1:=xlAscending, _ Key2:=sht.Range(Cells(1,LastColumn), Cells(LastRow,LastColumn)), Order2:=xlDescending, _ Header:=xlYes

标签: excel sorting vba


【解决方案1】:

如果我正确阅读了您的评论,那么您当前的代码(添加了几个换行符)是

Set sht = Workbooks("test_vba.xlsx").Worksheets("Sheet1")
LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row
LastColumn = sht.cells(1,sht.columns.count).End(XlToLeft).Column 
sht.Range(Cells(1, 1), _
          Cells(1,LastColumn) & Sheets("sheet1").Range("A1").End(xlDown).Row).Sort _
             Key1:=sht.Range("A:A"), _
                  Order1:=xlAscending, _ 
             Key2:=sht.Range(Cells(1,LastColumn), Cells(LastRow,LastColumn)), _
                  Order2:=xlDescending, _ 
             Header:=xlYes

Cells(1,LastColumn) & Sheets("sheet1").Range("A1").End(xlDown).Row 部分存在问题,因为您从第 1 行的最后一列获取 ,并将 A 列中最后一行的行号附加到该部分 - 这不会不要给你Range

我相信您正在寻找类似的东西:

Dim LastRow As Long
Dim LastColumn As Long
Dim sht As Worksheet

Set sht = Workbooks("test_vba.xlsx").Worksheets("Sheet1")
LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row
LastColumn = sht.Cells(1, sht.Columns.Count).End(xlToLeft).Column

sht.Range(sht.Cells(1, "A"), sht.Cells(LastRow, LastColumn)).Sort _
          Key1:=sht.Columns(1), Order1:=xlAscending, _ 
          Key2:=sht.Columns(LastColumn), Order2:=xlDescending, _ 
          Header:=xlYes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    相关资源
    最近更新 更多