作者|李盛华
(来自 标杆精益 益友会-杭州分会)
全文总计2934字,需阅读8分钟,以下为今天的益者原创:
程序有很多种含义,文理上讲,他是指事物发展的既有次序和脉络以及方式、方法。但是作为精益人,两种含义必须得了解和掌握。第一就是Procedure,第二就是Program。
01
首先我们说说第一个含义——Procedure。在GB/T19000/ISO9001中的“第3.4.5条 程序procedure中对于“程序”的定义是“ 为进行某项活动或过程(3.4.1)所规定的途径。”
医疗器械行业对于程序的要求更加严格,它规范了公司所有业务流程,而且这些程序都是每次政府机构审核的重点。
常见的程序有:文件控制程序、质量记录控制程序、管理评审程序、人力资源管理程序、设施、设备和工艺装备控制程序、工作环境控制程序、质量策划控制程序、产品要求的确定及销售合同评审程序、设计控制程序、供应商评价、选择程序、采购控制程序、生产过程控制程序、标识和可追溯性控制程序等等。
这些程序是一个精益人在企业做改善时必须了解和遵守的,也是在了解和遵循过程中需要不断完善的。但是这个程序不是我们说说的重点。
今天想要详细聊得是第二个含义——Program。它是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。随着信息化的不断发展,人们对程序的需求越来越大,我们在生活和工作中都充满了各种计算机程序。
一般而言,做精益的人往往毕业于工科,所以大学里或多或少接触过计算机程序语言。一般大学里面工科学生接触最多的是C语言,也有一些会接触C++、C#、VB等。其实不管哪种计算语言,如果你真正学习了,学会了,其他的语言学习起来也会很快掌握。因为语言是相通的,一般都会有数据类型、条件判断、循环等等。
计算机语言和我们日常交流的语言一样,需要经常使用,就像大学里面学的英语一样,如果毕业后工作或者生活中不用英语,即使你在大学里英语六级轻松飘过,后面渐渐地你会忘记英语。大学里学的计算机语言如果工作中不去刻意使用它,你也会忘记,而如果你能将它运用在工作中,你将会越用越熟练。
02
随着工作年数的增加,越来越觉得不管你多久以前学习的东西,只要你认真学习了,确实有所掌握,这些知识或者技能都会在你往后的日子里起到很大的帮忙。如若佛教所说的因果报应,不是你学习的东西没有用,而是没有到时间用上,或者之前学习时你确实没有掌握。
就我个人而言,计算机程序就是一个很好的例子。由于大学里面在当时的全老师的鼓励下,陆陆续续接触和学习了网站建设的相关概念和语言,最开始的互联网概念,C/S架构和B/S架构,到后来的HTML、DIV+CSS、Photoshop等前台建站语言工具,到最后的PHP、MySQL数据库以及Apache服务器。让我对互联网以及软件有了较为深入的理解。
其实到了工作中,如果不是从事IT或者互联网行业,基本很少会去接触这些东西,这些东西很多时候往往会被认为在浪费时间。甚至有些时候我也会觉得这些东西当时学的时候还花了很长时间,到头来也没有给自己的工作带来多大的帮助,不过我马上也会安慰自己不管怎么说就当它是爱好吧,反正多学点也不会损失什么。
不过现在当我把时间轴拉长来看看计算机程序确实对我的工作和思想有很大的帮助。
首先计算机程序非常讲究逻辑,而我们工作中的任何业务流程都离不开逻辑,逻辑越清晰,部门的办事效率就越高,所以了解计算机程序的人,逻辑思维不算太差。
其次就是计算机程序有着天生的防错思维,也可以叫利他思想,举两个简单的例子,当你在Excel里面的数据验证中添加了该单元格的内容只能是指定内容时,其他人就不能输入其他错误的内容。
另外一个例子就是我们很常见的进度条,试想以下当我们如果点击了一个按钮,电脑没有任何显示,你肯定就要抓狂了,这也是人类对未知的恐惧的天生缺陷。然后就是对各种办公软件的快速掌握,由于了解软件的基本原理,所以对于工作中的一些软件能够很容易上手,包括不同公司的ERP软件,虽然有金蝶、用友、SAP等,但是操作起来都是没有太大的难度。
最后一点也是最重要的一点,学会计算机程序可以让你提高工作效率,我们工作中做数据处理往往离不开Excel,如果说Excel你只会用来设计表格,那只能说明你在一维世界;如果你会用各种函数以及数据透视表,那你就进入了二维世界;倘若你会使用VBA,恭喜你进入了三维世界。
VBA将帮你解决数据处理中90%的重复工作,你说做精益的人,怎么可以忍受这么多的“动作”浪费呢?
03
最后我提供一下之前改或者写的两个小应用。一个是用PHP+MySQL+Apache写的《基于PHP的简单进出库管理系统》,该系统用于物料出入库管理,简单实用。另一个是用VBA编写的根据表格列项字段内容汇总多个Excel报表,直接复制到xlsm文件中的模块里面就可以使用过。代码如下:
Sub 合并包含子文件夹xlsx()
用数组提取指定位置【包含子文件夹所有工作簿】中的内容复制到当前活动工作簿,编辑于2021年3月14日16:33:19
Dim bt As Range,r As Long, c As Long, t As Long, I, j, K As Long, Item As Variant
Dim Carr()
r = 3 3是表头的行数
MsgBox(Sheet1.Cells(3, “XFD”).End(xlToLeft).Value)
Carr=Sheet1.Range(Sheet1.Cells(3,”C”), Sheet1.Cells(3,”XFD”).End(xlToLeft))
MsgBoxUBound(Carr, 2) 求数组有几列
c = UBound(Carr,2) 表头的列数
t = Timer 开始时间
Dim wt AsWorksheet
Set wt =ThisWorkbook.Worksheets(“区域日报表”) 将汇总表赋给变量wt
Application.Calculation= xlManual
Application.EnableEvents= False
Application.Interactive= False
Application.DisplayAlerts= False
Application.AskToUpdateLinks= False
wt.Rows(r + 1& “:1048576”).ClearContents 清除汇总表中原有的数据,只保留表头
ActiveWindow.ScrollRow= 1
ActiveWindow.ScrollColumn= 1
Application.ScreenUpdating= False
Dim Filename AsString, sht As Worksheet, Wb As Workbook
Dim Erow AsLong, fn As String, arr()
FileArr=FileAllArr(ThisWorkbook.Path,”*日报表.xls?”, ThisWorkbook.Name, True, False)
If FileArr(0) <> “”Then //如果文件清单 不是空白的
ICOUNT = UBound(FileArr) + 1
Rem 遍历每个分表文件
For K = 0 To ICOUNT – 1
Erow = wt.Cells(1048576,”B”).End(xlUp).Offset(1, c – 2).Row
取得汇总表中第一条空行行号
fn = ThisWorkbook.Path &”\” & FileName 将第1个要汇总的工作簿名称赋给变量
Set Wb =Workbooks.Open(FileArr(K)) 将变量fn代表的工作簿对象赋给变量
Set sht = Wb.Worksheets(“车间日报表”) 将要汇总的工作表赋给变量sht
arr = sht.Range(sht.Cells(1,”A”), sht.Cells(1048576, “F”).End(xlUp).Offset(1, c))
MsgBox (UBound(arr, 2))
将数组arr中的数据写入工作表
If Sheets(“车间日报表”).Range(“D4”) <> “” Then
wt.Cells(Erow,”A”).Resize(UBound(arr, 1), 1) = Wb.Name
wt.Cells(Erow,”B”).Resize(UBound(arr, 1), 1) = Wb.Worksheets(“车间日报表”).Name
MsgBox (arr(1, 1))
For j = 1 ToUBound(Carr, 2)
For I = 1 ToUBound(arr, 2)
MsgBoxApplication.Index(Carr, 1, j)
IfApplication.Index(Carr, 1, j) = arr(1, I) Then
wt.Cells(Erow,j + 2).Resize(UBound(arr, 1), 1) = Application.Index(arr, 0, I)applicaton.index 默认可以写0,或者 不写—-都表示所有行/列
End If
Next
Next
wt.Cells(Erow,”C”).Resize(UBound(arr, 1), UBound(arr, 2)) = arr
Wb.Close False
ElseIf Sheets(“车间日报表”).Range(“D4”) = “” Then
Wb.Close False
End If
在状态栏显示
Application.StatusBar =GetProgress(K, ICOUNT – 1)
Next
End If
ThisWorkbook.Save
Application.ScreenUpdating= True
Application.Calculation= xlCalculationAutomatic
Application.EnableEvents= True
Application.Interactive= True
Application.DisplayAlerts= True
MsgBox “刷新完成,用时” & Format((Timer – t), “0.0”) & “秒” & “,总共完成” & K &”个车间日报表”
End Sub
*******************************************************************************************************
功能: 查找指定文件夹含子文件夹内所有文件名或文件夹名(含路径)
函数名: FileAllArr
参数1: Filename 需查找的文件夹名,不包含文件名
参数2: FileFilter 需要过滤的文件名,可省略,默认为:[*.*]
参数3: Liwai 剔除例外的文件名,可省略,默认为:空,一般为:ThisWorkbook.Name
参数4: SubFiles 是否需要查找子文件夹内文件,可省略,默认为:true
参数5: Files 是否只要文件夹名,可省略,默认为:FALSE
返回值: 一个字符型的数组
使用方法:FileArr = FileAllArr(ThisWorkbook.Path, “*.xls”,ThisWorkbook.Name,false,false)
*******************************************************************************************************
Public FunctionFileAllArr(ByVal Filename As String, Optional ByVal FileFilter As String =”*.*”, Optional ByVal Liwai As String = “”, Optional ByValSubFiles As Boolean = True, Optional ByVal Files As Boolean = False) AsString()
Dim DIC, DID, Ke, MyName, MyFileName
Dim I As Long
Set DIC =CreateObject(“Scripting.Dictionary”) 创建一个字典对象
Set DID =CreateObject(“Scripting.Dictionary”)
Filename = Replace(Replace(Filename &”\”, “\\”, “\”), “\\”, “\”)
DIC.Add (Filename), “”
I = 0
Do While I < DIC.Count
Ke = DIC.keys 开始遍历字典
If SubFiles = True Then //如果需要查找子文件夹
MyName = Dir(Ke(I),vbDirectory) 查找目录
Do While MyName <>””
If MyName <>”.” And MyName <> “..” Then
If (GetAttr(Ke(I) &MyName) And vbDirectory) = vbDirectory Then 如果是次级目录
DIC.Add (Ke(I) &MyName & “\”), “” 就往字典中添加这个次级目录名作为一个条目
End If
End If
MyName = Dir 继续遍历寻找
Loop
End If
I = I + 1
Loop
Dim arrx() As String
I = 0
ReDim arrx(I)
arrx(I) = “”
If Files = True Then //是否只输出文件夹名
For Each Ke In DIC.keys 以查找总表所在文件夹下所有excel文件为例
ReDim Preserve arrx(I)
If Ke <> Filename Then //自身文件夹除外
arrx(I) = Ke
I = I + 1
End If
Next
FileAllArr = arrx
Else
For Each Ke In DIC.keys 以查找总表所在文件夹下所有excel文件为例
MyFileName = Dir(Ke &FileFilter) 过滤器:EXCEL2003为:*.xls,excel2007为:*.xlsx
Do While MyFileName <>””
If MyFileName <> LiwaiThen 排除例外文件
ReDim Preserve arrx(I)
arrx(I) = Ke &MyFileName
I = I + 1
End If
MyFileName = Dir
Loop
Next
FileAllArr = arrx
End If
End Function
自定义的进度条,在状态栏显示
FunctionGetProgress(curValue, maxValue)
Dim I As Single,j As Integer, s As String
I = maxValue /20
j = curValue / I
For m = 1 To j
s = s & “■”
Next m
For n = 1 To 20- j
s = s & “□”
Next n
GetProgress = s& FormatNumber(curValue / maxValue * 100, 2) & “%”
End Function
(全文完)