Я пытаюсь получить значение BLOB из SQLite3 через VBA.Байты были введены из HTTP-возврата с использованием Python.Они представляют изображение (TIF), которое впоследствии будет возвращено пользователю.Я начну с того, что из-за ограничений на компьютеры, используемые для выполнения этого действия, я буду использовать VBA / Excel для этого.Я уже завершил этот процесс через Python и C #, чтобы убедиться, что с данными, которые я извлекаю, все в порядке.Теперь мне нужно передать его в VBA, чтобы его было легко распространять среди пользователей.
В VBA я могу вывести значения записей и перебирать их по мере необходимости, но всякий раз, когда добираюсь до значения байтамое окно немедленного доступа к Excel дает мне окно с надписью
«ОТМЕНА НЕ ОТВЕТА, ПЕРЕЗАПУСК ИЛИ ОТЛАДКА» и т. д.
Я тоже сделал много разных вещей, не только пыталсязаписать байты в файл.Я просто попробовал
Dim byt() as bytes
byt = rcdset.Fields("IMAGE_STRING").Value
Также
LenB(rcdset.Fields("IMAGE_STRING").Value)
и даже просто
Debug.Print rcdset.Fields("IMAGE_STRING").Value
Независимо от того, что я делаю, когда я перебираю код, который касаетсяrcdset.Fields("IMAGE_STRING").Value
он останавливается.
Текущий код / попытка:
Dim stream As New ADODB.stream
OutFile = "P:\Testie.TIF"
stream.Type = adTypeBinary
stream.Open
stream.Write rcdset.Fields("IMAGE_STRING").Value
stream.SaveToFile (OutFile)
И, конечно, как только он достигает stream.Write rcdset.Fields("IMAGE_STRING").Value
и вызывает это значение, он понижается.Я пытался получить доступ к полю разными способами, такими как rcdset.Fields("IMAGE_STRING")
, "rcdset("IMAGE_STRING")
и т. Д.
Как я могу создать этот файл изображения?Я пишу в python и делаю простой
with open(f'''P:\\{name}.{ext}''', 'wb') as of:
of.write(bytes)
, и он создает запись.C # то же самое, конечно, немного больше кода, но не проблемаЭто сводит меня с ума.Может ли VBA не обрабатывать такие данные?
Полный код ниже, и любая помощь приветствуется!
Dim file As New Scripting.FileSystemObject
Dim conn As New ADODB.Connection
Dim rcdset As New ADODB.Recordset
Dim stream As New ADODB.stream
'Dim rec As New ADODB.Field
Dim filepath As String
Dim bytes As Byte
Dim connStr As String
Dim sql As String
Dim lastrow As Integer
Dim ScacRange As Range
Dim RowCounter As Integer
Dim Pro As String
Dim Carrier As String
Dim PaperType As String
Dim downloaded() As String
Dim i As Integer
Dim paperTitle As String
Dim fileLen As Long
Dim OutFile As String
Dim binlength As Long
lastrow = Cells(Rows.Count, 1).End(xlUp).Row
If lastrow > 501 Then
MsgBox "You can only process 500 at one time.", vbInformation
Exit Sub
End If
Set ScacRange = Range(Cells(2, 2), Cells(lastrow, 2))
filepath = Cells(1, 5).Value
RowCounter = 2
For Each Scac In ScacRange
If Len(Trim(Scac.Value)) <> 4 Then
MsgBox "Row " & CStr(RowCounter) & " does not contain a 4 letter Scac. Please correct and try again."
Exit Sub
End If
RowCounter = RowCounter + 1
Next Scac
If Not file.FolderExists(filepath) Then
MsgBox "The folder '" & filepath & "' does not exist. Please enter a valid folder.", vbExclamation, "File Path Error"
Exit Sub
End If
connStr = "DRIVER=SQLite3 ODBC Driver;Database=Z:\IMAGE.db"
On Error GoTo Cleanup
conn.Open connStr
For Each Scac In ScacRange
If IsEmpty(Scac) Or IsEmpty(Scac.Offset(0, -1)) Or IsEmpty(Scac.Offset(0, 1)) Then
Scac.Offset(0, 2).Value = "Not all values present. No image retreived"
GoTo NextIter
End If
Pro = Trim(Scac.Offset(0, -1).Value)
Carrier = Trim(UCase(Scac.Value))
PaperType = Scac.Offset(0, 1).Value
If PaperType = "BOTH" Then
sql = "SELECT IMAGE_ID, IMAGE_STRING, IMAGE_FILE_EXT FROM DOCUMENTS WHERE PRO_NUMBER = '" & Pro & "' AND SCAC = '" & Carrier & "' AND IMAGE_TYPE IN('BL','DR')"
rcdset.Open sql, conn
If rcdset.BOF And rcdset.EOF Then
Scac.Offset(0, 2).Value = "No Images available"
rcdset.Close
GoTo NextIter
End If
rcdset.MoveFirst
i = 0
Do Until rcdset.EOF
paperTitle = rcdset.Fields(0).Value
ReDim Preserve downloaded(i)
downloaded(i) = paperTitle
OutFile = "P:\Testie.TIF"
stream.Type = adTypeBinary
stream.Open
''''''''''''The below line is where it breaks down''''''''''''''''''''''''''''
stream.Write rcdset.Fields("IMAGE_STRING").Value
stream.SaveToFile OutFile, adSaveCreateOverWrite
'do work
i = i + 1
Debug.Print paperTitle
rcdset.MoveNext
Loop
rcdset.Close
Scac.Offset(0, 2).Value = Join(downloaded, ", ") & " downloaded to folder."
ReDim downloaded(0)
Else:
sql = "SELECT IMAGE_ID, IMAGE_STRING FROM DOCUMENTS WHERE PRO_NUMBER = '" & Pro & "' AND SCAC = '" & Carrier & "' AND IMAGE_TYPE = '" & PaperType & "'"
rcdset.Open sql, conn
If rcdset.BOF And rcdset.EOF Then
Scac.Offset(0, 2).Value = "No Images available"
rcdset.Close
GoTo NextIter
End If
rcdset.MoveFirst
Debug.Print rcdset.Fields(0).Value
'dow work
Scac.Offset(0, 2).Value = "Downloaded to folder"
rcdset.Close
End If
NextIter:
Next Scac
Cleanup:
If IsObject(rcdset) Then
If rcdset.State = 1 Then
rcdset.Close
End If
Set rcdset = Nothing
End If
If IsObject(conn) Then
If conn.State = 1 Then
conn.Close
End If
Set conn = Nothing
End If
If IsObject(file) Then
Set file = Nothing
End If
Ошибка изображения ниже
https://www.google.com/imgres?imgurl=https%3A%2F%2Fwww.stellarinfo.com%2Fblog%2Fwp-content%2Fuploads%2F2017%2F02%2FExcel-not-responding.png&imgrefurl=https%3A%2F%2Fwww.stellarinfo.com%2Fblog%2Ffix-microsoft-excel-is-not-responding-error%2F&docid=XoYYxJE6mc5PtM&tbnid=coD0C_Y_q1La5M%3A&vet=10ahUKEwiM-_2Yx6fgAhUptIMKHepGDLYQMwhBKAEwAQ..i&w=363&h=266&client=firefox-b-1-d&bih=944&biw=1920&q=excel%20not%20responding%20error&ved=0ahUKEwiM-_2Yx6fgAhUptIMKHepGDLYQMwhBKAEwAQ&iact=mrc&uact=8
Я получил эту фотографию от Google.Не удалось вставить мое изображение