Excel VBA在宏中使用范围

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

我需要在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 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