朱 俊 馮錦麗
醫(yī)院耗材管理形式上是數(shù)據(jù)統(tǒng)計,本質(zhì)上是數(shù)據(jù)處理,主要包括數(shù)據(jù)的錄入、出入庫、盤庫及其數(shù)據(jù)統(tǒng)計工作,最終實現(xiàn)賬物相符。數(shù)據(jù)統(tǒng)計方面,通常需要對多方數(shù)據(jù)進(jìn)行提取、篩選、排序、函數(shù)和公式、分類匯總、數(shù)據(jù)透視表、數(shù)據(jù)比對、數(shù)據(jù)維護(hù)等單項或綜合性的操作處理。而上述這些高級應(yīng)用,絕大部分應(yīng)用者在日常應(yīng)用中的選項卡或多重綜合重復(fù)處理即可實現(xiàn),但是對于不同權(quán)限用戶管理、多重數(shù)據(jù)比對等,采用簡單的統(tǒng)計處理將難以為繼,需要采用高級編程功能實現(xiàn)。
通常,醫(yī)院的各類數(shù)據(jù)管理采用數(shù)據(jù)庫形式,而醫(yī)院的醫(yī)院信息系統(tǒng)在耗材管理方面,其搭載的子系統(tǒng)為物資管理程序(簡稱系統(tǒng)),版本號Ver 2.9.3。該系統(tǒng)軟件是由PB語言編程,后臺數(shù)據(jù)庫采用ORACLE數(shù)據(jù)庫管理系統(tǒng)[1]。該軟件客觀記錄了入庫、出庫、網(wǎng)上請領(lǐng)、在線查詢庫存、采購管理、目錄(價格)維護(hù)等日常操作業(yè)務(wù),還可以物資盤點、賬務(wù)管理等一系列綜合查詢,能出具出入庫報表、明細(xì)報表等統(tǒng)計報表。但該系統(tǒng)導(dǎo)出的數(shù)據(jù),不能分級實施權(quán)限管理和自動進(jìn)行數(shù)據(jù)比對,為此需運用基于Excel的Visual Basic應(yīng)用程序(Visual Basic application,VBA)編寫一段醫(yī)用耗材管理程序解決該問題。基于此,本研究結(jié)合Microsoft的Excel,采用Office 2007版進(jìn)行初步處理,運用編程的方法快速、精準(zhǔn)及高效地進(jìn)行醫(yī)用耗材管理。
VBA區(qū)別于傳統(tǒng)的宏語言、腳本語言,是一種面向?qū)ο蟮某绦蛟O(shè)計方法,提供完整的程序設(shè)計語言。Excel VBA是Office一個應(yīng)用程序套件,內(nèi)嵌了功能強大的VB編程語言,用來開發(fā)自定義Office解決方案。由于VBA的存在,Office就不僅僅是應(yīng)用程序,更是一個開發(fā)平臺,計算機用戶可以利用VBA對Office進(jìn)行二次開發(fā),極大擴(kuò)展其功能[2-3]。
VBA在Excel中的編程平臺是Visual Basic編輯器(Visual Basic editor,VBE)[4]。有兩種VBE打開方式:①快捷鍵方法,Alt+F11,F(xiàn)7代碼窗口;②選項卡方法,在“開發(fā)工具”選項卡中,代碼窗體中點“Visual Basic”或“控件”窗體中,點“設(shè)計模式”或通過雙機控件查看后臺代碼。如果未顯示“開發(fā)工具”選項卡,則Office按鈕Word選項常用勾選“在功能區(qū)顯示‘開發(fā)工具’選項卡”。運行也有兩種方法,即快捷鍵F5和運行“運行子程序/用戶窗體”。
Excel工作簿的存在包含關(guān)系,一般工作表sheet∈工作薄workbook,即一個工作薄中一般有多個工作表sheet,默認(rèn)狀態(tài)有3個工作表,即Sheet1、Sheet2和Sheet3,根據(jù)需要還可以新建工作表Sheet。一般導(dǎo)出的excel表默認(rèn)的將數(shù)據(jù)存放在第一張工作表Sheet1中默認(rèn)此命名,Sheet2、Sheet3為空白表,無數(shù)據(jù),可視情況加入導(dǎo)入數(shù)據(jù)。
充分實現(xiàn)海量數(shù)據(jù)的統(tǒng)計、篩選及比對。編程設(shè)計中需要注意:①盡量使用系統(tǒng)中導(dǎo)出的數(shù)據(jù),盡量不要人為編輯、干預(yù)及錯誤,以免格式、字符等更改導(dǎo)致無法調(diào)試出程序;②編程是非常嚴(yán)謹(jǐn)?shù)墓ぷ鳎⒄Z句、換行符以及非法字符必須嚴(yán)格符合語句定義,否則任何一個環(huán)節(jié)都可能無法調(diào)試出程序;③要理清設(shè)計思路,精心編程,查找問題,分析解決問題。如If…Then…后面的語句,如果只有一句命令的話,Then后面不需要換行,否則容易出現(xiàn)編譯錯誤,無法調(diào)試結(jié)果。
導(dǎo)出一個工作薄的不同工作表,對其登錄權(quán)限區(qū)別管理,對不同用戶使用不同的登錄權(quán)限:①管理員,賦予打開所有表格權(quán)限,并且可編輯修改等;②普通職員,僅限于自己的個人權(quán)限,只能查看,不可編輯修改,從而實現(xiàn)不同人員權(quán)限的登錄管理[5-6]。
物資管理系統(tǒng)中導(dǎo)出兩張表格或工作薄,對兩張表格≥2行/列元素,如4列的表格進(jìn)行一一比對。如果所比較對象的4行/列元素完全一致,則標(biāo)記為相同的條目;否則任何一行/列不一致,則不作標(biāo)記,從而確定兩張表中的物資是否為同一條物資目錄。
進(jìn)入VBE界面,左側(cè)的“工程”窗口中ThisWorkbook選擇Workbook_Open事件的程序如下:
Private Sub workbook_open()
Application.visible = False: Userform1.show'登錄界面的顯示和控制
End Sub
繼續(xù)在VBE界面,左側(cè)的“工程”窗口中或插入用戶窗體,雙擊“UserForm1”。在控件工具中插入兩個標(biāo)簽label、兩個文本框Text、兩個命令按鈕CommandButton。并對各自的屬性、字體格式等相關(guān)修改,其中密碼文本框PasswordChar的屬性設(shè)置為“*”[7-8]。
“登錄”命令按鈕CommandButton1下的Click,對應(yīng)的程序如下:
Private Sub CommandButton1_Click()
If TextBox1.Text="a" And TextBox2.Text="123" Then'管理用戶a登錄
UserForm1.Hide
For i=1 To Sheets.Count
Sheets(i).Visible=True'顯示Sheet1、Sheet2、Sheet3全部工作表
Next i
ElseIf TextBox1.Text="s1" And TextBox2.Text="123" Then's1用戶登錄
UserForm1.Hide
Sheets(1).Visible=True'只顯示Sheet1工作表Sheets(2).Visible=False
Sheets(3).Visible=False
Sheets(1).Protect'保護(hù)Sheet1工作表
ElseIf TextBox1.Text="s2" And TextBox2.Text="123" Then's2用戶登錄
UserForm1.Hide
Sheets(1).Visible=False
Sheets(2).Visible=True'只顯示Sheet2工作表
Sheets(3).Visible=False
Sheets(2).Protect'保護(hù)Sheet2工作表
ElseIf TextBox1.Text="s3" And TextBox2.Text="123" Then's3用戶登錄
UserForm1.Hide
Sheets(1).Visible=False
Sheets(2).Visible=False
Sheets(3).Visible=True'只顯示Sheet3工作表Sheets(3).Protect'保護(hù)Sheet3工作表
Else
MsgBox "用戶名或密碼錯誤,請重新登錄!"End If
End Sub
其中,可見采用Protect可以實現(xiàn)編輯保護(hù)功能,同理,若取消保護(hù)則用Unprotect即可。
“退出”命令按鈕CommandButton2下的Click,對應(yīng)的程序如下:
Private Sub CommandButton2_Click()
Unload Me
ThisWorkbook.Close
End Sub
(1)方法一。從系統(tǒng)中導(dǎo)出兩張表后,同時放在同一工作簿的不同工作表中,原始的表格為默認(rèn)的Sheet1,當(dāng)前待處理表格為默認(rèn)的Sheet2,空表表默認(rèn)Sheet3閑置,不用處理。
Private Sub 數(shù)據(jù)比對()
Dim i As Integer, j As Integer
Dim M As Integer, N As Integer
M=Sheets(1).UsedRange.Rows.Count'M為初始表格行數(shù)
N=Sheets(2).UsedRange.Rows.Count'N為當(dāng)前表行數(shù)
If M<=N Then
For i=2 To M
For j=2 To N
If Sheets(1).Cells(i, 1)=Sheets(2).Cells(j,1)Then
If Sheets(1).Cells(i,2)=Sheets(2).Cells(j,2)Then
If Sheets(1).Cells(i,3)=Sheets(2).Cells(j,3)Then
If Sheets(1).Cells(i,4)=Sheets(2).Cells(j,4)Then
Sheets(1).Cells(i,5)="*" '條目有相同,則標(biāo)記為"*",并放在Sheet1工作表的第5列中
End If
End If
End If
End If Next j Next i Else
MsgBox "初始表Sheet1和待處理表Sheet2行數(shù)比對溢出,請調(diào)整行數(shù)!"
End If
End Sub
(2)方法二。系統(tǒng)中直接導(dǎo)出兩張不同的表格,并放在D盤中,原始表命名為m,當(dāng)前待處理表格命名為n。
Sub 數(shù)據(jù)比對()
Dim i As Integer, j As Integer
Dim M As Integer, N As Integer
Dim goods1_name As String, goods2_name As String
Dim goods1_type As String, goods2_type As String
Dim goods1_unit As String, goods2_unit As String
Dim goods1_manufacturer As String, goods2_manufacturer As String
Application.ScreenUpdating=False
Workbooks.Open "D: M.XLS"
M=ThisWorkbook.Sheets(1).UsedRange.Rows.Count'M為初始表格行數(shù)
N=ActiveWorkbook.Sheets(1).UsedRange.Rows.Count'N為當(dāng)前表行數(shù)
For i=2 To M
goods1_name=ThisWorkbook.Sheets(1).Cells(i,1)
goods1_type=ThisWorkbook.Sheets(1).Cells(i,2)
goods1_unit=ThisWorkbook.Sheets(1).Cells(i,3)
goods1_manufacturer=ThisWorkbook.Sheets(1).Cells(i,4)
For j=2 To N
goods2_name=ActiveWorkbook.Sheets(1).Cells(j,1)
goods2_type=ActiveWorkbook.Sheets(1).Cells(j,2)
goods2_unit=ActiveWorkbook.Sheets(1).Cells(j,3)
goods2_manufacturer=ActiveWorkbook.Sheets(1).Cells(j,4)
If goods1_name=goods2_name And goods1_type=goods2_type And goods1_unit=goods2_unit And goods1_manufacturer=goods2_manufacturer Then
ThisWorkbook.Sheets(1).Cells(i,5)="*" '標(biāo)記相同條目為“*”,并放在第5列
End If
Next j
Next i
ActiveWorkbook.Close
Application.ScreenUpdating=True
End Sub
可見,用上述兩種方法運行比較得出,方法一較方法二算法更簡潔,速度更快,更節(jié)約運行時間。
根據(jù)設(shè)計思路,編程調(diào)試實現(xiàn)后,對應(yīng)其運行結(jié)果。雙擊打開工作簿,即跳轉(zhuǎn)進(jìn)入登錄界面窗體,當(dāng)?shù)卿洖楣芾韱T用戶a和密碼123時,工作簿下的所有工作表Sheet1、Sheet2及Sheet3全部顯示,無保護(hù)狀態(tài),可自由編輯、更改;當(dāng)?shù)卿洖閟1且密碼123時,只顯示Sheet1表且處于保護(hù)狀態(tài),不可編輯、更改,而Sheet2 、Sheet3隱藏不顯示;……;類推,只顯示Sheet2表和Sheet3表。如果登錄的賬戶名或密碼任意一項有錯或無輸入,如輸入錯誤用戶名“aa”,則提示“用戶名或密碼錯誤,請重新登錄!”[1]對話框,其權(quán)限管理界面如圖1所示。

