Excel 2007 开发的分布式数据整合统计方案

  近日,工作上遇到了一些数据处理问题,同事一直头痛如何处理,我帮忙看了一下,情况是客户提供一堆测试方案文件,文件中的项目由不同部门完成,最后要把数据整合,并统计,总共有几百上千条。本来应该由IT 人员开发一个WEB 服务,按部门逐一分类,由各个部门负责人在网上更新 ,最后统计导出Excel .但这样做好像大费周章,写申请,等审核,一来一回没有半年三五个月都搞不定,还是自己动手丰衣足食。于是用Excel 2007 开发一个分布式数据整合统计方案 ,仅供参考。

 

流程图简介如下:

 

 

设计三个按钮,按下任务分按钮配如下图:

 

 

其中按钮时自动根据数据表里的部门集合,归类为一个按钮,其中一个按钮可以产生该部门相关的所有项目,该窗体有如下代码

 

Private Sub UserForm_Initialize()

Dim nCtr As MSForms.CommandButton
i = 2
j = 1
Sheets("HWV requirements").Range("Q5:Q400").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("HWV requirements").Range("AG1"), Unique:=True


    Do While Not Sheets("HWV requirements").Cells(i, 33) = ""
    
        Set nCtr = UserForm4.Controls.Add("Forms.CommandButton.1", "cmdTest" & i)
        With nCtr
            .Top = Me.Height / 6 * ((j - 1) \ 4) + 70
            .Left = Me.Width / 5 * ((j - 1) Mod 4) + 30
            .Width = 70
            .Height = 25
            .Caption = Cells(i, 33)
        End With
       
      
      Set ctlCB(i) = New cCB
                              ' 将控件赋给类实例
        ctlCB(i).Init nCtr
      
      i = i + 1
      j = j + 1
    Loop
 
  
  Sheets("HWV requirements").Columns(33).Delete
  Sheets("HWV requirements").Cells(1, 1).Select
  
End Sub

 

每一个按钮为一个控件类,用户可以根据这个调整窗体的属性外观按钮分布及大小,通过点击动作,可以实现把数据表里其中某一部门所有数据生成一个新的表,这样测试人员可以自己维护自己部门相关的测试项目,点击后会产生如下图表格:

 

控件类代码如下:

 

Private WithEvents m_CB As MSForms.CommandButton
' 初始化,将控件绑定到类
Public Sub Init(ctl As MSForms.CommandButton)
Set m_CB = ctl
End Sub
' 控件的Click事件
Private Sub m_CB_Click()


