--
用VB.NET和Excel排生產計劃
—企業信息化探討之一
屠恩海(SunHai)
開發工具:Microsoft Visual Studio .NET 2003
操作系統:Windows XP
企業信息化失敗原因探討
中國企業上線ERP的成功率是不高的。這是為什麼呢?
實用的ERP系統有兩個特徵:
1. 要求具有高度的定制性
2. 要能根據企業實際隨時修改ERP系統
而現在企業的ERP系統開發基本採用外包模式,開發人員雖然也可以深入公司各個部門,掌握各個方面信息,然後進行定制開發。但是開發人員畢竟不是企業實際從業人員,掌握信息的廣度、深度畢竟是有限的,因此,通常情況下,所開發的ERP系統難以保證第一個特徵:要求具有高度的定制性。
另一方面,企業的實際情況隨時都可能發生變化,ERP系統也要隨時修改,才可能隨時滿足企業的需求。如果說一開始,ERP系統是滿足企業需求的,那麼一年以後呢?當然開發人員也可以跟蹤企業需求,隨時修改ERP系統,但總歸是不太方便。
理想的企業信息化模式
個人認為,理想的企業信息化模式是這樣的:
1.企業信息化系統的開發應由企業內部人員進行,而不是外包
只有這樣,實用的ERP系統所要求的兩個特徵:要求具有高度的定制性; 要能根據企業實際隨時修改ERP系統就很可能兩者都具備了。
2.企業信息化要從實際工作需要出發,逐步推進
公司實際從業人員(兼開發人員)從實際工作需要出發,開發出相應的信息化模塊、功能,再逐步完善。
現實中,許多企業開發的信息化系統功能很多,但又有多少人會用呢,最終是花架子而已。
就像筆者所在單位,說大不大,說小不小,但要一開始推行信息化管理,是不可能的。企業各部門人員素質不一,是不可能被普遍接受的。
要實現筆者所述理想的企業信息化模式,最大的困難是什麼?
最大的困難是是人才難得,特定管理人員要同時具備兩種能力:管理能力和開發能力。這種人才並不是每個企業都能得到的。
筆者雖然談不上什麼人才,但近幾年從事的卻是企業管理工作,並對信息化管理系統的開發亦略知一二。筆者就有可能親身實踐「理想的企業信息化模式」,並把有關經驗與大家分享。
公司實際情況分析
從2004年起,我主管公司的計劃工作,包括制定並下發產品生產計劃,自製件生產計劃,外協件採購計劃等。原來公司內一直用手寫的方式,由於公司產品的型號較多,如果我也是用手工填寫,計劃一多,整天忙於機械式的寫寫算算,做不了什麼事情。所以我考慮用電腦代替部分機械性的工作,我就可以騰出精力抓其他方面事情了。電腦可以輔助、代替我做哪些機械性的工作呢?
比如,每一成品由零件組裝而成,零件分自製件和外協件。每一產品由哪些零件組成是固定的。每個月的生產計劃,都要分解成自製件生產計劃和外協件採購計劃,這個分解工作我決定交給電腦來完成。
程序開發模式分析
用什麼開發工具,用什麼開發模式來實現所要求的功能呢?公司內暫時只有我自己運用,要實現的功能也不多,在一開始並沒有必要用複雜的大型數據庫系統。,為方便信息共享,我決定用VB.NET調用Excel來實現功能模塊。
為什麼用VB.NET而不用C#,因為Excel中有個VBA,其語法和VB.NET是近似的。而且,VB.NET和C#的區別主要是語法,而非功能。
我現在只要求實現用程序自動安排《自製件生產計劃》,這個功能不用VB.NET,單用VBA也能輕易實現。但是,考慮到以後可能的功能擴充、升級,還是用VB.NET。VB.NET是面向一代的開發工具,功能強大,而且調用EXCEL也很方便。
不推薦用VB6,VB.NET的入門及初級應用並不難,為何還要去用早期版本,而不用最新版本,掌握最新技術呢!
用VB.NET和Excel排生產計劃
軟件構思是這樣的:
先在EXCEL裡定制好《自製件生產計劃》的樣表(模板),保存為自製件生產計劃.xls,其中只有一個sheet:樣表。在樣表中設置好各種格式,填寫好固定項。再新建一空白workbook,保存為2004年自製件生產計劃.xls。
新建一VB.NET應用程序,命名為生產計劃報表。在窗體上放很少幾個控件,如:幾個文本框,用來輸入產品數量;checkbox用來先選擇是正式生產計劃還是增補生產計劃;另外用二個文本框用來輸入計劃時間和計劃編號。
點擊button,程序打開自製件生產計劃.xls和2004年自製件生產計劃.xls,把樣表copy到2004年自製件生產計劃.xls,並自動在目標sheet中填寫各自製件需要生產的數量。
下面是實現代碼及詳細註釋。注意,要先添加com引用Microsoft Excel Object Library,我的是office 2003,引用Microsoft Excel 11.0 Object Library。
Private Sub producePlan()
Call killEXCEL() '調用殺死EXCEL進程過程
'以下代碼判斷用戶填寫信息是否完整,如不完整則提示信息並退出.
If chkFormal.Checked = False And chkSubjoin.Checked = False Then
MsgBox("是正式計劃還是增補計劃??", MsgBoxStyle.Critical, "請先選擇計劃性質")
Exit Sub
End If
If txtDay.Text = "2004年月" Then
MsgBox("什麼月份的生產計劃???", MsgBoxStyle.Critical, "請填寫計劃時間")
Exit Sub
End If
If txt703.Text = Nothing Or txt909.Text = Nothing Or txt931.Text = Nothing Or txt932.Text = Nothing Then
MsgBox("請填寫計劃台數!", MsgBoxStyle.Critical, "計劃台數填寫不全")
Exit Sub
End If
If chkFormal.Checked = True And chkSubjoin.Checked = True Then
MsgBox("正式和增補兩者只能選一!", MsgBoxStyle.Critical, "請重新選擇計劃性質")
Exit Sub
End If
'以下代碼即是計算各自製件的數量,用中文來命名是免去代碼註釋
Dim 塗氟龍面板703 As Integer = CType(txt703.Text, Integer)
Dim 鈦金面板909 As Integer = CType(txt909.Text, Integer)
Dim 油磨不銹鋼面板931 As Integer = CType(txt931.Text, Integer)
Dim 油磨不銹鋼面板932 As Integer = CType(txt932.Text, Integer)
Dim 底盤24 As Integer = 塗氟龍面板703
Dim 底盤22 As Integer = 鈦金面板909
Dim 底盤41A As Integer = 油磨不銹鋼面板931
Dim 底盤41B As Integer = 油磨不銹鋼面板931
Dim 水盤25 As Integer = 塗氟龍面板703
Dim 水盤24 As Integer = 塗氟龍面板703
Dim 水盤22 As Integer = 鈦金面板909 * 2
Dim 中心支架2 As Integer = 塗氟龍面板703 + 鈦金面板909
Dim 長支架931 As Integer = (油磨不銹鋼面板931 + 油磨不銹鋼面板932) * 2
Dim 支架931U As Integer = 油磨不銹鋼面板931 * 2
Dim 支架932U As Integer = 油磨不銹鋼面板932 * 2
Dim 磁頭抱攀 As Integer = (鈦金面板909 + 油磨不銹鋼面板931 + 油磨不銹鋼面板932) * 2
Dim 電池抱攀 As Integer = (塗氟龍面板703 + 鈦金面板909 + 油磨不銹鋼面板931 + 油磨不銹鋼面板932) * 2
Dim 三通抱攀 As Integer = 電池抱攀 / 2
Dim 爐頭墊片 As Integer = 電池抱攀 * 3
'定義一個數組,方便在EXCEL中循環寫入數字,也可以放在EXCEL的VBA中實現
Dim allNum() As Integer = _
{塗氟龍面板703, 鈦金面板909, 油磨不銹鋼面板931, 油磨不銹鋼面板932, _
底盤24, 底盤22, 底盤41A, 底盤41B, _
水盤25, 水盤24, 水盤22, _
中心支架2, 長支架931, 支架931U, 支架932U, _
磁頭抱攀, 電池抱攀, 三通抱攀, 爐頭墊片}
Dim excelApp As New Excel.Application
Dim excelBook As Excel.Workbook '自製件生產計劃.xls
Dim excelbook2004 As Excel.Workbook '2004自製件生產計劃.xls
Dim excelWorksheet As Excel.Worksheet
Dim planProperty As String '計劃性質,是正式計劃還是增補計劃
Try '建議用try方式捕捉錯誤,處理錯誤
excelBook = excelApp.Workbooks.Open(Application.StartupPath & "\自製件生產計劃.xls")
excelbook2004 = excelApp.Workbooks.Open(Application.StartupPath & "\2004年自製件生產計劃.xls")
excelWorksheet = CType(excelBook.Worksheets("樣表"), Excel.Worksheet)
excelWorksheet.Copy(After:=excelbook2004.Sheets("sheet1"))
'把樣表copy到<2004年自製件生產計劃>workbook中sheet1的後面
excelApp.Visible = True '設置工作薄為可視
If chkFormal.Checked = True Then
planProperty = "正式"
ElseIf chkSubjoin.Checked = True Then
planProperty = "增補"
End If
With excelbook2004.ActiveSheet '用with 簡化代碼
.Range("D1").Value = txtDay.Text '計劃時間
.Range("C2").Value = "laoban公司" & txtDay.Text & planProperty & "採購計劃" '計劃依據
.Range("C25").Value = Now.Date.Today.ToShortDateString '這就是製表日期
.Range("F2").Value = txtNO.Text '計劃編號
End With
For i As Integer = 0 To 18 '共19種自製件
excelbook2004.ActiveSheet.cells(4 + i, 4) = allNum(i) '4+i是行號,第二個4是列號
Next '循環把各自製件數填入<2004年自製件生產計劃>中的活動工作表相應位置
Catch ex As Exception '捕捉錯誤,並回收資源,顯示錯誤
excelBook = Nothing
excelbook2004 = Nothing
excelWorksheet = Nothing
excelApp = Nothing
GC.Collect(0)
MsgBox(ex.ToString) '顯示錯誤信息,以查找定位
Exit Sub '出錯就退出
Finally '這裡的代碼一定會被執行到
excelBook = Nothing
excelbook2004 = Nothing
excelWorksheet = Nothing
excelApp = Nothing
GC.Collect(0)
End Try
MsgBox("已排好自製件生產計劃,請查看")
excelBook = Nothing
excelbook2004 = Nothing
excelWorksheet = Nothing
excelApp = Nothing
GC.Collect(0)
End Sub
下面是殺死EXCEL進程的過程:
Private Sub killEXCEL() '為進程避免衝突,在調用EXCEL前先殺死現有EXCEL進程.
Dim pProcess() As Process
pProcess = Process.GetProcesses()
Dim i As Integer
For i = 0 To pProcess.Length() - 1
If (pProcess(i).ProcessName = "EXCEL") Then
pProcess(i).Kill() '關閉進程
End If
Next
End Sub
以上代碼非常簡單,功能也很有限,但是很實用,以前都是用手工填寫並計算的,現在全部自動實現。本來要半小時的工作,現在可以在5分鐘內搞定。如果產品有變化,我可以隨時修改程序,使程序始終滿足企業需求。企業信息化就應該是這樣,從很小的功能開始。
也許老總一點不知道何為企業信息化,你可以展示給老總,看,以前要用半小時排計劃,現在5分鐘就解決,這也是屬於企業信息化。
昨天用了一個晚上時間寫了以上代碼,一個晚上只是一個晚上而已,以後可以省下多少時間?老總是經濟第一的,要他掏腰包聘專業開發人員,或外委軟件公司開發,總是要讓老總割血,也是不太可能的事。我是管理人員,本身也懂一點編程,信息化從自身工作開始,不用老總多花一分錢,反而可以提高工作效率。而且,原來公司裡只有極少懂產品的人有排計劃的能力,現在用程序來實現,人人都會。
中國的企業信息化,要麼華而不實,更多企業是根本不知並不用。我在公司內進行企業信息化探索受諸多因素限制。無論如何,我會將我的經驗與大家分享,大家共同來探索有中國特色的企業信息化之路。
沒有留言:
張貼留言