2016-05-04 14 views
0

私はVBAを初めて使うので、助けを求める必要があります。 以下、アクティブシートの最初の列の値に基づいて、別のシート[AB]のデータを合計するVBAコードを取得しました。行と列の数は可変であるため、セルのアドレスは絶対的である必要があります。可変範囲の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

セル(r、1).valueを使用している場合は、範囲アドレスをmyCritとして使用していますか? –

+0

残念ながら、それは助けにはなりません。あなたが動作する可能性のある他のセルのアドレス形式について考えることはできますか? – Borro

+0

範囲(myCrit)またはセル(r、1)を試してみました –

答えて

0

select文を使用しないようにしてください。また、私はあなたのコードを書き換えました

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 

(これは、それぞれの間にリフレッシュ画面はExcelシートに書き込むと、はるかに速くそれを作る最後に、すべての更新を無効にします)あなたのコードをスピードアップするために Application.ScreenUpdatingプロパティを使用することを学びますselect文を使用しないでください。それを見て、各パーツの仕組みを理解できるかどうかを見てください。

+0

ありがとう、このコードは素晴らしいです! – Borro

0

範囲が必要で、設定が必要です。あなたはこのようなmyval後のDebug.Printを書いた場合、あなたのコードでは、:

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あなたはVBAとSUMIFのいくつかの例を見つけることができます。