首页 > 解决方案 > 用于生成二维码的 VBA 代码,但代码从哪里开始?

问题描述

为了工作,我必须生成一些包含信息的二维码。因此,我在网上查了一下,发现了这个“已经制作”的二维码生成器:

https://github.com/JonasHeidelberg/barcode-vba-macro-only

它非常好,而且效果很好。

在使用代码创建最终的二维码之前,我正在尝试将其集成到我的 VBA 表中以进行数据处理。(没什么复杂的)

这是它的样子: 在此处输入图像描述 4 个单元格“B4 到 B6”获取是否编码的条目数据,具体取决于复选框,然后将结果写入 D 列。每个单元格内容都堆叠在一个变量中,并且这个变量被提供给二维码生成器:

Public Function GenerateQRCode()

Dim CurrentWS As String

UserDataRange = "B6:B9" 'The cells in which the data to be encoded are stored
InputDataRange = "D6:D9"    'the cells with the encoded (or not) values
InputCell = "A4"    'the cell where the text to be encoded in the QR code has to be put

'encode the text depending on hte value of the cell behind the chek boxes
For Each cell In Range(UserDataRange)
   If cell.Offset(0, 1) = True Then
       EncodedText = EncodeDecode.Base64EncodeString(cell.Value)
       cell.Offset(0, 2).Value = EncodedText
   ElseIf cell.Offset(0, 1) = False Then
       cell.Offset(0, 2).Value = cell.Value
   End If
Next

Range(InputCell).ClearContents
DataToEncode = ""

'puts the text in the input line with dashes between each value
For Each cell In Range(InputDataRange)
pouet = Range(InputDataRange).Address

   If DataToEncode = "" Then
       DataToEncode = cell.Value & Chr(10)
   Else
       If cell.Address = Mid(Range(InputDataRange).Address, InStr(1, Range(InputDataRange).Address, ":") + 1, _
       Len(Range(InputDataRange).Address) - (InStr(1, Range(InputDataRange).Address, ":") - 1)) Then

           DataToEncode = DataToEncode & cell.Value
       Else
           DataToEncode = DataToEncode & cell.Value & Chr(10)
       End If
   End If
Next

Range(InputCell).Value = DataToEncode

End Function

我担心的是“无论我在整个工作簿中修改什么单元格,它都会占用 QR 码生成器。”

我想在代码的开头给出一个条件If cell A4 is modified, lunch the code,但我什至无法理解是什么让代码开始以及如何收集数据......

我最好的猜测是这是代码的开头:

Public Function EncodeBarcode(ShIx As Integer, xAddr As String, _
                code As String, pbctype%, Optional pgraficky%, _
                Optional pparams%, Optional pzones%) As String
  Dim s$, bctype%, graficky%, params%, zones%
  Dim oo As Object

  Call Init
  If IsMissing(pzones) Then zones = 2 Else zones = pzones
  If IsMissing(pparams) Then params = 0 Else params = pparams
  If IsMissing(pgraficky) Then graficky = 1 Else graficky = pgraficky
  If IsMissing(pbctype) Then bctype = 0 Else bctype = pbctype

但它是如何开始的?哦

我认为像Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean)控制“目标”值这样的行是强制性的......在这里,它对我来说看起来很神奇:(

如何xAddr获取我单击的单元格的地址?又是魔法……

我希望仅在单击创建的按钮时才执行代码。(它会生成一些无限循环并且 excel 关闭:/)或者,如果不可能,我希望它仅在单元格 A4 中的数据被修改时执行。

谢谢你的帮助 :)

标签: excelvbaqr-code

解决方案


这是因为CELL 函数函数是不稳定的,它会在每次计算时重新计算(不仅在它所依赖的单元格中的计算上)。这意味着也EncodeBarcode()计算每次计算(因为它CELL()在其参数中使用该函数)。

一个易失函数是一个导致在Excel 每次重新计算时重新计算其所在单元格中的公式的函数。无论公式所依赖的先例数据和公式是否已更改,或者公式是否还包含非易失性函数,都会发生这种情况。

如果您删除该CELL()功能并将其替换为硬值

=EncodeBarcode(1;"B4";A4;51;1;0;2)

它不会在每个单元格更改时重新计算条形码。但它只会在它依赖的单元格发生变化时重新计算条形码(本例中的单元格 A4)。


推荐阅读