圖1 權(quán)限管理界面圖

圖2 多重數(shù)據(jù)比對界面圖
對物資名稱、規(guī)格、單位及廠家4個條件同時完全相同的條目進(jìn)行價格對照,比較2008年的入庫價與2010年建立的現(xiàn)行仍在執(zhí)行的價格,如果價格不一樣的條目,則用星號“*”標(biāo)記出來。常常應(yīng)用在醫(yī)院與京津冀價格比較、調(diào)價,前后目錄庫比對(如圖2所示)。
Sheet1中比對結(jié)果表中的第2行名稱為“11F尿試紙條”與Sheet2中的第4行名稱為“11F尿試紙條”,其規(guī)格、單位及廠家3個條件也完全一致,則在Sheet1的第五列E列用星號“*”標(biāo)記。類比其他數(shù)據(jù),對應(yīng)的比對相同的結(jié)果,從而實現(xiàn)海量數(shù)據(jù)的相同項的比對。
Sheet1中比對結(jié)果表中的第5行名稱為“ABORH血型確認(rèn)卡”與Sheet2中的第8行名稱為“ABORH血型確認(rèn)卡”,雖然其名稱、單位及廠家3個條件相同,但其規(guī)格“8孔/卡,4*12卡/盒”“8孔/卡,2*25卡/盒”不同而得以區(qū)分。相反,Sheet1中比對結(jié)果表中的第6行名稱也為“ABO-RH血型確認(rèn)卡”,與Sheet2中的上述的完全一致,而被標(biāo)記星號“*”。類比其他數(shù)據(jù),比對不相同的結(jié)果,從而實現(xiàn)海量數(shù)據(jù)的不相同項的區(qū)分。
Excel VBA不僅可以應(yīng)用于醫(yī)用耗材管理,并可用于醫(yī)療設(shè)備管理、醫(yī)院病例數(shù)據(jù)分析統(tǒng)計、神經(jīng)系統(tǒng)學(xué)、醫(yī)學(xué)影像學(xué)及生物化學(xué)等各學(xué)科中[9-14]。數(shù)據(jù)統(tǒng)計是醫(yī)院設(shè)備耗材管理的重要方面,通過Excel VBA對不同權(quán)限用戶管理、多重數(shù)據(jù)比對的應(yīng)用分析,以及編程方法在工作中的高級應(yīng)用,可極大減少人為操作,降低錯誤率,有效提高工作效率[15-16]。