Gostaria de imprimir automaticamente um código QR de uma das minhas células. A melhor maneira de fazer isso que encontrei é usando a função IMAGE.
A função se parece com isso:
=IMAGE("https://api.qrserver.com/v1/create-qr-code/?data="&ENCODEURL(B2))
Infelizmente, às vezes, quando imprimo após alterar o valor da minha célula, ele imprime antes que o QR Code seja gerado e recebo algo assim: O PrintPreview mostra uma sequência de texto de "Imagem" onde o QR Code deveria estar
Tentei vários métodos para concluir a função, mas nenhum foi confiável.
Sub ChangePrintedQR()
Dim ImgRange As Range
Set ImgRange = Range("B4")
Range("B2") = Now
' ImgRange.Formula = "=IMAGE(""https://api.qrserver.com/v1/create-qr-code/?data=""&ENCODEURL(B2))" 'Having this line can print "Busy" instead of "Picture"
' While ImgRange.Text = "Picture" 'This gets stuck in an infinite loop
' Debug.Print ImgRange.Text 'regardless of this line, trying the Value of the cell does the same
' Wend
' Application.Calculate 'This method does nothing
' If Not Application.CalculationState = xlDone Then
' DoEvents
' End If
' Application.Wait (Now + TimeValue("0:00:10")) 'This results in the waiting, but no change to the printed sheet.
ActiveSheet.PrintPreview
End Sub
Observe que às vezes obtenho uma imagem atualizada ao imprimir, mas outras vezes não. Gostaria de poder imprimir uma imagem atualizada todas as vezes.
Ok... Depois de alguns testes, esta parece ser uma das vezes em que
DoEvents
é insuficiente, e você precisa permitir que o código termine completamente. Para fazer isso funcionar, você pode usar aOnTime
função, e dividir a função em duas:Isso adicionará atrasos de um segundo e interromperá completamente o VBA entre os loops — isso permite que a imagem seja baixada e altere a célula de
#BUSY
para#VALUE
.( Pode haver uma maneira de forçar/permitir que a conexão/download ocorra durante o VBA e transformar isso novamente em uma única função, no entanto, não tive sucesso com Atualizar Conexões, Atualizar Links,
DoEvents
etc.)