Posso davvero far funzionare Python con VBA

1

Sono un utente VBA pesante che quando ha la possibilità di fare un piccolo progetto in python è come andare dall'inferno al paradiso quando si tratta di programmare da solo. Tuttavia, so che i miei utenti vogliono rapporti in Excel (per buoni motivi) e non sono pronto a rinunciare a quanto sia incredibilmente facile distribuire una nuova versione in Excel: basta salvare una nuova cartella di lavoro con il nome della nuova versione.

Queste cartelle di lavoro hanno qualcosa come 30 utenti di diversi dipartimenti / paesi. Ho una nuova versione almeno una volta alla settimana e spesso 2/3 nello stesso giorno. La distribuzione deve essere pratica.

Cercando di combinare il meglio di entrambi i mondi mi è venuta la seguente domanda:

link

Tuttavia ciò che mi ha dato speranza è stato il 'Way 2' qui:

link

che mi ha portato qui:

link

Mentre scendo in questa tana del coniglio ho pensato che non sarebbe stato saggio chiedere in giro ad altri che hanno provato qualcosa di simile. Quello che temo è che questa sarà una di queste situazioni con così tante complicazioni extra che, anche dopo la curva di apprendimento iniziale, i costi supereranno i benefici.

Qualche parola sui rischi che sto prendendo cercando di trovare un approccio molto pratico e pratico con build-in-python-use-it-in-VBA?

L'utente interagisce pesantemente con la cartella di lavoro tramite eventi del foglio di lavoro (come fare clic su questi dati per visualizzare i dettagli). Questo sostanzialmente trasforma la cartella di lavoro in un ibrido di report e applicazione. Hanno anche bisogno di cose come cambiare il formato della cella e stampare la formula in una cella. Spesso un pivot verrà messo sopra i dati e l'utente giocherà con esso. Tutto questo dà l'impressione che avrò sempre bisogno di un layer VBA che chiami gli oggetti python.

    
posta BuckTurgidson 29.08.2016 - 02:18
fonte

2 risposte

3

Se è più importante usare Python come linguaggio, e non perché hai bisogno dello stack completo di moduli disponibili per CPython, forse una combinazione di Excel-DNA e IronPython potrebbero essere un'opzione per te.

Excel-DNA ti consentirà di sviluppare componenti aggiuntivi Excel utilizzando qualsiasi linguaggio .NET, che non richiede alcuna registrazione o installazione sul computer di destinazione. L'unico prerequisito è la specifica versione di .NET framework installata lì, che è in genere il caso della maggior parte dei moderni sistemi Windows. Inoltre, Excel-DNA include uno strumento di imballaggio per combinare tutti i file e le DLL necessari per un singolo file. Il risultato sarà un file XLL che può essere facilmente distribuito come file macro VBA XLSM Excel.

IronPython, come forse saprai, è un'implementazione .NET di Python, ti consentirà di produrre assembly .NET scritti in Python. Finora, ho usato il framework Excel-DNA solo con VB.NET e C #, non con IronPython, ma in linea di principio quando si associa un assembly .NET a Excel-DNA, quest'ultimo non sarà a conoscenza in quale lingua l'origine degli assiemi il codice è stato scritto I documenti IronPython forniscono alcuni suggerimenti su come utilizzarlo per creare assiemi che possono essere caricati da altri assembly .NET come il framework Excel-DNA, tuttavia, potrebbero esserci alcuni ostacoli da aggirare. Devi provarlo da solo. Raccomanderei, comunque, di iniziare con l'addin VB.NET prima di passare a Python.

    
risposta data 29.08.2016 - 13:30
fonte
0

Puoi tenerlo libero con gli script Python e chiamarli con quello che chiamo una classe gateway. Il cosiddetto gateway perché apre il ricco mondo dell'ecosistema Python allo sviluppatore VBA Excel link

Infatti, sul mio blog giugno 2018 è il mese di Python in cui mostro le funzionalità di Python e le metto a disposizione per Sviluppatori di VBA di Excel per espandere i propri orizzonti.

Riproduco il codice my dal mio articolo qui un codice che dà agli sviluppatori VBA l'accesso alla classe CubicSpline di Python (come esempio di una caratteristica di Python che un dev VBA potrebbe usare invece di codificarne una propria).

import numpy as np
from scipy.interpolate import CubicSpline

class PythonCubicSpline(Object):

    _reg_clsid_ = "{F48006B8-42B5-4D89-8D3C-C3C3E5E24C8D}"
    _reg_progid_= 'SciPyInVBA.PythonCubicSpline'
    _public_methods_ = ['Initialize','Interpolate']

    def Initialize(self, x1, y1):
        # calculate natural cubic spline polynomials
        x = np.Array(x1)
        y = np.Array(y1)

        self.baseCubicSpline = CubicSpline(x,y,bc_type='natural')
        return str(self.baseCubicSpline)

    def interpolate(self, x):
        return self.baseCubicSpline(x).tolist()

if __name__=='__main__':
    Print ("Registering COM server...")
    Import win32com.server.register
    win32com.server.register.UseCommandLine (PythonCubicSpline)

e alcuni che chiamano il codice Excel

Option Explicit

Sub TestPythonCubicSpline()

    Dim cubSpline As Object
    Set cubSpline = CreateObject("SciPyInVBA.PythonCubicSpline")

    Call cubSpline.Initialize(Array(0, 1, 2, 3, 4, 5), Array(12, 14, 22, 39, 58, 77))

    Debug.Print cubSpline.Interpolate(1.25) '* passing single,  outputs 15.203125

    Debug.Print Join(cubSpline.Interpolate(Array(1.25, 1.5)), ";") '# passing an array, outputs 15.203125;16.875

End Sub
    
risposta data 11.06.2018 - 22:39
fonte

Leggi altre domande sui tag