[英]Sorting an Excel Sheet when First Row, Last Row, First Column, Last Column saved only variables
I've found a few articles that I thought would help me sort my sheet via VBA (like VBA Excel sort range by specific column ), but I just can't get them to work.我发现了一些我认为可以帮助我通过 VBA 对工作表进行排序的文章(例如VBA Excel 对特定列的排序范围),但我无法让它们工作。
When I'm sorting, I have a number of worksheets open, which I think may be complicating the issue.当我进行排序时,我打开了许多工作表,我认为这可能会使问题复杂化。 But when I set the ranges I'm using the sort, I select the worksheet, so I just don't know.但是当我设置使用排序的范围时,我 select 工作表,所以我只是不知道。
If you look at the code, you can see that I have lots of variables defined that might be useful, so feel free to use any of those that would be helpful.如果您查看代码,您会发现我定义了许多可能有用的变量,因此请随意使用任何有用的变量。
'These are created elsewhere as Public, or passed into Sub
Dim SourceSheet As Worksheet
Dim MyWB As String
Dim MyWS As String
Dim ColNum As Integer
Dim SourceFirstRow As Integer
Dim SourceLastRow As Integer
Dim FinalFirstRow As Integer
Dim FinalFirstColumn As Integer
Dim FinalLastColumn As Integer
'These are created and used in the subroutine
Dim FinalSheet As Worksheet
Dim AllCells As Range
Dim SortColumn As Range
Dim SourceRow As Integer
Dim CurrentFinalRow As Integer
'These are actually set elsewhere and passed in, shown here for example
Set SourceSheet = ThisWorkbook.Worksheets(1)
Set SourceFirstRow = 2
Set SourceLastRow = 15
Set MyWB = "DataFile"
Set MyWS = "Data"
Set FinalFirstRow = 2
Set FinalFirstColumn = 1
Set FinalLastColumn = 20
Set ColNum = 4
'These is the relevant code from the subroutine
Set FinalSheet = Workbooks(MyWB).Worksheets(MyWS)
Set CurrentFinalRow = FinalFirstRow
Set AllCells = FinalSheet.Cells
Set SortColumn = FinalSheet.Columns(ColNum)
For SourceRow = SourceFirstRow To SourceLastRow
'Fill in a whole bunch of data into the rows and columns on the final sheet
'not all sourcerows are transferred
CurrentFinalRow = CurrentFinalRow + 1 'Sets it ready for the next blank line to be filled
Next SourceRow
Range(AllCells & CurrentFinalRow - 1).Sort key1:=Range(SortColumn & CurrentFinalRow - 1), order1:=xlAscending, Header:=xlYes
So, with further research and the code posted above, the answer turns out to be:因此,通过进一步研究和上面发布的代码,答案是:
Range(Cells(FinalFirstRow,FinalFirstColumn), Cells(CurrentFinalRow-1,FinalLastColumn)).Sort _ key1:=Range(Cells(FinalFirstRow,ColNum),Cells(FinalFirstRow,ColNum)), _ order1:=xlAscending, Header:=xlNo Range(Cells(FinalFirstRow,FinalFirstColumn), Cells(CurrentFinalRow-1,FinalLastColumn)).Sort _ key1:=Range(Cells(FinalFirstRow,ColNum),Cells(FinalFirstRow,ColNum)), _ order1:=xlAscending, Header:= xl否
' Declare all whole numbers as 'Long', no need to use 'Integer'.
' The 'Set' keyword is used for objects like workbooks, worksheets
' and ranges. Remove it from the other variable types.
' Set or add values to the variables close to their declarations.
' Qualify your objects: 'FinalSheet.Range(...)' vs 'Range(...)'.
' Use variables to make the code more readable ('drg').
'These are actually set elsewhere and passed in, shown here for example
Dim SourceSheet As Worksheet: Set SourceSheet = ThisWorkbook.Worksheets(1)
Dim SourceFirstRow As Long: SourceFirstRow = 2
Dim SourceLastRow As Long: SourceLastRow = 15
Dim MyWB As String: MyWB = "DataFile.xlsx" ' or whatever extension
Dim MyWS As String: MyWS = "Data"
Dim FinalFirstRow As Long: FinalFirstRow = 2
Dim FinalFirstColumn As Long: FinalFirstColumn = 1
Dim FinalLastColumn As Long: FinalLastColumn = 20
Dim ColNum As Long: ColNum = 4
'These is the relevant code from the subroutine
Dim FinalSheet As Worksheet
Set FinalSheet = Workbooks(MyWB).Worksheets(MyWS)
Dim CurrentFinalRow As Long: CurrentFinalRow = FinalFirstRow
Dim AllCells As Range: Set AllCells = FinalSheet.Cells ' useless
Dim SortColumn As Range: Set SortColumn = FinalSheet.Columns(ColNum) ' useless
Dim SourceRow As Long
For SourceRow = SourceFirstRow To SourceLastRow
'Fill in a whole bunch of data into the rows and columns on the final sheet
'not all source rows are transferred
CurrentFinalRow = CurrentFinalRow + 1 'Sets it ready for the next blank line to be filled
Next SourceRow
Dim drg As Range
With FinalSheet
Set drg = .Range(.Cells(FinalFirstRow, FinalFirstColumn), _
.Cells(CurrentFinalRow - 1, FinalLastColumn))
End With
drg.Sort Key1:=drg.Cells(ColNum), Order1:=xlAscending, Header:=xlNo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.