朱 俊 馮錦麗
醫(yī)院耗材管理形式上是數(shù)據(jù)統(tǒng)計,本質(zhì)上是數(shù)據(jù)處理,主要包括數(shù)據(jù)的錄入、出入庫、盤庫及其數(shù)據(jù)統(tǒng)計工作,最終實現(xiàn)賬物相符。數(shù)據(jù)統(tǒng)計方面,通常需要對多方數(shù)據(jù)進行提取、篩選、排序、函數(shù)和公式、分類匯總、數(shù)據(jù)透視表、數(shù)據(jù)比對、數(shù)據(jù)維護等單項或綜合性的操作處理。而上述這些高級應用,絕大部分應用者在日常應用中的選項卡或多重綜合重復處理即可實現(xià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)上請領、在線查詢庫存、采購管理、目錄(價格)維護等日常操作業(yè)務,還可以物資盤點、賬務管理等一系列綜合查詢,能出具出入庫報表、明細報表等統(tǒng)計報表。但該系統(tǒng)導出的數(shù)據(jù),不能分級實施權限管理和自動進行數(shù)據(jù)比對,為此需運用基于Excel的Visual Basic應用程序(Visual Basic application,VBA)編寫一段醫(yī)用耗材管理程序解決該問題?;诖?,本研究結合Microsoft的Excel,采用Office 2007版進行初步處理,運用編程的方法快速、精準及高效地進行醫(yī)用耗材管理。
VBA區(qū)別于傳統(tǒng)的宏語言、腳本語言,是一種面向?qū)ο蟮某绦蛟O計方法,提供完整的程序設計語言。Excel VBA是Office一個應用程序套件,內(nèi)嵌了功能強大的VB編程語言,用來開發(fā)自定義Office解決方案。由于VBA的存在,Office就不僅僅是應用程序,更是一個開發(fā)平臺,計算機用戶可以利用VBA對Office進行二次開發(fā),極大擴展其功能[2-3]。
VBA在Excel中的編程平臺是Visual Basic編輯器(Visual Basic editor,VBE)[4]。有兩種VBE打開方式:①快捷鍵方法,Alt+F11,F(xiàn)7代碼窗口;②選項卡方法,在“開發(fā)工具”選項卡中,代碼窗體中點“Visual Basic”或“控件”窗體中,點“設計模式”或通過雙機控件查看后臺代碼。如果未顯示“開發(fā)工具”選項卡,則Office按鈕Word選項常用勾選“在功能區(qū)顯示‘開發(fā)工具’選項卡”。運行也有兩種方法,即快捷鍵F5和運行“運行子程序/用戶窗體”。
Excel工作簿的存在包含關系,一般工作表sheet∈工作薄workbook,即一個工作薄中一般有多個工作表sheet,默認狀態(tài)有3個工作表,即Sheet1、Sheet2和Sheet3,根據(jù)需要還可以新建工作表Sheet。一般導出的excel表默認的將數(shù)據(jù)存放在第一張工作表Sheet1中默認此命名,Sheet2、Sheet3為空白表,無數(shù)據(jù),可視情況加入導入數(shù)據(jù)。
充分實現(xiàn)海量數(shù)據(jù)的統(tǒng)計、篩選及比對。編程設計中需要注意:①盡量使用系統(tǒng)中導出的數(shù)據(jù),盡量不要人為編輯、干預及錯誤,以免格式、字符等更改導致無法調(diào)試出程序;②編程是非常嚴謹?shù)墓ぷ?,命名、語句、換行符以及非法字符必須嚴格符合語句定義,否則任何一個環(huán)節(jié)都可能無法調(diào)試出程序;③要理清設計思路,精心編程,查找問題,分析解決問題。如If…Then…后面的語句,如果只有一句命令的話,Then后面不需要換行,否則容易出現(xiàn)編譯錯誤,無法調(diào)試結果。
導出一個工作薄的不同工作表,對其登錄權限區(qū)別管理,對不同用戶使用不同的登錄權限:①管理員,賦予打開所有表格權限,并且可編輯修改等;②普通職員,僅限于自己的個人權限,只能查看,不可編輯修改,從而實現(xiàn)不同人員權限的登錄管理[5-6]。
物資管理系統(tǒng)中導出兩張表格或工作薄,對兩張表格≥2行/列元素,如4列的表格進行一一比對。如果所比較對象的4行/列元素完全一致,則標記為相同的條目;否則任何一行/列不一致,則不作標記,從而確定兩張表中的物資是否為同一條物資目錄。
進入VBE界面,左側(cè)的“工程”窗口中ThisWorkbook選擇Workbook_Open事件的程序如下:
Private Sub workbook_open()
Application.visible = False: Userform1.show'登錄界面的顯示和控制
End Sub
繼續(xù)在VBE界面,左側(cè)的“工程”窗口中或插入用戶窗體,雙擊“UserForm1”。在控件工具中插入兩個標簽label、兩個文本框Text、兩個命令按鈕CommandButton。并對各自的屬性、字體格式等相關修改,其中密碼文本框PasswordChar的屬性設置為“*”[7-8]。
“登錄”命令按鈕CommandButton1下的Click,對應的程序如下:
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'保護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'保護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'保護Sheet3工作表
Else
MsgBox "用戶名或密碼錯誤,請重新登錄!"End If
End Sub
其中,可見采用Protect可以實現(xiàn)編輯保護功能,同理,若取消保護則用Unprotect即可。
“退出”命令按鈕CommandButton2下的Click,對應的程序如下:
Private Sub CommandButton2_Click()
Unload Me
ThisWorkbook.Close
End Sub
(1)方法一。從系統(tǒng)中導出兩張表后,同時放在同一工作簿的不同工作表中,原始的表格為默認的Sheet1,當前待處理表格為默認的Sheet2,空表表默認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為當前表行數(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)="*" '條目有相同,則標記為"*",并放在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盤中,原始表命名為m,當前待處理表格命名為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為當前表行數(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)="*" '標記相同條目為“*”,并放在第5列
End If
Next j
Next i
ActiveWorkbook.Close
Application.ScreenUpdating=True
End Sub
可見,用上述兩種方法運行比較得出,方法一較方法二算法更簡潔,速度更快,更節(jié)約運行時間。
根據(jù)設計思路,編程調(diào)試實現(xiàn)后,對應其運行結果。雙擊打開工作簿,即跳轉(zhuǎn)進入登錄界面窗體,當?shù)卿洖楣芾韱T用戶a和密碼123時,工作簿下的所有工作表Sheet1、Sheet2及Sheet3全部顯示,無保護狀態(tài),可自由編輯、更改;當?shù)卿洖閟1且密碼123時,只顯示Sheet1表且處于保護狀態(tài),不可編輯、更改,而Sheet2 、Sheet3隱藏不顯示;……;類推,只顯示Sheet2表和Sheet3表。如果登錄的賬戶名或密碼任意一項有錯或無輸入,如輸入錯誤用戶名“aa”,則提示“用戶名或密碼錯誤,請重新登錄!”[1]對話框,其權限管理界面如圖1所示。
圖1 權限管理界面圖
圖2 多重數(shù)據(jù)比對界面圖
對物資名稱、規(guī)格、單位及廠家4個條件同時完全相同的條目進行價格對照,比較2008年的入庫價與2010年建立的現(xiàn)行仍在執(zhí)行的價格,如果價格不一樣的條目,則用星號“*”標記出來。常常應用在醫(yī)院與京津冀價格比較、調(diào)價,前后目錄庫比對(如圖2所示)。
Sheet1中比對結果表中的第2行名稱為“11F尿試紙條”與Sheet2中的第4行名稱為“11F尿試紙條”,其規(guī)格、單位及廠家3個條件也完全一致,則在Sheet1的第五列E列用星號“*”標記。類比其他數(shù)據(jù),對應的比對相同的結果,從而實現(xiàn)海量數(shù)據(jù)的相同項的比對。
Sheet1中比對結果表中的第5行名稱為“ABORH血型確認卡”與Sheet2中的第8行名稱為“ABORH血型確認卡”,雖然其名稱、單位及廠家3個條件相同,但其規(guī)格“8孔/卡,4*12卡/盒”“8孔/卡,2*25卡/盒”不同而得以區(qū)分。相反,Sheet1中比對結果表中的第6行名稱也為“ABO-RH血型確認卡”,與Sheet2中的上述的完全一致,而被標記星號“*”。類比其他數(shù)據(jù),比對不相同的結果,從而實現(xiàn)海量數(shù)據(jù)的不相同項的區(qū)分。
Excel VBA不僅可以應用于醫(yī)用耗材管理,并可用于醫(yī)療設備管理、醫(yī)院病例數(shù)據(jù)分析統(tǒng)計、神經(jīng)系統(tǒng)學、醫(yī)學影像學及生物化學等各學科中[9-14]。數(shù)據(jù)統(tǒng)計是醫(yī)院設備耗材管理的重要方面,通過Excel VBA對不同權限用戶管理、多重數(shù)據(jù)比對的應用分析,以及編程方法在工作中的高級應用,可極大減少人為操作,降低錯誤率,有效提高工作效率[15-16]。