作者:mobiledu2502869467 | 来源:互联网 | 2023-07-19 20:55
为了工作,我必须生成一些带有信息的QR码。
因此,我在Internet上进行了检查,发现此“已完成”的QR码生成器:
https://github.com/JonasHeidelberg/barcode-vba-macro-only
这很好,而且效果很好。
在使用代码创建最终QR代码之前,我试图将其集成到我的VBA工作表中以进行数据处理。 (没什么复杂的)
是这样的:
4个单元格“ B4至B6”根据复选框将获得或未编码的条目数据,然后将结果写入列D中。
每个单元格的内容都堆叠在一个变量中,并将此变量提供给QR码生成器:
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,":") - 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)
这样的行,然后控制“ target”的值...
在这里,对我来说,这看起来像是魔术:(
xAddr
如何获取我单击的单元格的地址?再次魔术...
我希望仅在单击创建的按钮时执行代码。 (它会生成一些无限循环,而excel会关闭:/)
或者,如果不可能的话,我希望仅在修改单元格A4中的数据时执行它。
感谢您的帮助:)
这是因为CELL function函数是 volatile 函数,它会根据每次计算(不仅取决于它所依赖的单元格中的计算)进行重新计算。这意味着EncodeBarcode()
也会进行每次计算(因为它在其参数中使用了CELL()
函数)。
“波动函数”是一种导致每次Excel重新计算的单元格中的公式重新计算的函数。
无论公式所依赖的先前数据和公式是否已更改,或者该公式是否还包含非易失性函数,都会发生这种情况。
如果您删除CELL()
函数并将其替换为硬值
=EncodeBarcode(1;"B4";A4;51;1;0;2)
它不会在每次单元格更改时重新计算条形码。但是,只有在依赖于更改的单元格(此示例单元格为A4)时,它才会重新计算条形码。