基于ExcelVBA技术的门诊药房辅助库存盘点程序设计
2020-10-21闫冰洋李洁李维凤
闫冰洋 李洁 李维凤
摘 要:本研究利用Excel VBA技術设计门诊药房辅助库存盘点程序,以期提高门诊药房库存盘点效率。其间建立了药品基础数据库,对HIS系统导出的原始盘点表、自动发药机导出的发药机药品库存信息进行数学运算,得到最终的门诊药房库存盘点表。结果表明,单次盘点时间由原来的120min左右降至60min左右,门诊药房辅助库存盘点程序的应用能有效提高库存盘点效率。
关键词:门诊药房;ExcelVBA;药品盘点
中图分类号:TP311.11文献标识码:A文章编号:1003-5168(2020)02-0038-03
Abstract: Excel VBA technology was used to design an outpatient pharmacy-assisted inventory counting program in order to improve the outpatient pharmacy inventory inventory efficiency in this study. In the meantime, a basic medicine database was established, and the original inventory table derived from the HIS system and the medicine inventory information of the dispenser issued by the automatic dispenser were mathematically calculated to obtain the final outpatient pharmacy inventory inventory table. The results show that the single inventory time is reduced from about 120 minutes to about 60 minutes. The application of the outpatient pharmacy-assisted inventory counting program can effectively improve the inventory counting efficiency.
Keywords: outpatient pharmacy;ExcelVBA;drug inventory
门诊药房药品盘点工作是医院资产管理的重要工作,对药品经济管理与质量管理有着非常重要的作用[1-2]。随着门诊药房信息化和自动化建设的深入推进,近年来,我国各级医院大力引进自动发药机,以提高门诊药房取药准确率和速度[3-4],提高患者的就医体验。但是,自动发药机的引进也给门诊药房药品盘点工作带来挑战。例如,自动发药机药品库存不能与医院HIS系统对接,导致HIS系统导出的药品库存信息与货架实存信息不一致,严重影响盘点效率。VBA是一种宏语言,结合微软办公软件很容易将日常工作流程转换为VBA程序代码,使药学工作实现自动化,如利用VBA编制中药采购软件[5]、药库智能化办公[6]、开发药品配伍禁忌审查表[7]等。
本文将从新乡市第一人民医院门诊药房库存盘点实际工作入手,分析目前盘点工作的不足,利用Excel VBA语言设计辅助库存盘点程序,以提高药品库存盘点效率,降低药师的工作强度。
1 资料与方法
1.1 辅助盘点程序的算法构建
此辅助盘点程序的整体思路是:以HIS系统导出的原始盘点表、自动发药机导出的库存数据为基础,建立药品基础信息库,设计辅助盘点程序的算法,导入原始盘点表、自动发药机库存数据,得到最终的门诊药房货架实际库存盘点表。
1.1.1 原始盘点表。从医院HIS系统导出原始盘点表,保存成“.xls”格式。导出的原始盘点表的内容格式如表1所示。
1.1.2 建立药品基础信息库。药品基础信息库内容包括药品的货位、名称、规格、单位、取药顺序、上药类型、单工位最大数量等信息,数据主要来源于医院HIS系统。药品基础信息库格式如表2所示。
1.1.3 辅助盘点程序设计思路。一是确定药品唯一性。因库存药品存在同名称、多规格、多厂家的情况,只检索药品名称无法确定药品的唯一性,故采用药典编号确定药品的唯一性。二是确定门诊药房库存盘点表信息。根据门诊药房库存盘点实际情况,导出的库存盘点表需要包括货位、药品名称、厂家、规格、数量、单位等内容。导出的库存盘点表格式如表3所示。三是库存盘点表排序与排版。为保证库存盘点有序进行,根据货架位置进行排序,并进行排版。
1.2 辅助库存盘点程序设计
辅助库存盘点程序包括导入原始盘点表、导入自动发药机库存数据、处理库存数据等过程。
1.2.1 导入原始盘点表。从HIS系统中导出原始盘点表,导入到门诊药房辅助库存盘点程序[8-9],保存在数组arr_yskc中,药品基础信息库数据导入到数组arr_db中。VBA代码示例如下:
Set wb = Workbooks.Open(sht_db.[Q4].Value)
arr_yskc = wb.Worksheets(1).Range("B5").Resize([A5].End(xlDown).Row - 4, 16)
wb.Close
arr_db = sht_db.[A1].CurrentRegion
ReDim arr_kc(1 To UBound(arr_yskc, 1), 1 To 10)
For i = 1 To UBound(arr_db, 1)
dict_ydhj(arr_db(i, 1)) = arr_db(i, 2)
Next i
'獲取不重复药典编号,获取数量之外所有信息
For i = 2 To UBound(arr_yskc, 1)
If dict_ydzc.exists(arr_yskc(i, 1)) = False Then
k = k + 1
If dict_ydhj.exists(arr_yskc(i, 1)) Then
arr_kc(k, 1) = dict_ydhj(arr_yskc(i, 1))
Else
arr_kc(k, 1) = ""
End If
arr_kc(k, 2) = arr_yskc(i, 1)
arr_kc(k, 3) = arr_yskc(i, 2)
arr_kc(k, 4) = arr_yskc(i, 3)
arr_kc(k, 5) = arr_yskc(i, 16)
arr_kc(k, 7) = arr_yskc(i, 11)
arr_kc(k, 9) = arr_yskc(i, 14)
End If
'累加药典编号对应数量信息
dict_ydzs(arr_yskc(i, 1)) = dict_ydzs(arr_yskc(i, 1)) + arr_yskc(i, 7)
dict_ydzc(arr_yskc(i, 1)) = dict_ydzc(arr_yskc(i, 1)) + arr_yskc(i, 10)
dict_ydlc(arr_yskc(i, 1)) = dict_ydlc(arr_yskc(i, 1)) + arr_yskc(i, 13)
Next i
For i = 1 To UBound(arr_kc, 1)
If dict_ydzc.exists(arr_kc(i, 2)) Then
arr_kc(i, 6) = dict_ydzc(arr_kc(i, 2))
arr_kc(i, 8) = dict_ydlc(arr_kc(i, 2))
arr_kc(i, 10) = dict_ydcl(arr_kc(i, 2))
End If
Next i
'库存盘点表赋值
sht_db.[S2].Resize(UBound(arr_yskc, 1), 10) = arr_kc
1.2.2 导入自动发药机库存数据。从自动发药机中导出发药机药品库存数据,导入到门诊药房辅助库存盘点程序,保存在数组arr_fyjkc1中。VBA代码示例如下:
'获取发药机库存
Set wb = Workbooks.Open(sht_db.[Q5].Value)
arr_fyjkc = wb.Worksheets(1).Range("A1").CurrentRegion
wb.Close
ReDim arr_fyjkc1(1 To UBound(arr_fyjkc, 1), 1 To 3)
For i = 1 To UBound(arr_fyjkc, 1)
arr_fyjkc1(i, 1) = arr_fyjkc(i, 2)
arr_fyjkc1(i, 2) = arr_fyjkc(i, 7)
arr_fyjkc1(i, 3) = arr_fyjkc(i, 9)
Next i
sht_db.[AD1].Resize(UBound(arr_fyjkc, 1), 3) = arr_fyjkc1
1.2.3 处理库存数据。根据导入的HIS系统原始盘点表、发药机库存药品信息等数据,对所有品种的药品数量信息自动进行加减运算,得到最终的门诊药房货架实存数据,保存在数组arr_kc中,然后导出到Excel表中。VBA代码示例如下:
'处理库存数据
arr_kc = sht_db.[S1].CurrentRegion
arr_fyjkc = sht_db.[AD1].CurrentRegion
arr_jtsj = sht_db.[AH1].CurrentRegion
For i = 2 To UBound(arr_fyjkc, 1)
dict_ydkc(arr_fyjkc(i, 1) &"/"&"zcfyj") = arr_fyjkc(i, 2)
Next i
ReDim Preserve arr_kc(1 To UBound(arr_kc, 1), 1 To 13)
For i = 1 To 4
arr_kc(1, i + 9) = arr_kc(1, i + 5)
Next i
For i = 2 To UBound(arr_kc, 1)
If dict_ydkc.exists(arr_kc(i, 2) &"/"&"zcfyj") = False Then
dict_ydkc(arr_kc(i, 2) &"/"&"zcfyj") = 0
End If
arr_kc(i, 6) = arr_kc(i, 6) - dict_ydkc(arr_kc(i, 2) &"/"&"zcfyj")
arr_kc(i, 10) = ""
arr_kc(i, 11) = arr_kc(i, 7)
arr_kc(i, 12) = ""
arr_kc(i, 13) = arr_kc(i, 9)
Next i
Set dict_ydkc = Nothing
sht1.[A1].Resize(UBound(arr_kc, 1), 13) = arr_kc
2 结果
使用门诊药房辅助盘点程序之前,原始盘点表上同一药品存在好几个条目,需要二次查询自动发药机单品种药品库存,货架药品盘点后需要进行大量的数学运算,严重影响盘点效率。而使用门诊药房辅助库存盘点程序,人们可以直接得到门诊货架实存药品数量,单次盘点时间由原来的120 min左右降至60 min左右,提高了药师的工作效率。
3 结论
获取库存数据时,该程序以导出数据的方式保存在本地计算机上,操作不便,若能直接获取HIS系统和自动发药机药品库存信息,会增加操作的便捷性。总体来说,该门诊药房辅助库存盘点程序的使用,让药师有更多的时间为患者提供用药服务,提高了药师的专业技术价值,同时也为提高自动化药房库存盘点效率提供了新思路。
参考文献:
[1]唐哲,韦韡,西娜.我院加強药品盘点监管的探讨[J].中国药房,2016(10):1378-1380.
[2]袁忠伟.提高医院药品盘点账物相符率的经验浅谈[J].中国执业药师,2015(4):51-53.
[3]谢明华,葛敏,彭佳蓓,等.自动化发药系统在我院门诊药房的应用实践与体会[J].中国药房,2014(41):3889-3891.
[4]孙家艳,朱静.韦乐海茨发药机在本院门诊药房应用的实践与体会[J].北方药学,2015(11):125-126.
[5]林永进.采用VBA编制中药采购软件[D].济南:山东大学,2016.
[6]金朝辉,顾锦建,郑明琳,等.VBA语言在我院药库智能化办公中的应用[J].中国药房,2016(7):987-989.
[7]王柯静,杨波,周远大,等.基于Excel的药品配伍禁忌审查表的开发[J].中国药房,2013(17):1625-1626.
[8]Excle Home.Excel VBA经典代码应用大全[M].北京:北京大学出版社,2019.
[9]Excle Home论坛.常见字典用法集锦及代码详解[EB/OL].(2019-10-01)[2019-12-18].http://club.excelhome.net/forum.php?mod=viewthread&tid=868892.