VBA工位平衡分析

excel菜鸟一只,分享一个最近写的vba
先分享一款视频分析软件(ExStrategy FIE v1.0 ),导出的数据格式如下,


Paste_Image.png

该软件导出的文件放置在同一个文件夹下,新建excel文件开启宏,然后粘贴以下代码,模块一

Option Explicit

'汇总数据
Sub Gather()
    
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
    Dim wk As Workbook, Path$, File$, sh As Worksheet, ss$, es As Range, n%
   
    Path = ThisWorkbook.Path
    
    Dim ws As Workbook
    
    Set ws = ThisWorkbook
    Set sh = ws.Worksheets(1)
    sh.Cells.Clear
    
    File = Dir(Path & "\*.xlsx")
    
    Dim R%, cl%, Temp As Range, i%, Item As Range
    '起始位置的行数
    R = 4
    '起始位置的列数
    cl = 2
    
    Do While File <> ""
          If File <> ws.Name Then
            Set wk = Workbooks.Open(Path & "\" & File)
            Set es = wk.Sheets(1).UsedRange.Cells(3, 2).CurrentRegion
            '设置保留一位小数
            es.NumberFormatLocal = "0.0"
            Set Temp = es.Columns(1).Resize(, 1)
            es.Columns(2).Resize(, 1).Copy sh.Cells(R, cl + n)
            With sh
                For i = 1 To Temp.Rows.count
                    With .Cells(R + i - 1, cl + n)
                    If .Comment Is Nothing Then
                       .AddComment Text:=Temp.Cells(i).Value
'                       .Comment.Visible = True
                    End If
                End With
                Next
            .Cells(R - 1, cl + n).Value = Split(wk.Name, ".")(0)
            End With
            n = n + 1
            wk.Close
            File = Dir
          End If
    Loop
    
    '保存汇总表
    ws.Save
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    
    MsgBox "汇总成功!"
    
    
End Sub

在excel中运行该文件,汇总完成后,出现汇总成功的命令。
模块二

Option Explicit

'绘制工位平衡图形
Sub ChartAdd()
      Dim myRange As Range
      Dim myChart As ChartObject
      With Sheet1
     .ChartObjects.Delete
         
        '显示图形
          Set myRange = .UsedRange.Offset(2)
          Set myChart = .ChartObjects.Add(50, 200, 400, 250)
          With myChart.Chart
              .ChartType = xlColumnStacked
               .SetSourceData Source:=myRange, PlotBy:=xlRows
              .ApplyDataLabels ShowValue:=True
              .HasLegend = False
              .HasTitle = True
              .ChartTitle.Text = "平衡分析"
              
              With .ChartTitle.Font
                  .Size = 20
                  .ColorIndex = 3
                  .Name = "华文新魏"
              End With
              With .ChartArea.Interior
                  .ColorIndex = 8
                  .PatternColorIndex = 1
                  .Pattern = xlSolid
              End With
              With .PlotArea.Interior
                  .ColorIndex = 35
                  .PatternColorIndex = 1
                  .Pattern = xlSolid
              End With

          End With
          '监控编辑更新
          Call jiSuan
         
      End With
      Set myRange = Nothing
      Set myChart = Nothing
End Sub

Sub jiSuan()
'计算平衡率
          Dim i%, num%, arr(), rate As Double
          Dim myRange
          With WorksheetFunction
            Set myRange = Sheet1.UsedRange
            num = myRange.Columns.count
            ReDim arr(num)
              For i = 0 To num - 1
                  arr(i) = .Sum(myRange.Columns(i + 1).Offset(3))
              Next i
              rate = .Sum(arr) / (.Max(arr) * num)
          End With
          '添加显示标签
            Dim myShape As Shape
            '查找是否具有label标签,如果有则需要删除该标签
            For Each myShape In Sheet1.Shapes
                If InStr(myShape.Name, "Label") <> Empty Then
                    myShape.Delete
                    Exit For
                End If
            Next
            Set myShape = Sheet1.Shapes.AddFormControl(xlLabel, 55, 220, 80, 15)
            With myShape
                .TextFrame.Characters.Text = "平衡率:" & Format(rate, "0.00%")
            End With
        
End Sub

模块二是将汇总出来的动作内容,用图表表示出来。
一下为模块三的代码,模块是生成图表的文件,但是需要excel模板配合,截图一张。

Paste_Image.png
'生成新的工时表
Sub makeNew()
        '计算平衡率
        Dim R As Range, i%, row%, rng As Range, rHead As Range
            With Sheet1
                .Activate
                '选择工序名称
                Set rHead = .UsedRange.Rows(3).Resize(1)
                '选择每个工序的时间
                Set R = .UsedRange
                R.Select
                    With Sheet4
                         For i = 1 To R.Columns.count
                            row = 7 + i
                            If i > 1 Then
                                .Rows(row).Insert
                                .Rows(row).RowHeight = Sheet4.Rows(8).RowHeight
                                .Range("d" & row & ":e" & row).Merge
                            End If
                            Set rng = .Range("C" & row)
                            '设置每一个工位所有工序的和,宽放为自己设置
                            '  时间和
                                rng.Offset(0, 4).Value = WorksheetFunction.Sum(R.Columns(i))
                                '序号
                                rng.Value = i
                                '工位名称
                                rng.Offset(0, 1).Value = rHead.Cells(i)
                                '人力
                                rng.Offset(0, 3).Value = 1
                                rng.Offset(0, 9).FormulaR1C1 = "=TRIMMEAN(RC[-5]:RC[-1],0.3)"
                                rng.Offset(0, 10).Formula = "=(M5+1)*L" & row
                                rng.Offset(0, 11).Formula = "=M" & row & "/F" & row
                                
                        Next
                    End With
            End With
            '设置工时表的格式
            With Sheet4
                .Activate
                .Range("F5").Value = "日期:" & Format(Date, "yyyy-mm-dd")
                Dim rRow As Long
                Dim LRow As Long
                rRow = .UsedRange.row
                LRow = rRow + .UsedRange.Rows.count - 5
                For i = LRow To rRow Step -1
                    If Application.WorksheetFunction.CountA(Rows(i)) = 0 Or i > row Then
                        Rows(i).Delete
                    End If
                 Next
            End With
    
End Sub

最后在worksheet1中需要设置一个事件监听,这样在调整工序动作的时候,就可以及时更新标签,代码如下

···
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If (.Column < 4 Or .Column > 20) And (.row < 2 Or .row > 30) Then

    Else
    Call jiSuan
    
    End If
End With

End Sub

···
这样基本可以实现工位平衡的动作调整。
截图如下

Paste_Image.png
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容

  • 本例为设置密码窗口 (1) If Application.InputBox(“请输入密码:”) = 1234 Th...
    浮浮尘尘阅读 13,645评论 1 20
  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 5,401评论 1 14
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,050评论 25 707
  • 1.1 VBA是什么 直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得...
    浮浮尘尘阅读 21,741评论 6 49
  • 人生的每一笔经历,都在书写自己的简历。每一个人心中都深藏着一个人,你不知道对方生活得好与不好。有时候,你怀念的却只...
    带着微博慢行阅读 589评论 0 2