2016-05-04 88 views
0

我是VBA的新手,所以我必须要求你的帮助。 下面,我得到了VBA代码,它应该基于来自活动工作表第一列的值,从不同工作表[AB]中汇总数据。行数和列数是可变的,所以单元格地址必须是绝对的。VBA sumif可变范围

Sub sumif_test 

Range("A1").Select 
Selection.End(xlDown).Select 
abc = ActiveCell.Row 
Selection.End(xlUp).Select 
Selection.End(xlToRight).Select 

ActiveCell.Offset(1, 1).Select 

Dim mycrit As Variant 
Dim myval As Variant 
Dim CritRng As Range 
Dim SumRng As Range 

Set CritRng = Worksheets("AB").Range("A:A") 
Set SumRng = Worksheets("AB").Range("N:N") 

c = ActiveCell.Column 
r = ActiveCell.Row 

For r = 2 To abc - 2 
mycrit = Cells(r, 1).Address(RowAbsolute:=False, ColumnAbsolute:=False) 
myval = Cells(r, c).Address(RowAbsolute:=False, ColumnAbsolute:=False) 
myval = Application.WorksheetFunction.SumIf(CritRng, mycrit, SumRng) 

Next r 

End sub 

使用此代码我没有得到任何结果。

+0

您正在使用范围地址作为myCrit,你应该使用单元格(r,1).value吗? –

+0

不幸的是,它并没有帮助。你能想到可以工作的其他单元格地址格式吗? – Borro

+0

你有没有尝试过,范围(myCrit)或只是细胞(r,1) –

回答

0

尽量避免使用select语句。也学会用Application.ScreenUpdating属性来加快你的代码(这将禁用屏幕的每个之间刷新写入Excel工作表和更新的一切在最后使其更快)

Sub sumif_test() 
    Dim ws As Worksheet 
    Dim NoCol As Integer, NoRow As Integer 
    Dim CritRng As Range, SumRng As Range 

    Application.ScreenUpdating = False 

    Set ws = Worksheets("AB") 

    With ws 
     NoRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row 
     NoCol = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column 
     Set CritRng = .Range("A:A") 
     Set SumRng = .Range("N:N") 
    End With 

    For r = 2 To NoRow 
     Cells(r, NoCol) = WorksheetFunction.SumIf(CritRng, Cells(r, 1), SumRng) 
    Next r 

    Application.ScreenUpdating = True 
End Sub 

我已经重写你的代码避免使用select语句。请看看它,看看你能不能弄清楚每个部件的功能。

+0

非常感谢,这段代码很棒! – Borro

0

你需要范围,你需要设置它们。在你的代码,如果你写debug.print这样的后设为myVal:

For r = 2 To abc - 2 
    mycrit = Cells(r, 1).Address(RowAbsolute:=False, ColumnAbsolute:=False) 
    myval = Cells(r, c).Address(RowAbsolute:=False, ColumnAbsolute:=False) 
    myval = Application.WorksheetFunction.SumIf(CritRng, mycrit, SumRng) 
    debug.print myval 
Next r 

End sub 

,你可能会得到一些结果在即时窗口。 CTRL + G。 为了得到一些结果与尝试:

For r = 2 To abc - 2 
    mycrit = Cells(r, 1).Address(RowAbsolute:=False, ColumnAbsolute:=False) 
    myval = Cells(r, c).Address(RowAbsolute:=False, ColumnAbsolute:=False) 
    myval = Application.WorksheetFunction.SumIf(CritRng, mycrit, SumRng) 
    Cells(r,c) = myval 
Next r 

End sub 

最后 - 2个东西 - try to avoid usage of select和格式化你的代码:) Here你会发现SUMIF的一些例子与VBA。