Самый быстрый способ передавать данные из Excel VBA в код Python

Есть код на VBA который заполняет массивы, учитыывая выбранный диапазон пользователем:

ReDim dataСontract(1 To rng.Rows.Count)
ReDim dataLegal(1 To rng.Rows.Count)
ReDim BuyerTin(1 To rng.Rows.Count)
ReDim dataAddress(1 To rng.Rows.Count)

i = 1
For Each cell In rng.Cells
    dataСontract(i) = Cells(cell.Row, 1).Value
    dataLegal(i) = ReformatName(Cells(cell.Row, 2).Value)
    BuyerTin(i) = Cells(cell.Row, 8).Value
    dataAddress(i) = Cells(cell.Row, 13).Value
    i = i + 1
Next cell

Затем я еще получаю PDF файл с данными этих массивов в формате base64.

Dim base64Pdf As String
base64File = ConvertFileToBase64(pdfFileName)

Все эти массивы надо передавать в код Python, для последующего создания и загрузки данных на сайт. Стало интересно как можно оптимизированнее передавать данные из кода в код? Есть мысль через командную строку, или создавать промежуточный файл, например в формате csv.


Ответы (2 шт):

Автор решения: rotabor

В общем да, непонятно, зачем тут Excel. Очевидно, что нужно переработать архитектуру всего решения. Если напишите подробнее, мы вам посоветуем.

А в Excel быстро работать с массивами нужно так:

Dim arr As Variant
arr = [A1:C10] ' получить данные из диапазона в массив
[B2:D11] = arr ' записать массив в диапазон

Дальше массив записывается в файл. Или, если данные на весь лист, тогда просто сохранить лист в CSV.

Если Excel у вас - это основное рабочее интерактивное приложение, то возможна такая реализация:

  1. По кнопке в Excel данные записываются в файл.
  2. После чего: а) или оттуда же запускается приложение на Питоне, которое как-то обрабатывает эти данные, б) или данные из файла берутся по запросу из Web - скорее, этот вариант.
→ Ссылка
Автор решения: Рустам Рысаев

Благодарю комментаторов, прилагаю свой скрипт, вдруг кому пригодится. Часть из VBA:

Sub RunPythonScript()
    Dim scriptPath As String
    Dim shellObj As Object
    
    startTime = Timer
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculateManual
    
    desktopPath = Environ("USERPROFILE") & "\Desktop"
    scriptPath = desktopPath & "\test.py"
    
    Set shellObj = CreateObject("WScript.Shell")
    shellObj.Run "python " & scriptPath, 0, True
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculateManual
    
    endTime = Timer

    elapsedTime = endTime - startTime
    
    Debug.Print "Время выполнения кода: " & Format(elapsedTime, "0.00") & " секунд"
    
End Sub

для python

# Функция для экспорта данных из выделенного диапазона
def export_data_and_convert_pdf():
    # Подключение к Excel
    excel = win32com.client.Dispatch("Excel.Application")
    workbook = excel.ActiveWorkbook
    sheet = excel.ActiveSheet

    # Получение выделенного диапазона
    selection = excel.Selection

    # Массив для хранения данных
    data_array = []

    # Сбор данных из диапазона
    for cell in selection:
        
        data_legal = sheet.Cells(cell.Row, 2).Value

        # Находим индекс первого символа кавычки
        quote_index = data_legal.find('"')

        if quote_index != -1:
            # Разделяем строку на две части
            before_quote = data_legal[:quote_index].strip()  # Часть до кавычек
            inside_quote = data_legal[quote_index:].strip()  # Часть внутри кавычек

            # Создаем новую строку с переносом
            reversed_data_legal = f'"{inside_quote[1:]} {before_quote}'
        else:
            # Если нет кавычек, оставляем как есть
            reversed_data_legal = data_legal
    
        buyer_tin = sheet.Cells(cell.Row, 8).Value
        buyer_tin = int(buyer_tin) if buyer_tin == int(buyer_tin) else buyer_tin
    
        row_data = {
            "dataContract": sheet.Cells(cell.Row, 1).Value,
            "dataLegal": reversed_data_legal,
            "BuyerTin": buyer_tin,
            "dataAddress": sheet.Cells(cell.Row, 13).Value,
        }
        
        # Добавляем данные в массив
        data_array.append(row_data)

# Запуск основного кода
if __name__ == "__main__":
    export_data_and_convert_pdf()

→ Ссылка