2017-06-01 40 views
0

我是VBA脚本编程的新手,并且想要编写一个VBA脚本来按多列对Excel表进行排序。列的数量可以在工作表中有所不同,但我需要考虑两个用于排序的列,即第一个&最后一列。例如。这里有两个不同的Excel表格,我需要根据第一个&最后一列排序,即ID & RANK。通过动态确定键列来排序Excel工作表

enter image description here

enter image description here

sheet1 sheet2

我试着用下面动态发现最后一栏

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

但我不能够使用上述在Range方法中用于选择键的变量。

它引发运行时错误。

是否有任何方式使用变量来选择范围或任何其他方式来实现这种排序。

在此先感谢。

+2

你怎么申报'LastColumn()'?一般来说,我做'Dim lastColumn as Long'然后'LastColumn = sht.cells(1,sht.columns.count).End(XlToLeft).Column',并返回列号... – BruceWayne

+0

我刚才宣布LastColumn为字符串,并返回最后一列字母而不是列号。 –

+1

使用像@BruceWayne所述的列号,并使用'Range()'中的'Cells(RowNumber,ColumnNumber)' –

回答

0

如果我正确地读出你的评论,你当前的代码(添加几个换行符)是

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 
+0

谢谢@YowE3K,它的工作。 –