Scrivere una dll per richiamarla da VBA per excel

giovedì 23 ottobre 2008 - 01.15

skeggione Profilo | Newbie

Ciao a tutti,

spero di non essere nel posto sbagliato...nel caso fatemelo presente.

Sto scrivendo funzioni in DEV C++ e poi le scarico in DLL
Da excel quindi aggancio la DLL e utilizzo le funzioni create in precenza.
Lo scopo è quello di avere calcoli più performanti e veloci.

Sono riuscito a creare le ddl e ad agganciarle (se volete posto anche il codice) ma mi manca
un elemento essenziale...come scrivere in C la funzione in maniera tale che il parametro
di input sia un "vettore" (in excel questo sarebbe poi un range selezionato)

Spero di essere stato chiaro... grazie in anticipo
Vittorio

aiedail92 Profilo | Expert

Ciao

Un vettore in C\C++ lo puoi dichiarare o come puntatore oppure con le parentesi quadre di matrice.

Quindi la funzione potresti scriverla così:

int Function(int *vettore);

Oppure così:

int Function(int vettore[]);

Luca

skeggione Profilo | Newbie

Grazie mille,

compila perfettamente sia in un modo che nell'altro...purtroppo mi rimane ancora un pezzo di problema :
non riesco comunque a far funzionare la dll in excel !!!

Ad esempio la funzione scritta in C++ si chiama "double somma_elementi_vettore(double vettore[])" ...
io in excel scrivo "=somma_elementi_vettore(A1:A3)" e mi ritorna #VALUE

Continuo a smanettare un po'... chissà!

Grazie di nuovo
Ciao

aiedail92 Profilo | Expert

Quello che ti ho dato io era solo uno "start", adesso devi modificare la funzione come serve a te, quindi per calcolare la somma di tutti gli elementi dovrai passare come parametro anche il numero di elementi. La funzione potrebbe diventare:

double Somma(int lunghezza, double *vettore) { double sum = 0; for(int i = 0; i < lunghezza; i++) { sum += vettore[i]; } return sum; }

Inoltre non puoi passare come argomento direttamente il Range, devi prima ottenere l'array dei suoi valori, ad esempio così:

Dim arr As Variant arr = Range("A1:A3").Value

In questo modo arr contiene una matrice bidimensionale in cui la prima dimensione rappresenta la colonna (A) e la seconda la riga (1-3)

Luca

skeggione Profilo | Newbie

Grazie ... penso di aver capito la ratio ... adesso non vorrei approfittarne ... ho compreso
che è più complesso del previsto...le ho provate tutte ma non riesco ancora a farlo girare!
Provo a semplificare i passaggi:
Dopo aver creato la ddl secondo le tue indicazioni nel VBA di Excel dichiaro la DLL
Declare Function Somma Lib "DLL_prova.dll" (ByVal prm1 As Integer, ByVal prm2 As Double) As Double
quindi scrivo una funzione VBA
Function Somma_VBA(lunghezza as Integer, vettore as Variant) as Double
Dim arr()
arr = vettore
Somma_VBA = Somma(lunghezza, arr)
End Function

Boh! Non funziona! Entra nella funzione "Somma" e non ne esce più!
Forse sbaglio a scrivere la DLL? Grazie comunque per tutti i consigli fin'ora dati

Ciao
Vittorio
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5