54 messaggi dal 10 aprile 2017
Ciao a Tutti Voi...
vedo di essere breve e chiara
allora
visual studio VB scrivo il codice per una DLL e fin qui nessun problema
la DLL servirà ad excel (con l'iteroperabilità com) e fin qui va bene
definisco lato VS una Public Structure
definisco lato excel una Public Type
[certamente ho delle carenze di conoscenza che ho cercato di colmare prima di scrivere qui...uhm...sto diventando vecchia non ho trovato esempi...uffa]
come faccio a fare una call (lato excel) ad una sub (lato dll) affinché possa passargli come parametro l'intera struttura?
va da se che la call ad una sub con passaggio di parametri ovviamente funziona benissimo ma se i campi sono molti mi sarebbe molto comoda una cosa del genere
ringrazio anticipatamente
buona domenica
liliana
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Liliana,

come faccio a fare una call (lato excel) ad una sub (lato dll) affinché possa passargli come parametro l'intera struttura?


Prova semplicemente a dichiarare una variabile con il tipo della struttura, e poi a valorizzare i suoi campi.
Dim struttura As MiaStruttura
struttura.Campo1 = "Valore1"
struttura.Campo2 = "Valore2"


A questo punto ti crei un'istanza della classe e invochi la sua Sub passando la struttura
Dim oggetto As MiaClasse
Set oggetto = New MiaClasse
oggetto.MiaSub(struttura)


ciao,
Moreno

P.S. Per completezza ecco l'esempio della struttura definita all'interno del progetto VB.NET.
Public Structure MiaStruttura
    Public Campo1 As String
    Public Campo2 As String
End Structure

Enjoy learning and just keep making
54 messaggi dal 10 aprile 2017
Ciao Moreno e soprattutto grazie per la risposta...
posto codice (spaccato del codice di produzione)



Namespace NS_PUBLICVAR
    Public Class CL_PUBLICVAR

        Public Structure MiaStruttura
            Public Campo1 As String
            Public Campo2 As String
        End Structure

    End Class

End Namespace
====================================================
la struttura sta in NS_PUBLICVAR.vb del progetto
====================================================
<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
Public Class ComClass1

#Region "GUID COM"
    ' Questi GUID forniscono l'identità COM per la classe 
    ' e le sue interfacce COM. Se vengono modificati, i client 
    ' esistenti non saranno più in grado di accedere alla classe.
    Public Const ClassId As String = "afc41bdc-3070-4081-a5ae-55e36e7c537c"
    Public Const InterfaceId As String = "31192733-52fe-415a-a639-cb98ee966b2b"
    Public Const EventsId As String = "06d723ed-491a-4d2a-958e-13adf08298e0"
#End Region

    ' È possibile creare classi COM solo se dispongono di una classe Public Sub New() 
    ' senza parametri. In caso contrario, la classe non può essere 
    ' registrata nel registro COM e non può essere creata 
    ' con CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub

    Public Sub ASSEGNA(struttura As NS_PUBLICVAR.CL_PUBLICVAR.MiaStruttura)


        struttura.Campo1 = "Valore1"
        struttura.Campo2 = "Valore2"

    End Sub
End Class




====================================================
la classe sta in ComClass1.vb del progetto per fare una cosa veloce
====================================================

=========================================================
lato excel

Public Type MiaStruttura
     Campo1 As String
     Campo2 As String
End Type
Sub PROVA()

    Dim ricevo1 As String
    Dim ricevo2 As String

    Dim struttura As MiaStruttura
    Dim oggetto As MORENO.ComClass1
    Set oggetto = New MORENO.ComClass1
    
    struttura.Campo1 = "pippo"
    struttura.Campo2 = "pluto"
    
    
    Call oggetto.ASSEGNA(struttura)

    
    ricevo1 = struttura.Campo1
    ricevo2 = struttura.Campo2
    
    
End Sub


non sono capace d'inserire qui una immagine cmq mi risponde il compilatore
"Variable uses an Automation type not supported in Visual Basic"
premendo il punto di domanda per l'help
==========================================
Variable uses a type not supported in Visual Basic (Error 458)

Not every variable that appears in a type library or object library can be used by every programming language. This error has the following cause and solution:


You tried to use a variable defined in a type library or object library that has a data type that isn't supported by Visual Basic.
You can't use a variable of a type not recognized by Visual Basic in a Visual Basic program.


For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh).
==========================================

prima di postare qui ho fatto qualche prova
le dichiarazioni sono giuste
se faccio la call senza par sia da una parte sia dall'altra...ovviamente non fa nulla ma funziona

anche a seguire l'help non trovo la soluzione
bho...struttura da una parte e dall'altra in mezzo ci sta il COM e non si riesce?
bho...magari sbaglio io....
54 messaggi dal 10 aprile 2017
la conoscenza fa la differenza (dicono)
in effetti nella sterminata documentazione si trova
partendo da qui a seguire ovviamente tutto ciò lato VS
https://docs.microsoft.com/it-it/dotnet/framework/interop/passing-structures

