Excel VBA 工资表批量截图工资条保存为图片文件

2024-07-02 0

本文首发于2023年8月26日于其他同名平台。更多文章案例请搜索关注!

概括

按人员过滤工资单数据到新工作表中

从工资单中删除空白

导出工资单并将其保存为图像文件

大家好,我是一名冷水茶师。他想按员工过滤工资表,然后在过滤过程中对金额为0的进行截图,使表变窄,更容易截图?

如果你想解决这个问题,不知道你是否可以采用【ExcelVBA工作表中高亮显示行和列】一文中使用的方法:先记下原来的列宽,进行过滤,然后将其更改为0的量。将列宽设置为0并在下次过滤之前恢复它?尽管我是这么想的,但我并没有这么做。

如果我处理的是工资单,我们有一个小文件分割工具【ExcelVBA文件分割工具功能扩展】来按人分割文件,这样我们就可以完成按人创建工资单了。

他的问题让我想到,如果人多的话,发帖者可能是手动截图的,那不是有点繁琐吗?

于是,我突然想到,是否可以一键创建所有员工的工资截图呢?

经过一下午的努力,终于完成了。让我们来看看:

基本思想

1按员工单独筛选薪资表,将筛选结果复制到新工作表并将其命名为“薪资”。

2在工资表中,删除金额为0或为空的列。

3将工资单复制并粘贴为图像。

4创建一个图表并将图像插入其中。

5、从图表中导出图像,并根据员工姓名和当前时间保存到C:Payroll目录中。

代码

1模块1,CaptureData流程,薪资截图:

SubCaptureData()DimwsSourceAsWorksheetDimwsDestinationAsWorksheetDimemployeeNameAsStringDimcurrentRowAsRangeDimOutputFolderAsStringDimlastRowAsIntegerDimiColAsIntegerDimrngAsRange,picAsObjectDimobjChtAsChartObjectApplicationDisplayAlertsFalseApplicationScreenUpdatingFalseSetwsSourceThisWorkbookSheets('工资表')OnErrorResumeNextSetwsDestinationThisWorkbookSheets('工资单')OnErrorGoTo0IfwsDestinationIsNothingThenSetwsDestinationThisWorkbookSheetsAddwsDestinationName'SalarySlip'ElsewsDestinationCellsClearEndIflastRowwsSourceCells(wsSourceRowsCount,1)End(xlUp)RowFori3TolastRowSetcurrentRowwsSourceRows(i)employeeNamecurrentRowCells(1,3)ValueIfemployeeName''ThenwsSourceRows(2)。AutoFilterField:3,Criteria1:employeeNameApplicationCalculateFullwsSourceUsedRangeSpecialCells(xlCellTypeVisible)CopywsDestinationCells(1,1)wsSourceRows(2)AutoFilterField:3SetrngwsDestinationCells(3,1)Resize(1,wsDestinationUsedRangeColumnsCount)ForiColrngCellsCountTo1Step-1IfIsEmpty(rngCells(1,iCol)Value)OrrngCells(1,iCol)Value0ThenrngCells(1,iCol))EntireColumnDeleteEndIfNextwsDestinationActivateSetrngwsDestinationCells(1,1)Resize(3,wsDestinationUsedRangeColumnsCount)rngCopySetpicActiveSheetPicturesPastepicCopyOutputFolder'C:工资栏'IfNotDir(OutputFolder,vbDirectory)''thenMkDirOutputFolderEndIfOutputFileOutputFolder''employeeName'('Format(Now,'YYYYMMDDhhmmss')')jpg'SetobjChtwsDestinationChartObjectsAdd(0,0,rngWidth,rngHeight)WithobjChtChartParentSelectPasteExportOutputFile,'JPG'ParentDeleteEndWithpicDeletewsDestinationUsedRangeClearEndIfNextwsDestinationDeleteApplicationDisplayAlertsTrueApplicationScreenUpdatingTrueMsgBox'完成!'EndSub

?代码分析:

(1)定义一些变量、工作表对象、范围对象、图表对象等。

(2)第12-13行,禁用屏幕更新和警告。

(3)第14行,设置数据源表wsSource为“SalaryTable”。

(4)在第15至23行设置目标表“wsDestination”。首先检查这里表是否存在。如果存在,则删除其内容。实际上它不应该存在,因为我们在进程结束之前删除了该表。

(5)第24-59行,循环遍历“工资表”,并将员工的工资单单独保存为图像。

(a)第29行到第30行,过滤工资表并重新计算整个表。主要原因是第一行有公式,不重新计算数值不会改变。

(b)第31行,将过滤结果复制到工资表中。

(c)第32~38行,删除金额为0或空白的列。

(d)第40至43行:复制工资单数据范围,将其粘贴为图像并复制该图像。

(e)第44至48行:设置输出目录和文件名。

(f)第49-55行,插入图表、插入图像、导出并保存。

(g)第56行至第57行:删除Payroll表中的图像,删除Payroll表的内容,并准备处理下一条记录。

(6)第60-62行,删除工资表并恢复屏幕更新和警报。

2其他进程:CmdCapture、截图命令按钮:

PrivateSubCmdCaptureClick()CallCaptureDataEndSub

尖端

1、添加临时工作表时,首先需要检查该工作表是否存在。如果存在,请删除内容并保存。无论哪种情况,要么报错,要么增加大量冗余。

2过滤、复制和粘贴工作表的方法。

3复制该区域并将其另存为图像。

4使用工作表中的图表对象,可以将工作表中的图像导出并保存为图像文件。

5为了处理输出目录,我们可以在根目录中创建一个文件夹。就像添加工作表一样,我们首先判断它是否存在,如果不存在则创建一个新的,以避免错误。

~~~~~~结束~~~~~~

如果喜欢,请点赞、点击查看、留言!分享,让自己变得更强!感恩!

本站文章均由用户上传或转载而来,该文章内容本站无法检测是否存在侵权,如果本文存在侵权,请联系邮箱:2287318951@qq.com告知,本站在7天内对其进行处理。

发布评论