ผลรวมย่อยในมาโครข้อมูลสด

ฉันได้สร้างตารางข้อมูลผ่านการรายงานของ Sharperlight ที่สร้างผลลัพธ์เป็น Excel ดังที่แสดงด้านล่าง:-

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งที่ฉันต้องการทำคือพัฒนาแมโครที่จะรวมย่อยทุกประเภทของข้อมูล ไม่มีการกำหนดขนาดความยาวของตาราง เว้นแต่จะเป็นคอลัมน์ G - J เสมอ

ความหวังของฉันคือเมื่อผู้ใช้รีเฟรชตารางโดยใช้เมนูด้านข้าง พวกเขาจะสามารถเรียกใช้แมโครเพื่อให้ได้ผลรวมอย่างรวดเร็วหนึ่งบรรทัดสำหรับแต่ละหมวดหมู่

ใครสามารถช่วยเรื่องนี้ได้บ้าง???


person user1086159    schedule 13.06.2013    source แหล่งที่มา
comment
ผู้ใช้จะเปลี่ยนค่าในเมนูได้อย่างไร? กำลังพิมพ์เหรอ?   -  person    schedule 13.06.2013
comment
พวกเขาคลิกสองครั้งเพื่อเปิดเมนูย่อยสำหรับปีเดือนและประเภทการโพสต์ ทั้งหมดนี้เป็นเพียงการรีเฟรชตารางและอนุญาตให้กรองข้อมูลเฉพาะบางอย่าง เช่น ปี   -  person user1086159    schedule 13.06.2013
comment
กิจกรรมอะไรคือการรีเฟรช? เพราะคุณสามารถเพิ่มส่วนย่อยอื่นได้หลังจากการรีเฟรชเพื่อคำนวณผลรวม   -  person    schedule 13.06.2013
comment
เมื่อตารางรีเฟรชตารางจะดึงข้อมูลจากแบบสอบถาม SQL โดยไม่ต้องคัดลอกและวางค่าเท่านั้น ฉันไม่เห็นวิธีรวมกลุ่มย่อยใช่ไหม   -  person user1086159    schedule 13.06.2013
comment
ข้อมูลเริ่มต้นแถวใด   -  person    schedule 13.06.2013
comment
ส่วนหัวคือแถวที่ 4 ข้อมูลแถวที่ 5 จะเป็นคอลัมน์ G - J เสมอ   -  person user1086159    schedule 13.06.2013
comment
ตาราง Pivot (และความเป็นไปได้ของตัวกรองที่มีให้ตามค่าเริ่มต้น) ไม่ใช่ตัวเลือกใช่ไหม   -  person MikeD    schedule 13.06.2013


คำตอบ (1)


คลิกขวาที่แท็บ sheet1 > ดูโค้ด
sheet1 view code
วางโค้ดนี้

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 4 Then
        If Target.Row = 4 Or Target.Row = 5 Or Target.Row = 6 Then Totals
    End If
End Sub

จากนั้นเพิ่ม module คลิกขวา Sheet1 ใน Project Explorer ใน VBE window และ Insert > Module
จากนั้นใส่รหัสนี้

Sub Totals()

    Range("C10:D" & Range("C10:C" & Rows.Count).End(xlDown).Row).ClearContents
    Dim startAtRow As Long
    startAtRow = 10 ' Set starting row
    Dim lr As Long, i As Long, j As Long
    lr = Range("J" & Rows.Count).End(xlUp).Row
    ReDim arr(lr - 4) As String
    For i = 5 To lr
        arr(i - 5) = Range("J" & i).Value
    Next i
    Dim arr2() As String
    arr2 = arr
    RemoveDuplicate arr
    For i = LBound(arr) To UBound(arr) - 1
        Range("C" & (i + startAtRow)).Value = arr(i)
        For j = LBound(arr2) To UBound(arr2) - 1
            If arr(i) = arr2(j) Then
                Range("D" & (i + startAtRow)).Value = Range("D" & i + startAtRow).Value + Range("I" & (j + 5)).Value
            End If
        Next j
    Next i

End Sub

Private Sub RemoveDuplicate(ByRef StringArray() As String)
    Dim lowBound$, UpBound&, A&, B&, cur&, tempArray() As String
    If (Not StringArray) = True Then Exit Sub
    lowBound = LBound(StringArray): UpBound = UBound(StringArray)
    ReDim tempArray(lowBound To UpBound)
    cur = lowBound: tempArray(cur) = StringArray(lowBound)
    For A = lowBound + 1 To UpBound
        For B = lowBound To cur
            If LenB(tempArray(B)) = LenB(StringArray(A)) Then
                If InStrB(1, StringArray(A), tempArray(B), vbBinaryCompare) = 1 Then Exit For
            End If
        Next B
        If B > cur Then cur = B: tempArray(cur) = StringArray(A)
    Next A
    ReDim Preserve tempArray(lowBound To cur): StringArray = tempArray
End Sub

ตอนนี้ทุกครั้งที่ผู้ใช้เปลี่ยนค่าของ D4,D5,D6 ผลลัพธ์ของคุณควรอัปเดต หมวดหมู่จะแสดงเริ่มต้นที่ C10 ลงมา และผลรวมจะแสดงที่ D10 ลงมา มีลักษณะเช่นนี้ ( เวอร์ชันตัวอย่าง )
results

person Community    schedule 13.06.2013
comment
มันอัศจรรย์มาก!! ขอบคุณมาก. ถ้าฉันต้องการให้ผลรวมย่อยปรากฏบนแผ่นงานแยกแทนที่จะเป็น C10 และ D10 ลง การเปลี่ยนแปลงง่ายพอที่จะหรือไม่ - person user1086159; 13.06.2013
comment
ใช่. นำหน้า Range("D" ... ด้วย Sheets("sheet name").Range("D" ... + sheets(1).Range("I" ... และหากคุณต้องการเปลี่ยนแถวเริ่มต้น ให้อ้างอิงถึงความคิดเห็นในโค้ดที่ระบุว่า Set starting row และแถวเปลี่ยนค่าจาก 10 เป็นสิ่งที่คุณต้องการ นอกจากนี้ หากคุณต้องการเปลี่ยนคอลัมน์ ให้ใช้ Sheets("sheet name").Cells(startAtRow, [column number here])... หรือแทนที่ตัวอักษร C และ D ด้วยตัวอย่าง A และ B - person ; 13.06.2013