2014-11-21 3 views
1

내 문제는 일종의 일종의 일종으로, herehere이 혼합되어 있지만 그다지 큰 문제는 아닙니다. 필자는 일련의 순수한 데이터 포인트보다 계층 구조와 같은 구조의 이상한 데이터 세트를 가지고 있습니다. 이런 식으로 뭔가 : - 캡처 다음 그룹없이VBA Excel - 소계 수식을 특정 행에 삽입

Item       Budget  Sales 
GROUP - Cats      0   120 
FY 13 Persian      0   0 
FY 13 Maine Coon     12   0 
FY 14 Maine Coon     50   0 
FY 12 Tabby      1   0 
FY 13 Tabby      1   0 
FY 14 Tabby      2   0 
FY 14 Alley      12   0 
GROUP - Dogs      0   201 
FY 14 Collie      20   0 
FY 14 Lab      31   0 
FY 13 Golden Retriever   12   0 
FY 12 Golden Retriever   0   0 
GROUP - Gold Fish     0   50 
FY 14 Goldfish     100   0 
FY 13 Clown Fish     20   0 
Tanks Fees      150   0 

나는 깔끔하게 GROUP 라인을 식별하고 그 아래 그룹을 요약 할 수있는 매크로가 필요합니다. 즉, 고양이 예산 만 합산하려면 고양이 예산 라인이 필요합니다.

그래서 매크로는 "GROUP *"이있는 줄을 식별 한 다음 다음 "GROUP *"을 찾을 때까지 검색하고 고양이와 개 사이의 공간을 합산하십시오. "GROUP - Cats"줄에.

나는 이것이 가능해야한다는 것을 알고 있지만, 나는 VBA의 나의 기본적인 능력에 너무 복잡하다고 걱정한다.

EDIT : 최종 제품은 간단히 = SUM (B3 : B9) 인 예산 열의 수식이됩니다. 그러면 B10 (Dogs GROUP)은 = SUM (B11 : B14)과 같은 수식을 갖게됩니다. 금 물고기 : = SUM (B16 : 18).

하지만 각 데이터 세트가 항상 변경되기 때문에 (예 : 지난 주 18 개가 아닌 고양이 섹션에 20 줄이있을 수 있음) GROUP 행 사이에 공백을 찾을 수있는 매크로가 필요합니다.

편집 2 : VBA를 내가 현재 사용하고 내가 무엇을 찾고 유사한 무언가를하고있어 - 그것은 본질적 그룹과 붕괴 판매 열에 표시되는 숫자에 따라 내 섹션 :

Dim rStart As Range, r As Range 
Dim lLastRow As Long, sColumn As String 
Dim rColumn As Range 
'### The Kittens everywhere! thing is just to make sure the last group has an end point 
Range("C1").End(xlDown).Offset(1).Value = "Kittens everywhere!" 
    sColumn = "C" 

With ActiveSheet.Outline 
     .AutomaticStyles = False 
     .SummaryRow = xlAbove 
     .SummaryColumn = xlRight 

lLastRow = Cells(Rows.Count, sColumn).End(xlUp).Row 
With ActiveSheet 
    Set rColumn = .Range(.Cells(1, sColumn), Cells(lLastRow, sColumn)) 
    With rColumn 
     Set r = .Cells(1, 1) 
     Do Until r.Row > lLastRow 
      If rStart Is Nothing Then 
       If r.Value = "0" Then 
        Set rStart = r 
       End If 
      Else 
       If r.Value <> "0" Then 
        Range(rStart, r.Offset(-1, 0)).Rows.Group 
        Set rStart = Nothing 
       End If 
      End If 
      Set r = r.Offset(1, 0) 
     Loop 
    End With 
End With 
ActiveSheet.Outline.ShowLevels RowLevels:=1 
End With 

Range("C:C").Find("Kittens everywhere!").ClearContents 

GROUP 행을 강조 표시하는 것과 같은 몇 가지 작업을 수행하기 때문에 매크로에 더 많은 것이 있습니다.하지만이 SUM 함수를 해당 섹션에 넣을 수 있는지 없는지는 확실합니다.

+0

정확하게 혼동 스러울 지 모르겠지만 조금 더 자세한 정보를 추가했습니다. 잘하면 도움이 될 것입니다. :/ – PersonalSpace

+1

Duly는 언급했다. 나는 그것이 현재 목표에 적응할 수 있을지 모르지만 나는 이미 가지고있는 것을 조금 추가했다. – PersonalSpace

답변

1

이 내용은 적절할 수도 있지만 적절하지 않을 수도 있지만 옵션을 제공합니다. 내장 된 Excel SubTotal 함수를 사용합니다. 장단점이 있습니다 (아래 참조). 지우기 예에

Sub STPets() 
Dim ws As Worksheet 
Dim strow As Long, endrow As Long, stcol As Long, endcol As Long 
Dim drng As Range 

strow = 3 
stcol = 3 'Col C 
endcol = 6 'Col F 

Set ws = Sheets("Sheet1") 

    With ws 
     'find last data row 
     endrow = Cells(Rows.Count, stcol).End(xlUp).Row 

     'sort data 
     Set drng = .Range(.Cells(strow, stcol), .Cells(endrow, endcol)) 
     drng.Sort Key1:=.Cells(strow + 1, stcol), Order1:=xlAscending, Header:=xlYes 

     'apply Excel SubTotal function 
     .Cells.RemoveSubtotal 
     drng.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(3) 

    End With 

End Sub 

과 하나

그것은 두 잠수정을 요구 한 합계를 적용 당신이 그것을 볼 수 있듯이

Apply SubTotals

Remove SubTotals

:이 매크로에 할당 된 두 개의 버튼을 사용하여 데이터를 집계하고 마음대로 해제 할 수 있습니다

Sub RemoveSTPets() 
Dim ws As Worksheet 

Set ws = Sheets("Sheet1") 
ws.Cells.RemoveSubtotal 

End Sub 

: 더 많은 데이터를 추가 할 수 데이터의 약간의 재정렬이 필요하지만 틀림없이 이것이 데이터베이스 형식에보다 유연하고 일관성이 있습니다 (미래를 바라 보는 것). 또한 목록에 새 데이터를 추가하는 것이 더 쉽고 그룹 (코드)을 추가/변경 (예 : 지우기> 더 많은 데이터 추가> 다시 합계)하는 것이 더 쉽습니다. Excel 소계 기능에 따라 추가로 사용자 지정할 수 있습니다.

마지막으로 간단한 보고서를 지나치게 많이 먹을 위험이 있지만 아마도 'FY13'및 'FY14'식별자를 별도의 'FY'열로 구분하는 것이 좋습니다. . 그러면 시간이 지남에 따라 데이터 분석을보다 유연하게 수행 할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 이것은 위대한 일입니다. 나는 그것을 시도해 볼 것이지만, 데이터를 가지고 나의 역할을 초과 할 수 있기 때문에, 열을 추가하고 의지하는 것에 대해 조금 불안하다. – PersonalSpace

+0

좋습니다. 데이터 파일의 복사본에 대한 실험을하고 시간이 지남에 따라 그것을 사용하여 자신의 컨텍스트에서 작동하는지 확인하는 것이 좋습니다. 응답에서 귀하의 질문에 대한 대답 여부와 동의 여부를 확인하십시오. 그렇지 않다면 당신의 필요가 여전히 충족되지 않는다는 의견을 추가하십시오. 이 방법으로 당신은 답변이 제공 되었더라도 다른 사람들의 도움을받을 수 있습니다. 분명한 것은 모든 사람을 돕습니다. – barryleajo

관련 문제