2014-10-28 60 views
0

我在查詢其他幫助來更改報告。我對VBA相當陌生,並且在Excel 2010中編寫了下面的代碼。快速背景 - 數據正在用SQL收集,然後由專有軟件生成以實現卓越。我期待通過突出顯示外部邊界來對動態數據集進行分組。數據集總是從B4開始,我已經在下面定義了。基本上,我創建了這個腳本,在B列中有一個「GroupSummary」值的時候突出顯示一個分組。分組結束於最後一行,任何時候有一個值「2」,後面是一個值「0」。在下面的例子中,分組將在3行在VBA中動態分組

結束例如:

ROW 1 "Group Summary" , "A" , "0" 
ROW 2 "Summary" ,  "A" , "2" 
ROW 3 "Summary" ,  "A" , "2" 
ROW 4 "Summary" ,  "B" , "0" 

我現在想更進一步藉此,並強調只有分組當上述條件得到滿足,所有的最後一列中的值是相同的。見下面的例子。分組應在第3行

ROW 1 "Group Summary" , "A" , "0" 
ROW 2 "Summary" ,  "A" , "2" 
ROW 3 "Summary" ,  "A" , "2" 
ROW 4 "Summary" ,  "B" , "2" 
ROW 5 "Summary" ,  "B" , "0" 

這裏就結束了,是我已經寫的代碼:

Dim LastCol As Integer 
Dim Z As Integer, StartRow As Integer, EndRow As Integer 
LastCol = Range("B4").End(xlToRight).Column 
Z = 5 
Do 

    If Cells(Z, LastCol) = 0 And StartRow <> 0 Then 
     EndRow = Z - 1 
     Range(Cells(StartRow, 2), Cells(EndRow, LastCol - 2)).Select 
     With Selection 
       .Borders(xlEdgeLeft).Weight = xlMedium 
       .Borders(xlEdgeLeft).ColorIndex = 1 
       .Borders(xlEdgeRight).Weight = xlMedium 
       .Borders(xlEdgeRight).ColorIndex = 1 
       .Borders(xlEdgeTop).Weight = xlMedium 
       .Borders(xlEdgeTop).ColorIndex = 1 
       .Borders(xlEdgeBottom).Weight = xlMedium 
       .Borders(xlEdgeBottom).ColorIndex = 1 
     End With 
     StartRow = 0 
    End If 

    If Cells(Z, 2) = "GroupSummary" Then 
     StartRow = Z 

    End If 

    Z = Z + 1 

    Loop Until Cells(Z, 2) = "" And Cells(Z - 1, 2) = "" 
+1

此代碼是否適合您? – barryleajo 2014-10-28 21:56:33

+0

是的,但現在我想進一步提到它,並想知道是否有人可以提供幫助。 – user3746034 2014-10-29 04:04:02

回答

0

下面的代碼產生以下輸出 - 爲您調整無疑(陰影組是您的數據的例子):

enter image description here

代碼:保持你的基本方法

Sub grps() 
Dim FirstCol As Long, LastCol As Long 
Dim grpRows As Long, grpHere As Long 
Dim Z As Long, StartRow As Long, EndRow As Long, gsRow As Long 
Dim grpChar As String 

FirstCol = 2 'col B 
StartRow = 4 
EndRow = Cells(Rows.Count, FirstCol).End(xlUp).Row 
LastCol = Cells(StartRow, Columns.Count).End(xlToLeft).Column 

    For Z = StartRow To EndRow 

     If Cells(Z, FirstCol) = "Group Summary" Then 
      gsRow = Z 
      grpRows = 1 

      With Cells(gsRow, FirstCol) 
       grpChar = .Offset(0, 1) 
       grpHere = gsRow 

       Do Until .Offset(grpRows, 2) = 0 
        If .Offset(grpRows, 1) = grpChar Then 
         grpHere = gsRow + grpRows 
         grpRows = grpRows + 1 
        Else 
         Exit Do 
        End If 
       Loop 

       If grpRows > 1 Then 
        Range(Cells(gsRow, FirstCol), Cells(grpHere, FirstCol + 1)).Select 
        With Selection 
         .Borders(xlEdgeLeft).Weight = xlMedium 
         .Borders(xlEdgeLeft).ColorIndex = 1 
         .Borders(xlEdgeRight).Weight = xlMedium 
         .Borders(xlEdgeRight).ColorIndex = 1 
         .Borders(xlEdgeTop).Weight = xlMedium 
         .Borders(xlEdgeTop).ColorIndex = 1 
         .Borders(xlEdgeBottom).Weight = xlMedium 
         .Borders(xlEdgeBottom).ColorIndex = 1 
        End With 

       End If 
      End With 
     End If 
    Next Z 

End Sub 
+0

我用你的代碼代替了我的代碼,它沒有突出顯示分組,所以我決定運行調試器。當我將鼠標懸停在開始行程上時,它的值保持爲4.似乎代碼沒有按照數據集的方向工作。我應該在代碼的末尾拋出一個循環嗎?類似於我包含的循環? – user3746034 2014-10-29 15:47:29

+0

Hi @ user3746034 - 代碼適用於我。 StartRow將始終爲4,它正在進行迭代的Z和grpRows。打開Locals窗口,可以更容易看到變量的變化。 – barryleajo 2014-10-29 16:14:35

+0

好的,我使用的是「Group Summary」而不是「GroupSummary」。具有值0和2的列是列Y,並且相同的值在列X中。我應該在代碼中更改哪些內容以便查找這些列?截至目前,代碼使用C列來表示相同的值。 – user3746034 2014-10-29 20:08:34