Почему Microsoft Barcode Control ломается, когда рабочая книга открывается посредством взаимодействия? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть лист, к которому я добавил QR-код.

QR-код является элементом управления ActiveX: Microsoft Barcode Control 14.0

QR-код связан с ячейкой (A1), поэтому при изменении значения в ячейке QR-код также меняется.

Когда я нормально открываю книгу, все работает как надо.

Однако, когда я открываю его с помощью Interop из проекта Winforms vb.net, QR-код больше не отвечает, когда значение в связанной ячейке изменяется. Более того, когда я щелкаю правой кнопкой мыши элемент управления штрих-кодом, отсутствует опция контекстного меню «Объект Microsoft Barcode Control 14.0» (см. Ниже).

enter image description here

Код взаимодействия, который я использую для открытия книги, выглядит следующим образом:

Dim XLApp As New Excel.Application
XLApp.Visible = True
Dim XLBook As Excel.Workbook = XLApp.Workbooks.Open(FilePath)

Может кто-нибудь сказать мне, что является причиной этого? И, возможно, предложите, что я могу сделать, чтобы это не произошло.

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Мне не удалось заставить Microsoft Barcode Control правильно работать с взаимодействием. Одним из способов было бы открыть файл с помощью команды оболочки, а затем подключиться к процессу для работы с ним. Но я нашел это слишком грязным.

Вместо этого я решил использовать Google Chart API. Это требует подключения к интернету. Но это не проблема для меня.

Вот ссылка для получения дополнительной информации: https://sites.google.com/site/e90e50fx/home/generate-qrcode-with-excel

И код VBA:

Option Explicit
'other technical specifications about google chart API:
'https://developers.google.com/chart/infographics/docs/qr_codes

Function URL_QRCode_SERIES( _
    ByVal PictureName As String, _
    ByVal QR_Value As String, _
    Optional ByVal PictureSize As Long = 150, _
    Optional ByVal DisplayText As String = "", _
    Optional ByVal Updateable As Boolean = True) As Variant

Dim oPic As Shape, oRng As Excel.Range
Dim vLeft As Variant, vTop As Variant
Dim sURL As String

Const sRootURL As String = "https://chart.googleapis.com/chart?"
Const sSizeParameter As String = "chs="
Const sTypeChart As String = "cht=qr"
Const sDataParameter As String = "chl="
Const sJoinCHR As String = "&"

If Updateable = False Then
    URL_QRCode_SERIES = "outdated"
    Exit Function
End If

Set oRng = Application.Caller.Offset(, 1)
On Error Resume Next
Set oPic = oRng.Parent.Shapes(PictureName)
If Err Then
    Err.Clear
    vLeft = oRng.Left + 4
    vTop = oRng.Top
Else
    vLeft = oPic.Left
    vTop = oPic.Top
    PictureSize = Int(oPic.Width)
    oPic.Delete
End If
On Error GoTo 0

If Len(QR_Value) = 0 Then
    URL_QRCode_SERIES = CVErr(xlErrValue)
    Exit Function
End If

sURL = sRootURL & _
       sSizeParameter & PictureSize & "x" & PictureSize & sJoinCHR & _
       sTypeChart & sJoinCHR & _
       sDataParameter & UTF8_URL_Encode(VBA.Replace(QR_Value, " ", "+"))

Set oPic = oRng.Parent.Shapes.AddPicture(sURL, True, True, vLeft, vTop, PictureSize, PictureSize)
oPic.Name = PictureName
URL_QRCode_SERIES = DisplayText
End Function


Function UTF8_URL_Encode(ByVal sStr As String)    
    'http://www.nonhostile.com/howto-convert-byte-array-utf8-string-vb6.asp
    Dim i As Long
    Dim a As Long
    Dim res As String
    Dim code As String

    res = ""
    For i = 1 To Len(sStr)
        a = AscW(Mid(sStr, i, 1))
        If a < 128 Then
            code = Mid(sStr, i, 1)
        ElseIf ((a > 127) And (a < 2048)) Then
            code = URLEncodeByte(((a \ 64) Or 192))
            code = code & URLEncodeByte(((a And 63) Or 128))
        Else
            code = URLEncodeByte(((a \ 144) Or 234))
            code = code & URLEncodeByte((((a \ 64) And 63) Or 128))
            code = code & URLEncodeByte(((a And 63) Or 128))
        End If
        res = res & code
    Next i
    UTF8_URL_Encode = res
End Function


Private Function URLEncodeByte(val As Integer) As String
    Dim res As String
    res = "%" & Right("0" & Hex(val), 2)
    URLEncodeByte = res
End Function
0 голосов
/ 26 июня 2019

Вы можете вызывать метод Calculate класса Worksheet каждый раз, когда вам нужно обновить QR-код.Например, необработанный эскиз в VBA:

Application.EnableEvents = True
Application.ScreenUpdating = True
Sheets("QR_CodeSheet").Calculate
...