ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 32507|回复: 40

[已解决] 用宏命令批量生成二维码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-7-20 15:29 | 显示全部楼层 |阅读模式
本帖最后由 lsc900707 于 2017-12-6 17:18 编辑

宏.png
如图所示,我是使用QRmake来生成二维码,按钮做好以后发现我每次生成二维码必须先选中二维码下方的数字,按下按钮后才能生成二维码,并且只能单独操作,不能进行批量操作。我现在的需求是我按下按钮,所有的二维码能够一次性生成,求大神帮忙下,需要生成二维码的数字是引用另外一个工作表的:
=IF(MOD(ROW(A1),8)=1,OFFSET(排产单!AH$3,CEILING(ROW(A1)/8,1),0)&"","")
宏命令如下:
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Point01 As Long, Point02 As Long, Point03 As Long
Private i As Integer

Sub MakeQRCode()
    If Dir("D:\QRmake.exe") = "" Then
        MsgBox "QRmake.exe文件丢失,请确认!", vbCritical, "外部程序调用"
        Exit Sub
    End If
    i = MK_QR(ActiveCell.Value, "10", "4")
End Sub

Function MK_QR(Enc_Dat, ECL, SIZ)
    Dim F_Name As String
    F_Name = "[" & ActiveWorkbook.Name & "]" & ActiveSheet.Name & "!" & ActiveCell.Address
    Point01 = Shell("""" & "D:\QRmake.exe""" & " /S" & SIZ & " /L" & ECL + 1 & " /O""" & ThisWorkbook.Path & "\" & F_Name & ".bmp"" /T""" & Enc_Dat & """")
    Point02 = OpenProcess(&H100000, 1, Point01)
    Point03 = WaitForSingleObject(Point02, &HFFFFFFFF)
    Point03 = CloseHandle(Point02)
    Point01 = Empty
    Point02 = Empty
    Point03 = Empty
    ActiveCell.Offset(-4, 0).Select
    With ActiveSheet.Pictures.Insert(ThisWorkbook.Path & "\" & F_Name & ".bmp")
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
    End With
    '将已经生成的二维码图像删除
    Kill (ThisWorkbook.Path & "\" & F_Name & ".bmp")
    ActiveCell.Offset(0, -1).Select
End Function



二维码.rar

469.12 KB, 下载次数: 1340

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-20 16:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
自顶下。。求大佬帮一下忙。。拜谢

TA的精华主题

TA的得分主题

发表于 2017-7-20 19:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub MakeQRCode()
    If Dir("D:\QRmake.exe") = "" Then
        MsgBox "QRmake.exe文件丢失,请确认!", vbCritical, "外部程序调用"
        Exit Sub
    End If
    For k = 1 To 10000
        i = MK_QR(Cells(7 + 8 * (k - 1), 6), "10", "4")
    Next k
End Sub

TA的精华主题

TA的得分主题

发表于 2017-7-20 21:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
new2654149 发表于 2017-7-20 16:51
自顶下。。求大佬帮一下忙。。拜谢

批量生成二维码

代码如下,请看以下代码中涂颜色的部分,就不上附件了


Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Point01 As Long, Point02 As Long, Point03 As Long
Private i As Integer

Sub MakeQRCode()
Dim k%, r%, Shp As Shape  '声明相关变量
Application.ScreenUpdating = False  '禁止屏幕刷新
    If Dir("D:\QRmake.exe") = "" Then
        MsgBox "QRmake.exe文件丢失,请确认!", vbCritical, "外部程序调用"
        Exit Sub
    End If
    With Sheet1
        For Each Shp In .Shapes '在所有图形中遍历
            If Shp.Type = 11 Then Shp.Delete  '删除之前已生成的二维码图片
        Next Shp
        On Error Resume Next
        r = .Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row) '在A列最后一个非空单元格的值中循环
        If Err <> 0 Then MsgBox "请检查在A列最后一个非空单元格的值有错误值!", 16, "错误提示": Exit Sub
        For k = 1 To r   '循环进行批量生成二维码图片
            .Cells(7 + 8 * (k - 1), 6).Select  '选择需要生成二维码的数字的单元格
            i = MK_QR(.Cells(7 + 8 * (k - 1), 6), "10", "4")
        Next k
    End With
    MsgBox "批量生成二维码已完成!" & Chr(13) & "     共生成 " & k - 1 & "个", , "提示"
Application.ScreenUpdating = True  '启动屏幕刷新
End Sub

Function MK_QR(Enc_Dat, ECL, SIZ)
    Dim F_Name As String
    F_Name = "[" & ActiveWorkbook.Name & "]" & ActiveSheet.Name & "!" & ActiveCell.Address
    Point01 = Shell("""" & "D:\QRmake.exe""" & " /S" & SIZ & " /L" & ECL + 1 & " /O""" & ThisWorkbook.Path & "\" & F_Name & ".bmp"" /T""" & Enc_Dat & """")
    Point02 = OpenProcess(&H100000, 1, Point01)
    Point03 = WaitForSingleObject(Point02, &HFFFFFFFF)
    Point03 = CloseHandle(Point02)
    Point01 = Empty
    Point02 = Empty
    Point03 = Empty
    ActiveCell.Offset(-4, 0).Select
    With ActiveSheet.Pictures.Insert(ThisWorkbook.Path & "\" & F_Name & ".bmp")
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
    End With
    Kill (ThisWorkbook.Path & "\" & F_Name & ".bmp") '将已经生成的二维码图像删除
    'ActiveCell.Offset(0, -1).Select  '此句可删除
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-21 09:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jiaxinl 发表于 2017-7-20 21:47
批量生成二维码

代码如下,请看以下代码中涂颜色的部分,就不上附件了

您好,非常感谢您的帮助,我现在还有个小问题,你代码中是在A列最后一个非空单元格值中循环,而我表格内数据是要在别的表格内引用的,在下方肯定会有长串空的单元格出现。这样的情况我应该如何修改代码,谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-21 09:49 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-7-21 10:17 来自手机 | 显示全部楼层
本帖最后由 jiaxinl 于 2017-7-21 10:24 编辑
new2654149 发表于 2017-7-21 09:49
如图所示。


你A列中不是用公式编好序号了吗?
只要你A列中排序号的公式不出错就行
其实你I列也是等于A列中编好的序号吗
你编好的序号其实就是要批量生成二维码的个数

我发的代码你可以直接拿来用,不用再修改
只要你A列中排序号的公式不出错就行

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-21 10:24 | 显示全部楼层
jiaxinl 发表于 2017-7-21 10:17
你A列中不是用公式编好序号了吗?
只要你A列中排序号的公式不出错就行
其实你I列也是等于A列中编好的 ...

实际情况是如果我不把空表格删除的话,还是会有错误提醒

TA的精华主题

TA的得分主题

发表于 2017-7-21 10:29 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 jiaxinl 于 2017-7-21 10:40 编辑
new2654149 发表于 2017-7-21 10:24
实际情况是如果我不把空表格删除的话,还是会有错误提醒


有可能是你A列中非空单元格的下面的单元格中有可以存在空格或其他不可见的字符(这样的单元格属于假空)

进行测试A列是否存在假空的单元格
你可以先选择A列,然后按Ctrl+G 定位
定位条件  选择空值

你可以把A列改为I列试试看会不会出现错误提示

  r = .Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row) '在A列最后一个非空单元格的值中循环

改为:

r = .Range("I" & .Cells(Rows.Count, 9).End(xlUp).Row) '在I列最后一个非空单元格的值中循环

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-21 10:59 | 显示全部楼层
jiaxinl 发表于 2017-7-21 10:29
有可能是你A列中非空单元格的下面的单元格中有可以存在空格或其他不可见的字符(这样的单元格属于假空)
...

我检查了下前面都是对的
到这一行就不对了我只要把这一行后面的删了,才能够不出现问题,改成I列也没有用的
cuowu.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-3 11:10 , Processed in 0.045296 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表