lato vb excel (penso) che ci siano delle limitazioni
chissà perché mi son interstardita...bha
sarà la menopausa

11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, bene, quindi hai risolto il problema definitivamente?

Enjoy learning and just keep making
54 messaggi dal 10 aprile 2017
Gentilissimo Moreno...
per chiudere il topic diciamo di si...
per rispondere alla tua domanda...la risposta è NO nel senso che non ho risolto...
diciamo che sto studiando il modo di fare meglio
ora sono in alto mare anche perché mio malgrado il C non lo conosco così a fondo da capire gli esempi (uffa)
per questo motivo mi son rivolto a Voi che avete mille anni luce d'esperienza in più rispetto a me...
semmai per chi ne avesse voglia e soprattutto tempo magari c'è chi sa la soluzione più o meno immediata
grz
ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Liliana,
non ti preoccupare, se ne verrà a capo. Non c'è bisogno di usare C ma puoi cavartela con VB.NET. L'esempio che ti ho proposto stamattina l'ho messo in piedi senza particolari difficoltà quindi sono sicuro che funzionerà anche a te.

Ecco i passi:
  • Da Visual Studio, crea un nuovo progetto Class Library (VB.NET). Fai esperienza con questo, poi potrai applicare quello che hai imparato al progetto reale.
  • All'interno di questo nuovo progetto troverai un file Class1.vb. Mettici dentro questo codice.
    Public Class Class1
      Public Function Somma(valori As Addendi) As Integer
        Return valori.Addendo1 + valori.Addendo2
      End Function
    End Class
    
  • Aggiungi un nuovo file Addendi.vb al progetto. Dentro ci metti questo codice per definire la struttura Addedi
    Public Structure Addendi
        Public Addendo1 As Integer
        Public Addendo2 As Integer
    End Structure
    
  • Adesso vai nelle proprietà del progetto (menu Progetto -> Proprietà ...). Lì, nella sezione Compilazione, scrolla fino in fondo e metti la spunta su "Registra per interoperabilità COM". Poi vai nella scheda "Applicazione", clicca il bottone "Informazioni sull'assembly" e assicurati che ci sia la spunta su "Rendi assembly visibile a COM".
  • Riavvia Visual Studio con privilegi di amministrazione e poi compila l'applicazione in modalità Release.
  • Vai nella cartella bin/Release e copia il file NomeTuoProgetto.tlb. Poi incollalo nella directory C:\Windows\System32
  • Apri Excel e crea una nuova cartella di lavoro vuota. Vai nell'editor di codice Visual Basic e clicca il menu Strumenti -> Riferimenti. Poi trova il nome del tuo progetto e mettici la spunta e clicca OK.
  • Sempre nell'editor di codice Visual Basic fai doppioclick su "Foglio1" che trovi nel menu ad albero a sinistra e ti si aprirà una finestra in cui incolli esattamente questo codice.
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim valori As Addendi
        valori.Addendo1 = 2
        valori.Addendo2 = 7
        
        Dim oggetto As Class1
        Set oggetto = New Class1
        Dim risultato As Integer
        risultato = oggetto.Somma(valori)
        MsgBox (risultato)
    End Sub
    

    E salva. Ti si aprirà la finestra di dialogo di salvataggio: sul tipo scegli "File excel con attivazione macro".
  • Torna nel foglio excel e trascina sulle celle per selezionarle: apparirà un messaggio che ti mostra il risultato della somma. Questo dimostra che sei riuscita a passare una struttura al metodo Somma di Class1.
  • Fai la stessa cosa nel tuo progetto reale. Credo che prima non ti stesse funzionando forse perché avevi annidato la struttura dentro la classe, o perché avevi ridefinito la struttura anche nell'editor di codice Visual Basic.


ciao,
Moreno
Modificato da BrightSoul il 18 febbraio 2019 20:37 -

Enjoy learning and just keep making
54 messaggi dal 10 aprile 2017
WOW...
Grazieeeeeeeeeeeee Moreno...
sei un mito...
domani mattina seguirò passo passo le precisissime indicazioni faccio un progettino di prova da replicare nell'ambiente di sviluppo...
ti aggiorno...
=====================================
volevo farlo domani mattina invece l'ho fatto subito
FUUUUUUUUUUUUUUUUUUNNNNNNNNNNNZIONA!!!
YUUUUUUUUUPPPYYY
grazie mille
=====================================
mho...però...sempre quando hai voglia e soprattutto tempo mi spieghi...(per favore ovviamente)
tutti i passaggi che mi hai descritto li faccio nel progetto che sto sviluppando
quello che mi mancava è il passaggio della compilazione a release e la copy in System32
uhm...domanda...se lascio dbg non funzionerebbe?...provo...
domani provo a complicare un po' la cosa perché nella struttura ci stanno delle tabelle / matrici dinamiche e ti faccio sapere
ti auguro splendida serata
ciao

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.