2016-08-08 24 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) 

例如:

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

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

在工作報告,彼得,湯姆,瑪麗天的總和的A列應計算在內。結果應相應顯示在B欄。

然後,他們的日子總和應在工作表日進行搜索並在範圍內,加起來總的(d:F「,因爲在工作表中的值(‘按鈕’))

的結果應該是:

Peter: 2 
Tom: 3 
Mary: 3 

最後,該結果對應地顯示在工作表 - 報告列B上。


這裏是我的代碼:

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是不準確的位置。

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

回答

0

你遇到的問題是名稱不匹配。湯姆在報告和小寫字母上都是大寫字母。瑪麗在日子工作表「瑪麗」有一個額外的空間。

嘗試儘可能使用較短的變量名,以便您可以讀取每行代碼,而不必用眼睛來回掃描。

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

傳遞給單元格的第一個參數是行,第二個參數是列。

您還應該限定範圍所在的工作表。

所以你行說:

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的值永遠不會被置位(因爲「彼得」 <>「約翰」和「湯姆」 <>「阿蘭」,和「mary」<>「tom」),所以你試圖訪問第0列,從而給出錯誤。 – YowE3K

+0

我直接複製你的代碼.ERROR 91 https://msdn.microsoft.com/en-us/library/aa264506(v=vs.60).aspx爲Rng – evabb