2016-05-04 87 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。