Dim stn As String
Dim i, j, k
   
    Dim a1()
    a1 = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28)
    j = 3
    i = 5
    k = 1
  
    stn = Trim(m_CB.Caption)
  
    stn = Replace(stn, "/", "-")
 
   
   
   If SheetExist(stn) = 0 Then
        'Sheets.Add.Name = stn
       
      Dim sh As Worksheet
      Set sh = Sheets.Add(after:=Worksheets("HWV requirements"))
      sh.Name = stn
  
      Dim btn1 As CommandButton
      Dim ole1 As OLEObject
      Set ole1 = sh.OLEObjects.Add(classtype:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=10, Top:=10, Width:=120, Height:=25)
      Set btn1 = ole1.Object
      btn1.Caption = "删除表  " & stn
 
      With ActiveWorkbook.VBProject.VBComponents(sh.CodeName).CodeModule
      .InsertLines 1, "Private Sub CommandButton1_Click()"
      .InsertLines 2, "Worksheets(" & Chr(34) & stn & Chr(34) & ").Delete"
      .InsertLines 3, "End Sub"
      End With
       
       
       
      Dim btn2 As CommandButton
      Dim ole2 As OLEObject
      Set ole2 = sh.OLEObjects.Add(classtype:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=10, Top:=20, Width:=120, Height:=25)
      Set btn2 = ole2.Object
      btn2.Caption = "更新表 " & stn
 
      With ActiveWorkbook.VBProject.VBComponents(sh.CodeName).CodeModule
      .InsertLines 1, "Private Sub CommandButton2_Click()"
      .InsertLines 2, "Dim i, j, k"
      .InsertLines 3, "Dim a1()"
      .InsertLines 4, "a1 = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,25,26,27,28)"
      .InsertLines 5, "j = 3"
      .InsertLines 6, "i = 5"
      .InsertLines 7, "k = 2"
  
  
      .InsertLines 8, " Key1 = MsgBox(""是否确定更新"", vbYesNo, ""提示"")"


      .InsertLines 9, "If Key1 = 6 Then"
  
      .InsertLines 10, "Application.ScreenUpdating = False"
      .InsertLines 11, "Do While Not Sheets(" & Chr(34) & stn & Chr(34) & ").Cells(j, 1) = """
        
      .InsertLines 12, " i = 5"
      .InsertLines 13, "Do While Not Sheets(""HWV requirements"").Cells(i, 1) = """
   
        ' If Trim(Sheets("HWV requirements").Cells(i, 17)) = "ODC HW" Then
    
      .InsertLines 14, "If Sheets(" & Chr(34) & stn & Chr(34) & ").Cells(j, 1) = Sheets(""HWV requirements"").Cells(i, 1) Then"
      .InsertLines 15, " For k = 2 To UBound(a1)+1"
      .InsertLines 16, " If Trim(Sheets(" & Chr(34) & stn & Chr(34) & ").Cells(j, k)) <> Trim(Sheets(""HWV requirements"").Cells(i, k)) Then"
        
      .InsertLines 17, "Sheets(" & Chr(34) & stn & Chr(34) & ").Cells(j, k).Copy"
      .InsertLines 18, "Sheets(""HWV requirements"").Cells(i, k).PasteSpecial"
      .InsertLines 19, "End If"
      .InsertLines 20, " Next"
      .InsertLines 21, "Exit Do"
      .InsertLines 22, " End If"
   
      .InsertLines 23, "i = i + 1"
      .InsertLines 24, "Loop"
      .InsertLines 25, "j = j + 1"
    
      .InsertLines 26, "Loop"
      .InsertLines 27, "Application.ScreenUpdating = True"
     
     .InsertLines 28, " End If"
     
      .InsertLines 29, "End Sub"

     End With
       
       
      Application.ScreenUpdating = False
        For k = 1 To UBound(a1) + 1
         Sheets("HWV requirements").Cells(3, k).Copy
         Sheets(stn).Cells(1, k).PasteSpecial
         Sheets(stn).Cells(1, k).Font.Size = "10"
         Sheets(stn).Cells(1, k).Font.Name = "Times New Roman"

        
         Sheets("HWV requirements").Cells(4, k).Copy
         Sheets(stn).Cells(2, k).PasteSpecial
         Sheets(stn).Cells(1, k).Font.Size = "10"
         Sheets(stn).Cells(1, k).Font.Name = "Times New Roman"
        
        Next
       
       Sheets(stn).Columns(5).ColumnWidth = 20
       Sheets(stn).Columns(6).ColumnWidth = 40
       Sheets(stn).Columns(25).ColumnWidth = 40
       Sheets(stn).Rows(1).RowHeight = 30
       Sheets(stn).Rows(2).RowHeight = 60
  
      
       Do While Not Sheets("HWV requirements").Cells(i, 1) = ""
   
        If Sheets("HWV requirements").Cells(i, 17) = Trim(m_CB.Caption) And Sheets("HWV requirements").Cells(i, 21) <> "" Then
          For k = 1 To UBound(a1) + 1
          Sheets("HWV requirements").Cells(i, k).Copy
          Sheets(stn).Cells(j, k).PasteSpecial
   
          '  Sheets("ODC HW").Rows(j).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
          '  Application.CutCopyMode = False
          Next
    
          j = j + 1
         End If
        i = i + 1
       
        UserForm4.Label2.Width = Int(i / Sheets("HWV requirements").UsedRange.Rows.Count * 300)
        UserForm4.Label3.Caption = Int(i / Sheets("HWV requirements").UsedRange.Rows.Count * 100) & "%"
        DoEvents
       Loop
        Application.ScreenUpdating = True
        Sheets(stn).Cells(1, 1).Select
        MsgBox "进度完成!"
   Else
     key2 = MsgBox(stn & " already exist!", , "HWV Prompt")
   End If
   
   
   

