2016-08-08 6 views
0

ここには3つのワークシートがあります。vbaでこのダイナミックレンジを設定する方法は?

button

report

day


ケース:

私は一人一人のための日を合計します。結果はワークシート・レポートに表示されます。

日の情報は、ワークシートの日に格納されます。日は固定されていません。日の範囲は、例えば

row: that person row in worksheet-day 
column :Worksheets("button").Cells(1, 2) to Worksheets("button").Cells(2, 2) 

によるとすべき動的です:ワークシート、レポートの列A、ピーター、トムの日の合計、メアリーに

Worksheets("button").Cells(1, 2) 'store 3 

Worksheets("button").Cells(2, 2) 'store 5 

結果は列Bに対応して表示されるべきである。

その後、日の彼らの合計がワークシート日間で検索し、範囲内の合計(D:F「ワークシート( 『ボタン』の値をため))まで追加する必要があります

結果がでなければなりません:

Peter: 2 
Tom: 3 
Mary: 3 

最後に、この結果はワークシートレポートの列Bに対応して表示されます。私はRNGがここに不正確だと思い

Sub gg() 
row = Worksheets("report").Range("A" & Rows.Count).End(xlUp).row 
Row2 = Worksheets("day").Range("A" & Rows.Count).End(xlUp).row 
Dim rng As Range 'the range for sum 
Dim row999 As Integer 'store the selected row index 

For k = 2 To Row2 'check and store appropriate row 
    If Worksheets("report").Cells(1, k).Value = Worksheets("day").Cells(1, k).Value Then 
     row999 = ActiveCell.row 
    End If 
Next k 

rng = Range(Cells(Worksheets("button").Cells(1, 2), row999), Cells(Worksheets("button").Cells(2, 2), row999)) 

For j = 2 To row 'do the sum 
    Worksheets("report").Cells(2, i) = Application.WorksheetFunction.Sum(rng) 
Next j 
End Sub 


は、ここに私のコードです。

rng = Range(Cells(Worksheets("button").Cells(1, 2), row999), Cells(Worksheets("button").Cells(2, 2), row999)) 

答えて

0

問題は、名前が一致しないことです。トムはレポートで大文字で、1日で小文字です。 Maryは、Dayワークシート "mary"に余分なスペースを持っています。

可能な限り短い変数名を使用して、目で前後にスキャンすることなくコードの各行を読み取るようにしてください。ライン

Sub ProcessDays() 
    Dim day1 As Integer, day2 As Integer 
    Dim i As Integer, j As Integer 
    Dim name1 As String, name2 As String 

    With Worksheets("button") 
     day1 = .Cells(1, 2) 
     day2 = .Cells(2, 2) 
    End With 

    With Worksheets("day") 

     For i = 2 To Worksheets("report").Range("A" & Rows.Count).End(xlUp).Row 
      For j = 2 To .Range("A" & Rows.Count).End(xlUp).Row 
       name1 = UCase(Trim(Worksheets("report").Cells(i, 1))) 
       name2 = UCase(Trim(.Cells(j, 1))) 

       If name1 = name2 Then 

        Set rng = .Range(.Cells(j, day1), .Cells(j, day2)) 

        Worksheets("report").Cells(i, 2) = WorksheetFunction.Sum(rng) 

       End If 
      Next 
     Next 

    End With 

End Sub 
0

Cellsに渡される最初のパラメータは行で、2番目のパラメータは列です。

また、範囲が設定されているワークシートを修飾する必要があります。

だからあなたのラインは言って:

rng = Range(Cells(Worksheets("button").Cells(1, 2), row999), Cells(Worksheets("button").Cells(2, 2), row999)) 

rng = Worksheets("day").Range(Cells(row999, Worksheets("button").Cells(1, 2)), _ 
           Cells(row999, Worksheets("button").Cells(2, 2))) 

は、しかし、あなたのコード内の他のエラーの多くを持っていると言うべきです。私はあなたが望んでいると信じています:

Sub gg() 
    Dim lastrowReport As Long 
    Dim lastrowDay As Long 
    Dim rowReport As Long 
    Dim rowDay As Long 
    lastrowReport = Worksheets("report").Range("A" & Rows.Count).End(xlUp).row 
    lastrowDay = Worksheets("day").Range("A" & Rows.Count).End(xlUp).row 
    Dim rng As Range 'the range for sum 

    For rowReport = 2 To lastrowReport ' loop through each of the rows on the report 
     For rowDay = 2 To lastrowDay ' find the entry for this person on the days sheet 
      If Worksheets("report").Cells(rowReport, 1).Value = Worksheets("day").Cells(rowDay, 1).Value Then 
       set rng = Worksheets("day").Range(Worksheets("day").Cells(rowDay, Worksheets("button").Cells(1, 2)), _ 
                Worksheets("day").Cells(rowDay, Worksheets("button").Cells(2, 2))) 
       Worksheets("report").Cells(rowReport, 2) = Application.WorksheetFunction.Sum(rng) 
       Exit For 
      End If 
     Next 
    Next 

End Sub 
+0

RNG:オブジェクト定義エラー – evabb

+0

@evabb - あなたの元のコードでは、row999の値が(理由は「ピーター」<>「ジョン」、および「トム」<>「アラン」設定されていないされませんでした、 and "mary" <> "tom")、カラム0にアクセスしようとしていたので、エラーが発生しました。 – YowE3K

+0

私はあなたのコードを直接コピーします.ERROR 91 https://msdn.microsoft.com/en-us/library/aa264506(v=vs.60).aspx Rng – evabb

関連する問題