Excel VBA在宏中使用范围
我需要在Excel2007中创建一个宏来排序。我不知道会有多少排。我知道一种查找行数和记录排序的方法,但不知道如何将这些代码位一起使用Excel VBA在宏中使用范围,vba,excel,excel-2007,Vba,Excel,Excel 2007,我需要在Excel2007中创建一个宏来排序。我不知道会有多少排。我知道一种查找行数和记录排序的方法,但不知道如何将这些代码位一起使用 Sub Sort() ' ' Sort Macro ' *find the last row (assuming no more than 100000 rows)* Dim Row As Range Set Row = Range("A100000").End(xlUp).Select ' *code written by record
Sub Sort()
'
' Sort Macro
' *find the last row (assuming no more than 100000 rows)*
Dim Row As Range
Set Row = Range("A100000").End(xlUp).Select
' *code written by recording my sort*
Range("A1:G1").Select
Range(Selection, Selection.End(xlDown)).Select
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B2:B6376" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("D2:D6376" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("F2:F6376" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:G6376")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
我尝试将“行”放在多个位置,但得到了所需的运行时错误“424”对象。我需要这个变量来替换行号(6376),但不确定如何做
我能看到这些线在哪里
Range("A1:G1").Select
Range(Selection, Selection.End(xlDown)).Select
我正在选择工作簿的内容,这正是我想要的,我只是不知道如何动态地进行
编辑:我要排序和小计。这是录制的宏。我需要改变6376是动态的,根据有多少行
Sub Macro4()
'
' Macro4 Macro
'
'
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B2:B6376" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("D2:D6376" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("F2:F6376" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:G6376")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(7), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=True
Selection.Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(7), _
Replace:=False, PageBreaks:=False, SummaryBelowData:=True
Selection.Subtotal GroupBy:=4, Function:=xlSum, TotalList:=Array(7), _
Replace:=False, PageBreaks:=False, SummaryBelowData:=True
End Sub
谢谢。将“C2”中的“C”替换为要排序的列
ActiveWorkbook.Worksheets("Sheet1").UsedRange.Sort key1:=Range("C2"), _
order1:=xlAscending, header:=xlYes
把整张床单整理一下。如果key1处的列不存在,您将得到一个错误,这很有意义;),因此,请确保它是正确的。不确定您的数据设置,您可以尝试以下方法,其中包括对B、D和F列的简单排序例程,假设您的数据从a列开始(它也将在2003年运行,但我想这不是问题)。 我并没有在你们的代码中包含MatchCase,这是一个记录的问题,不一定是你们想要的;但你可以决定 编辑添加小计的例行程序 EDIT2添加到排序的标题参数
Option Explicit
Sub SortAndSubtotal()
Dim RG As Range
Dim WS As Worksheet
Set WS = Worksheets("Sheet2") '<--Change as needed
Set RG = WS.Range("a1").CurrentRegion
With RG
.Sort key1:=.Columns(2), order1:=xlAscending, _
key2:=.Columns(4), order2:=xlAscending, _
key3:=.Columns(6), order3:=xlAscending, _
Header:=xlYes, MatchCase:=False
.Sort key1:=.Columns(1), order1:=xlAscending, Header:=xlYes
End With
'Note that I am just selecting a single cell in the range, since the range will
' expand with each Subtotal. One could also use
' RG.CurrentRegion as the Range Object Expression, but you need to use it
' individually for each .Subtotal operation, to handle the expansion issue.
' Or you could use With RG and then prefix each Subtotal line with .CurrentRegion
With RG(1)
.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(7), _
Replace:=True, SummaryBelowData:=True
.Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(7), _
Replace:=False, SummaryBelowData:=True
.Subtotal GroupBy:=4, Function:=xlSum, TotalList:=Array(7), _
Replace:=False, SummaryBelowData:=True
End With
End Sub
选项显式
小计
变暗RG As范围
将WS设置为工作表
设置WS=工作表(“Sheet2”)”未测试
给我试试这个
Sub Sample()
Dim thisWb As Workbook
Dim ws As Worksheet
Dim lRow As Long
Dim rng As Range
Set thisWb = ThisWorkbook
'~~> Set this to the relevant sheet
Set ws = thisWb.Sheets("Sheet2")
With ws
'~~> Find the last Row. See the below link for more details
'~~> http://stackoverflow.com/questions/11169445/error-finding-last-used-cell-in-vba
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lRow = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lRow = 1
End If
'~~> Set your range
Set rng = .Range("A1:G" & lRow)
With .Sort.SortFields
.Clear
.Add Key:=ws.Range("B2:B" & lRow), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.Add Key:=ws.Range("D2:D" & lRow), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.Add Key:=ws.Range("F2:F" & lRow), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
End With
With .Sort
.SetRange ws.Range("A1:G" & lRow)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
'~~> Work with the range
With rng
.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(7), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=True
.Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(7), _
Replace:=False, PageBreaks:=False, SummaryBelowData:=True
.Subtotal GroupBy:=4, Function:=xlSum, TotalList:=Array(7), _
Replace:=False, PageBreaks:=False, SummaryBelowData:=True
End With
End Sub
子样本()
将此WB设置为工作簿
将ws设置为工作表
暗淡的光线和长的一样
变暗rng As范围
设置thisWb=thishworkbook
“~~>将其设置为相关的工作表
设置ws=thisWb.Sheets(“Sheet2”)
与ws
“~~>找到最后一行。有关更多详细信息,请参阅下面的链接
'~~> http://stackoverflow.com/questions/11169445/error-finding-last-used-cell-in-vba
如果Application.WorksheetFunction.CountA(.Cells)为0,则
lRow=.Cells.Find(内容:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
其他的
lRow=1
如果结束
“~~>设置您的范围
设置rng=.Range(“A1:G”和lRow)
使用.Sort.SortFields
清楚的
.Add Key:=ws.Range(“B2:B”和lRow),SortOn:=xlSortOnValues_
顺序:=xl升序,数据选项:=xlSortNormal
.Add Key:=ws.Range(“D2:D”和lRow),SortOn:=xlSortOnValues_
顺序:=xl升序,数据选项:=xlSortNormal
.Add Key:=ws.Range(“F2:F”和lRow),SortOn:=xlSortOnValues_
顺序:=xl升序,数据选项:=xlSortNormal
以
用。排序
.SetRange ws.Range(“A1:G”和lRow)
.Header=xlYes
.MatchCase=False
.方向=xlTopToBottom
.SortMethod=xl拼音
.申请
以
以
“~~>使用范围
带rng
.小计分组依据:=1,函数:=xlSum,总计列表:=数组(7)_
替换:=真,分页符:=假,摘要低于数据:=真
.小计分组依据:=2,函数:=xlSum,总计列表:=数组(7)_
替换:=False,分页符:=False,汇总数据:=True
.小计分组依据:=4,函数:=xlSum,总计列表:=数组(7)_
替换:=False,分页符:=False,汇总数据:=True
以
端接头
谢谢@SiddharthRout。这是一个有用的链接,但我仍然不知道如何使用带有未知行的dim。例如,设置rng=Range(“A1:B10”)-如果我不知道列结束于“B”,行结束于“10”,我如何将其插入dim?是否将您引导到正确的方向:)@jabs如果我回忆正确,此代码将永远不会在Excel 2003中运行。SortFields对象是在2007年添加的;最大行数是65534。@RonRosenfeld:谢谢你的评论。我的错误。我用的是2007年。在脸上,我还想用一个小计,所以得到最后一个值很重要。我更新了问题以反映这一点。你所说的“获取”是什么意思?获取最后一行的行号。这样,我就可以将它插入排序和小计例程“将它插入排序和小计例程”--你把我弄丢了。但是最后一行的数字很简单:UsedRange.Rows.Count
给出了它。我解释得不好,所以谢谢你的支持。那么,一旦找到最后一行,如何替换代码中的硬编码值?i、 e.如何用.SetRange范围(“A1:UsedRange.Rows.Count”)替换.SetRange范围(“A1:G6376”)。虽然效果不太好,但很接近。总共给了我三千美元。我现在有一个会议,很快就会离线,但稍后会继续查看。我当时提供了更多的细节。对不起,现在是凌晨2点。我也要睡觉了:)你可以在任何免费的文件共享网站(如www.wikisend.com)上发布样本工作簿,然后在这里共享链接。使用宏记录器生成所需的结果,然后上载该文件。我会照顾好你的,谢谢!该文件有效。该文件应用了以下操作:按B、D、F排序,然后按A小计(选中“替换当前总计”)、B(未选中)、D(未选中)。+1谢谢-这可以用于排序,但我已将问题扩展到包括小计。@jabs小计例程已添加。另外,我注意到您也在列A上进行排序,所以我将其添加到排序例程中,这几乎是完美的。问题是第一行是列名。这些名称按初始排序,这会把小计搞得一团糟。我将dim RG更改为Set RG=WS.Ran