ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 纯vba生成二维码(可选择ANSI(GB2312)和UTF8,调整大小,纠错等级等)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-14 17:03 | 显示全部楼层 |阅读模式
本帖最后由 amao47kiki2 于 2018-12-14 17:24 编辑

因为自己使用的勤哲系统,没有批量生成二维码的功能。因此在excelhome上找了不少纯vba生成二维码的案例。对比后,发现大神们给的案例都没有完全适合我的。


一、只生成了UTF8格式的
[分享] 二维码生成工具(纯vba代码)
http://club.excelhome.net/thread-1096940-1-1.html

[求助] VBA 草料二维码
http://club.excelhome.net/thread-1437197-1-1.html



这两位大神给的案例,我测试了一下,只能生成UTF8的二维码,而我的扫描仪只识别GB2312的。但是优点就是能直接生成可调节大小的二维码,而且不用产生临时文件。


二、[分享] 二维码很火,分享EXCEL二维码插件。(已追加分享源码)
http://club.excelhome.net/thread-1044486-1-1.html

这位大神的案例,二维码放在窗体里面了,如果excel里面直接用image控件,获得的二维码是很模糊的,无法解决。但是这个案例,可以选择调节二维码的编码格式(ANSI和UTF8),ANSI是兼容GB2312的,所以这个案例,只要能改为类似前一个案例一样,生成图片格式的就可以符合我的要求了。

因此我查看了两者的二维码编码原理,这里省略500000字,实在看不懂,但是最后生成二维码方块的vba程序基本一致。于是我就着手改编优化。

废话不说,直接上案例!!






特别感谢excelhome这些大神的案例,给出的解决方案太好了!

生成二维码-可选择ANSI和UTF8.rar

68.13 KB, 下载次数: 1718

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-14 17:14 | 显示全部楼层
本帖最后由 amao47kiki2 于 2018-12-14 22:08 编辑

接下来说说我修改后,这个案例里面的关键代码。


如上,是工程窗口。关键的、不影响二维码生成算法的sub,集中在“模块1”和“clsQRCode”。


模块1中的Function ByteArrayToPicture就是生成二维码点阵的。原作者是把这个点阵作为image的方法/属性,赋值给窗体中的image控件。

而我为了生成图片格式,参考了案例一中作者的做法——用把点阵放到剪贴板中,然后粘贴在sheet1中。代码如下:
  1. Public Function ByteArrayToPicture(ByVal lp As Long, ByVal nWidth As Long, ByVal nHeight As Long, Optional ByVal nLeftPadding As Long, _
  2.         Optional ByVal nTopPadding As Long, Optional ByVal nRightPadding As Long, Optional ByVal nBottomPadding As Long, Optional times As Double = 5) As StdPicture
  3.     'times: 二维码图形放大倍数,函数缺省值为5   这个5倍基本够用,如果是1倍的话,二维码要变大的话,就容易模糊,5倍比较适中,可以自行调整。
  4.    
  5.     Dim tBMI As BITMAPINFO
  6.     Dim h As Long, hdc As Long, hBmp As Long, wdth As Long, hght As Long
  7.     Dim hbr As Long
  8.     Dim r As RECT

  9.     With tBMI.bmiHeader
  10.         .biSize = 40&
  11.         .biWidth = nWidth
  12.         .biHeight = -nHeight
  13.         .biPlanes = 1
  14.         .biBitCount = 8
  15.         .biSizeImage = nWidth * nHeight
  16.         .biClrUsed = 256
  17.     End With
  18.     tBMI.bmiColors(0) = &HFFFFFF
  19.     tBMI.bmiColors(2) = &H808080
  20.     h = GetDC(0)
  21.     hdc = CreateCompatibleDC(h)
  22.     r.Right = Round((nWidth) * times) + nLeftPadding + nRightPadding
  23.     r.Bottom = Round((nHeight) * times) + nTopPadding + nBottomPadding
  24.     hBmp = CreateCompatibleBitmap(h, r.Right, r.Bottom)
  25.     hbr = CreateSolidBrush(vbWhite)
  26.     hBmp = SelectObject(hdc, hBmp)
  27.     FillRect hdc, r, hbr
  28.     DeleteObject hbr
  29.     StretchDIBits hdc, nLeftPadding, nTopPadding, Round((nWidth) * times), Round((nHeight) * times), 0, 0, nWidth, nHeight, ByVal lp, tBMI, 0, 13369376
  30.     hBmp = SelectObject(hdc, hBmp)
  31.     DeleteDC hdc
  32.     ReleaseDC 0, h
  33.     Set ByteArrayToPicture = BitmapToPicture(hBmp, 1)
  34.    
  35.    
  36. '以下就是参考案例http://club.excelhome.net/thread-1096940-1-1.html的放到剪贴板的做法。
复制代码


说实话,我是知其然而不知其所以然。应该是调用了api。因此最顶上的这一段是必须的!!!!
' Clipboard Manager Functions
Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
1.png

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-14 17:15 | 显示全部楼层
本帖最后由 amao47kiki2 于 2018-12-14 22:05 编辑

空空空空空空空
1.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-14 17:21 | 显示全部楼层
另外,clsQRCode类模块中的Function Encode是原作者直接通过image控件调用的函数,应该是主程序。这个函数的最后条代码最重要:


  1.         Set Encode = ByteArrayToPicture(VarPtr(B(0, 0)), nModuleSize, nModuleSize, 2, 2, 2, 2)  '边框4个宽为2
复制代码
这个代码就是调用刚刚ByteArrayToPicture的程序。其中那4个2就是二维码周边空白的区域边框大小,这个可以自行调节。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-14 17:33 | 显示全部楼层
对于窗体的生成二维码按钮,我设置的代码是
  1. Private Sub Command1_Click()
  2.     Call 生成二维码(Sheet2.[D2], Sheet2.[D5], Sheet2.[E5], 50)
  3.     Call 生成二维码(Sheet2.[I2], Sheet2.[I5], Sheet2.[J5], 50)
  4. End Sub
复制代码
其中的sub 生成二维码带了几个参数。其中outputrangeQRwidth是可选参数,QRwidth缺省值为90
  1. Sub 生成二维码(inputrange As Range, pasterange As Range, Optional outputrange As Range, Optional outputrange As Integer = "90")
  2. '    Dim inputrange As Range        '输入数据的单元格
  3. '    Dim pasterange As Range        '粘贴二维码的单元格
  4. '    Dim outputrange As Range       '显示二维码的值的单元格
  5. '    Dim QRwidth As Integer         '二维码的大小
复制代码



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-6-15 15:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-6-15 17:06 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-28 09:02 | 显示全部楼层
10080 发表于 2019-6-15 15:47
有没有办法生成PDF417码?

可以参考
[求助] VBA 草料二维码
http://club.excelhome.net/thread-1437197-1-1.html

以及可以免费生成pdf417的网站
https://barcode.tec-it.com/zh/MobileQRCode

然后替换我程序中生成二维码图片的部分,应该就可以了。可以试试

TA的精华主题

TA的得分主题

发表于 2019-9-18 09:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-9-18 17:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢楼主分享!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-12 23:29 , Processed in 0.054127 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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