End Sub
' 注销类
Private Sub Class_Terminate()
Set m_CB = Nothing
End Sub


Function SheetExist(strSheetName As String) As Integer
    Dim i                                 As Integer
    Dim nNumOfSheets           As Integer
    nNumOfSheets = Worksheets.Count
    For i = 1 To nNumOfSheets
            If Worksheets(i).Name = strSheetName Then Exit For
    Next
    SheetExist = i Mod (1 + nNumOfSheets)
End Function

 

其中次生成的表格中有插入两个按钮 其中更新表按钮是吧每个部门单独更新的结果回填到总表中,不用人工一条条对号。每个部门更新后,就可以统计结果,按下统计结果按钮,如下图就可以生成统计数据:

 

 

 

统计按钮代码如下:

Private Sub CommandButton2_Click()
hw_count = 0
hw_pass = 0
hw_fail = 0
hw_blocked = 0
hw_blank = 0


sit_count = 0
sit_pass = 0
sit_fail = 0
sit_blocked = 0
sit_blank = 0

siv_count = 0
siv_pass = 0
siv_fail = 0
siv_blocked = 0
siv_blank = 0

rel_count = 0
rel_pass = 0
rel_fail = 0
rel_blocked = 0
rel_blank = 0

other_count = 0
other_pass = 0
other_fail = 0
other_blocked = 0
other_blank = 0

For i = 5 To Sheets("HWV requirements").UsedRange.Rows.Count

If Sheets("HWV requirements").Cells(i, 17) = "ODC HW" And Sheets("HWV requirements").Cells(i, 21) <> "" Then
   hw_count = hw_count + 1
  If Sheets("HWV requirements").Cells(i, 22) = "pass" Then
  hw_pass = hw_pass + 1
  ElseIf Sheets("HWV requirements").Cells(i, 22) = "fail" Then
  hw_fail = hw_fail + 1
  ElseIf Sheets("HWV requirements").Cells(i, 22) = "blocked" Then
 hw_blocked = hw_blocked + 1
  Else
   hw_blank = hw_blank + 1
  End If


ElseIf Sheets("HWV requirements").Cells(i, 17) = "ODC SIT" And Sheets("HWV requirements").Cells(i, 21) <> "" Then
   sit_count = sit_count + 1
  If Sheets("HWV requirements").Cells(i, 22) = "pass" Then
  sit_pass = sit_pass + 1
  ElseIf Sheets("HWV requirements").Cells(i, 22) = "fail" Then
  sit_fail = sit_fail + 1
  ElseIf Sheets("HWV requirements").Cells(i, 22) = "blocked" Then
  sit_blocked = sit_blocked + 1
  Else
   sit_blank = sit_blank + 1
  End If

 

ElseIf Sheets("HWV requirements").Cells(i, 17) = "ODC SIV" And Sheets("HWV requirements").Cells(i, 21) <> "" Then
   siv_count = siv_count + 1
  If Sheets("HWV requirements").Cells(i, 22) = "pass" Then
  siv_pass = siv_pass + 1
  ElseIf Sheets("HWV requirements").Cells(i, 22) = "fail" Then
  siv_fail = siv_fail + 1
  ElseIf Sheets("HWV requirements").Cells(i, 22) = "blocked" Then
 siv_blocked = siv_blocked + 1
  Else
   siv_blank = siv_blank + 1
  End If


ElseIf Sheets("HWV requirements").Cells(i, 17) = "ODC REL" And Sheets("HWV requirements").Cells(i, 21) <> "" Then
   rel_count = rel_count + 1
  If Sheets("HWV requirements").Cells(i, 22) = "pass" Then
  rel_pass = rel_pass + 1
  ElseIf Sheets("HWV requirements").Cells(i, 22) = "fail" Then
  rel_fail = rel_fail + 1
  ElseIf Sheets("HWV requirements").Cells(i, 22) = "blocked" Then
  rel_blocked = rel_blocked + 1
  Else
   rel_blank = rel_blank + 1
  End If

 


ElseIf Sheets("HWV requirements").Cells(i, 21) <> "" Then

    other_count = other_count + 1
  If Sheets("HWV requirements").Cells(i, 22) = "pass" Then
  other_pass = other_pass + 1
  ElseIf Sheets("HWV requirements").Cells(i, 22) = "fail" Then
  other_fail = other_fail + 1
  ElseIf Sheets("HWV requirements").Cells(i, 22) = "blocked" Then
  other_blocked = other_blocked + 1
  Else
   other_blank = other_blank + 1
  End If
  
 
 
End If

Next

'MsgBox (hw_count)
'MsgBox (sit_count)
'MsgBox (siv_count)

Sheets("Summary").Range("E27") = hw_pass
Sheets("Summary").Range("G27") = hw_fail
Sheets("Summary").Range("K27") = hw_blocked
Sheets("Summary").Range("M27") = hw_blank

Sheets("Summary").Range("E28") = 100 * hw_pass / hw_count & "%"
Sheets("Summary").Range("G28") = 100 * hw_fail / hw_count & "%"
Sheets("Summary").Range("K28") = 100 * hw_blocked / hw_count & "%"
Sheets("Summary").Range("M28") = 100 * hw_blank / hw_count & "%"

Sheets("Summary").Range("E29") = sit_pass
Sheets("Summary").Range("G29") = sit_fail
Sheets("Summary").Range("K29") = sit_blocked
Sheets("Summary").Range("M29") = sit_blank

Sheets("Summary").Range("E30") = 100 * sit_pass / sit_count & "%"
Sheets("Summary").Range("G30") = 100 * sit_fail / sit_count & "%"
Sheets("Summary").Range("K30") = 100 * sit_blocked / sit_count & "%"
Sheets("Summary").Range("M30") = 100 * sit_blank / sit_count & "%"

Sheets("Summary").Range("E31") = siv_pass
Sheets("Summary").Range("G31") = siv_fail
Sheets("Summary").Range("K31") = siv_blocked
Sheets("Summary").Range("M31") = siv_blank

Sheets("Summary").Range("E32") = 100 * siv_pass / siv_count & "%"
Sheets("Summary").Range("G32") = 100 * siv_fail / siv_count & "%"
Sheets("Summary").Range("K32") = 100 * siv_blocked / siv_count & "%"
Sheets("Summary").Range("M32") = 100 * siv_blank / siv_count & "%"

Sheets("Summary").Range("E33") = rel_pass
Sheets("Summary").Range("G33") = rel_fail
Sheets("Summary").Range("K33") = rel_blocked
Sheets("Summary").Range("M33") = rel_blank

Sheets("Summary").Range("E34") = 100 * rel_pass / rel_count & "%"
Sheets("Summary").Range("G34") = 100 * rel_fail / rel_count & "%"
Sheets("Summary").Range("K34") = 100 * rel_blocked / rel_count & "%"
Sheets("Summary").Range("M34") = 100 * rel_blank / rel_count & "%"


Sheets("Summary").Range("E35") = other_pass
Sheets("Summary").Range("G35") = other_fail
Sheets("Summary").Range("K35") = other_blocked
Sheets("Summary").Range("M35") = other_blank

Sheets("Summary").Range("E36") = 100 * other_pass / other_count & "%"
Sheets("Summary").Range("G36") = 100 * other_fail / other_count & "%"
Sheets("Summary").Range("K36") = 100 * other_blocked / other_count & "%"
Sheets("Summary").Range("M36") = 100 * other_blank / other_count & "%"

 

'统计表一

For j = 8 To 17

ww_plan = 0
ww_pass = 0
ww_fail = 0
ww_blocked = 0
ww_blank = 0


For i = 5 To Sheets("HWV requirements").UsedRange.Rows.Count
If Sheets("HWV requirements").Cells(i, 21) = Sheets("Summary").Cells(j, 1) Then
   If Sheets("HWV requirements").Cells(i, 22) = "pass" Then
    ww_pass = ww_pass + 1
   ElseIf Sheets("HWV requirements").Cells(i, 22) = "fail" Then
    ww_fail = ww_fail + 1
   ElseIf Sheets("HWV requirements").Cells(i, 22) = "blocked" Then
    ww_blocked = ww_blocked + 1
   Else
    ww_blank = ww_blank + 1
  End If
  ww_plan = ww_plan + 1
End If
Next
   Sheets("Summary").Cells(j, 2) = ww_plan
   Sheets("Summary").Cells(j, 3) = ww_pass
   Sheets("Summary").Cells(j, 4) = "=sum(C" & j & ",F" & j & ")"
   Sheets("Summary").Cells(j, 5) = ww_blocked
   Sheets("Summary").Cells(j, 6) = ww_fail
   Sheets("Summary").Cells(j, 7) = ww_blank

Next


'统计剩下


k = InputBox("Please input Work Week Example : ww51 ", "HWV Prompt")
Key1 = MsgBox(k, vbYesNo, "Is it correct?")

If Key1 = 6 Then

ww_hw_blank = 0
ww_sit_blank = 0
ww_siv_blank = 0
ww_rel_blank = 0
ww_other_blank = 0

For i = 5 To Sheets("HWV requirements").UsedRange.Rows.Count
If Sheets("HWV requirements").Cells(i, 21) = k Then
 If Sheets("HWV requirements").Cells(i, 17) = "ODC HW" Then
    If Sheets("HWV requirements").Cells(i, 22) = "" Then
     ww_hw_blank = ww_hw_blank + 1
    End If
 ElseIf Sheets("HWV requirements").Cells(i, 17) = "ODC SIT" Then
   If Sheets("HWV requirements").Cells(i, 22) = "" Then
     ww_sit_blank = ww_sit_blank + 1
   End If
 ElseIf Sheets("HWV requirements").Cells(i, 17) = "ODC SIV" Then
   If Sheets("HWV requirements").Cells(i, 22) = "" Then
    ww_siv_blank = ww_siv_blank + 1
   End If
 ElseIf Sheets("HWV requirements").Cells(i, 17) = "ODC REL" Then
   If Sheets("HWV requirements").Cells(i, 22) = "" Then
    ww_rel_blank = ww_rel_blank + 1
   End If
 Else
    If Sheets("HWV requirements").Cells(i, 22) = "" Then
     ww_other_blank = ww_other_blank + 1
    End If
 End If
End If
Next
     Sheets("Summary").Range("O27") = ww_hw_blank
     Sheets("Summary").Range("O29") = ww_sit_blank
     Sheets("Summary").Range("O31") = ww_siv_blank
     Sheets("Summary").Range("O33") = ww_rel_blank
     Sheets("Summary").Range("O35") = ww_other_blank

End If

 

 

tip = MsgBox("统计完成", , "提示")
End Sub

 

 

最后,按钮自动信任,是放在VBS运行错误,代码如下:

Private Sub CommandButton3_Click()
    Dim x
    On Error Resume Next
    Set x = ActiveWorkbook.VBProject
    If Err <> 0 Then
        Application.SendKeys "%TMST%V~"
    End If
End Sub

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值