54 messaggi dal 10 aprile 2017
Buongiorno Moreno,
ciao e buona giornata

prima di tutto ancora grazie per il tempo a me dedicato di cui non vorrei mai abusare quindi tranki non mi aspetto mai una risposta immediata prima di me ci son altre cose più interessanti
cmq sia
faccio (se mi posso permettere il punto)
l'esempio mi è di aiuto per la modalità in cui la struttura è lato VS ma in realtà la cosa è diversa nel senso
[piano piano sto mettendo ordine a sw che non ho scritto io ma da chi c'era prima di me]
tutto in excel / VB quindi ti lascio immaginare il casino fogli / formule / codice / etc
l'azienda non ha le risorse economiche per aprire un progetto di rifacimento globale
sono io che per non so quale motivo mi sono messa in testa di fare questa cosa
cioè ottimizzare / rendere più veloce il codice etc con il "minimo sforzo" o per meglio dire portare in dll (ritornando a bomba) tutte quelle parti di programma (excel) che son possibili da far migrare
diciamo che allo stato attuale delle "cose" è excel che comanda e non il contrario
e' excel che ha le strutture perché è solo lui che le calcola etc
per esempio di codice è solo un pezzettino
Type ABBRICTYPE
    TABDATEPROGR() As Variant
    ABBINATIRICORSIVI As Integer
End Type
Type TABBBINAMENTITYPE
   ABBINATI(10) As ABBRICTYPE
End Type
Public TABBBINAMENTI(256) As TABBBINAMENTITYPE

Sub MAIN()

Dim LastRow As Long
Dim myRange As String
Dim rng As Range
Dim wbk As Workbook

    GETBOOK = ActiveWorkbook.Name
    GETBOOKNOMEPRG = ActiveWorkbook.Name
    
    With ActiveSheet
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
    End With
    
    myRange = "A1:B" & LastRow
    Set wbk = Excel.Application.Workbooks(GETBOOKNOMEPRG)
    Set rng = wbk.Worksheets("SOLODATE").Range(myRange)
    TABBBINAMENTI(20).ABBINATI(1).TABDATEPROGR = rng
    
End Sub

dopo di questo una vagonata di codice che per taluni prg l'elaborazione dura ORE
sono "bravina" nel mio lavoro ma ammetto di avere delle profonde lacune in tutto ciò che sta in mezzo
una struttura del genere da excel alla dll come vine passata? nella mia ignoranza la passo come argomento (punto) ed invece no! non è proprio così immediata la cosa perché (correggimi se sbaglio) lato VS una tab o mat dinamica come se la gestisce se prima non alloca lo spazio?
dato che poi ci si mette anche il mio carattere che non demorde mi perdo nei meandri della doc di microsoft e vado a pensare chissà quale soluzione per uscirne
semmai se e quando ne avrai voglia e soprattutto tempo come hai fatto un esempietto al contrario con una struttura simile alla mia
ti ringrazio in maniera infinita
buon lavoro
liliana
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, bene, almeno abbiamo fatto un passo avanti.


una struttura del genere da excel alla dll come vine passata?

La struttura deve necessariamente essere definita nella dll. Quindi devi rimuovere la sua definizione da Excel e metterla nella dll. Se la chiami allo stesso modo e definisci gli stessi campi, probabilmente non dovrai fare troppe modifiche al codice che si trova su Excel.

Infatti, guarda questa riga dell'esempio che ti avevo postato:
Dim valori As Addendi


La struttura Addendi si trova definita all'interno della dll eppure è stato possibile usarla proprio come se fosse stata definita all'interno del file excel.
Quindi, non dovresti avere grossi problemi a spostare la definizione delle strutture nella dll.
Dovrai ovviamente scegliere tipi compatibili. Per esempio "Variant" non c'è in VB.NET quindi dovrai usare "Object". *Dovrebbe* funzionare lo stesso...

ciao,
Moreno

Enjoy learning and just keep making
54 messaggi dal 10 aprile 2017
Buon Pomeriggio Moreno..
scherzi? mi hai aiutata tantissimo...grazie!
Soprattutto perché mi hai fatto capire...
mi hai fatto fare il "passo" che non riuscivo a fare
nel senso
tutte le strutture da excel nella DLL
chissà perché mi ostinavo a vederle doppie...bha...
per i tipi di dati...uhm...un modo lo troverò certamente
diciamo che possiamo chiudere questo argomento
grazie di nuovo
ciao
54 messaggi dal 10 aprile 2017
Ciao Moreno,
scusami
se hai ancora il progettino sia vb che excel ed hai un pochino di tempo
per favore provi a concatenare i due valori
ho trasformato Addendo1 e Addendo2 in string nella struttura
ho modificato nella funzione anziché il + il &
lato excel non passo numeri ma "valori" tra apici
all'atto della compilazione su Dim valori As Addendi
s'inchioda dicendo "Variable uses an Automation type not supported in Visual Basic
....................
le string lato exel sono diverse da VS?
ci sta che i variant non ci sono
ma qui si parla di String
come ne esco?
grazie anticipatamente
lily


Public Structure Addendi
    Public Addendo1 As String
    Public Addendo2 As String
End Structure


Public Class Class1
    Public Function Somma(valori As Addendi) As String
        Return valori.Addendo1 & valori.Addendo2
    End Function
End Class


lato excel
Dim a As String
a = "pippo "

Dim b As String
b = "pluto "

    Dim valori As Addendi
    valori.Addendo1 = a
    valori.Addendo2 = b
    
    Dim oggetto As Class1
    Set oggetto = New Class1
    Dim risultato As Integer
    risultato = oggetto.Somma(valori)
    MsgBox (risultato)
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
non sono molto esperto dell'interoperabilità COM quindi non sono sicuro del perché si stia verificando questo problema. Forse dipende dal fatto che una Struct è un value type mentre String è un reference type.

Comunque, se definisci Addendi come Class anziché come Struct, a quel punto funziona.
Nel progetto VB.NET:
Public Class Addendi
    Public Addendo1 As String
    Public Addendo2 As String
End Class


Mentre nel file Excel dovrai costruire così Addendi (nota il Set).
Dim valori As Addendi
Set valori = New Addendi
valori.Addendo1 = a
valori.Addendo2 = b


ciao,
Moreno

Enjoy learning and just keep making
54 messaggi dal 10 aprile 2017
Gentilissimo Moreno,
stavo appunto leggendo su stackoverflow una discussione sullo stesso problema
ognuno presentava sua personale soluzione in C# (di certo non è alla mia portata)
SI! funziona
la struttura definita come classe
sia excel sia VB accedono ai dati e si scambiano valori
Public Class INDAEXCEL

    Public ID As Integer
    Public Name As String
    Public Address As String
    Public Phone As Long
    Public HireDate As Date
    Public TABELLA(10, 20) As String

End Class




    Public Sub PROVA(valoridaexcel As INDAEXCEL)

        valoridaexcel.ID = 10
        valoridaexcel.TABELLA(10, 20) = "papero"
        valoridaexcel.Name = "2222222222222222222222"
        valoridaexcel.Address = "444444444444444444444"
        valoridaexcel.Address = valoridaexcel.Address & valoridaexcel.Name
    End Sub


lato excel
Dim A As Variant


Dim valori As INDAEXCEL
Set valori = New INDAEXCEL
    valori.ID = 50
    valori.Name = "1111111111111"
    valori.Address = "222222222"
    valori.Phone = 11
    valori.HireDate = Now

           Dim oggetto As Class1
       Set oggetto = New Class1

 Call oggetto.PROVA(valori)
 A = valori.ID
 A = valori.Address


A = valori.Address
contiene l'unione dei due campi

stavo appunto facendo delle prove
l'ora è tarda e non sono lucidissima
non riesco a leggere i dati della matrice uhm...domani...
ci sarà da divertirsi a modificare tutto il codice

stavo pensando ad alternative (per le strutture super complesse)
grazie mille
buona notte
lily

PS
cmq strano che microsoft non abbia una soluzione in tal senso
qualunque esso sia il problema
secondo me è una limitazione
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Liliana,


non riesco a leggere i dati della matrice uhm...

Ho provato e sembra che le matrici debbano essere dichiarate di tipo Object, lato VB.NET. Ad esempio:
Public Class Addendi
    Public Addendo1() As Object
End Class


Mentre lato Excel valorizzi la matrice come segue:
Dim valori As Addendi
Set valori = New Addendi
valori.Addendo1 = Array("Ciao", "Come va?")
    
Dim oggetto As Class1
Set oggetto = New Class1
Dim risultato As String
risultato = oggetto.Somma(valori)
MsgBox (risultato)


Ora, dato che si tratta di una matrice di Object, il metodo Somma dovrà riconvertire i vari valori a String, per esempio usando il metodo ToString(), come si vede qui:
Public Class Class1
    Public Function Somma(valori As Addendi) As String
        Dim sb As New StringBuilder()
        For Each valore In valori.Addendo1
            If Not valore Is Nothing Then
                sb.Append(valore.ToString())
            End If
        Next
        Return sb.ToString
    End Function
End Class



stavo pensando ad alternative (per le strutture super complesse)

Non so, ma il codice VBA di questo Excel risponde alle interazioni degli utenti oppure l'utente deve solo aprire il file Excel e aspettare che il codice faccia i suoi calcoli? Perché, in quest'ultimo caso, potresti crearti un'applicazione console e accedere al file in maniera programmatica usando una libreria tipo NPOI o DocumentFormat.OpenXml. Però dovrai riscrivere TUTTA la logica su VB.NET a quel punto.

I tuoi utenti che ne pensano del fatto che stai riscrivendo parte della logica? Chiedi la loro approvazione, altrimenti un giorno potrebbero farti pesare il fatto che hai dedicato del tempo a una cosa che non porta valore.

ciao,
Moreno

Enjoy learning and just keep making
54 messaggi dal 10 aprile 2017
Ciao Moreno,
mi son beccata l'influenza...per questo ti leggo solo ora...
grazie per avermi scritto...

allora ti spiego bene il mio predecessore ha scritto una serie di "programmi" in excel vb
sono una settantina più i miei che però ho sviluppato in appconsole / webservice
i prg sono la maggior parte ad uso e consumo nostro interno non c'è ne vendita ne altro o meglio ce ne sono alcuni...cosa facciamo? lavoriamo lastre di ferro pesanti quindi PLC / magazzini verticali / laser di taglio etc etc / piegatura etc etc / schedulatori / etc in più c'è una divisione che segue il progetto di vendere la nostra esperienza come consulenza (leggasi divisione = liliana) quindi sono molto spesso in giro italia / europa a seguire le installazioni di nostre consociate
i prg lato utente sono gestiti da touch screen a bordo macchina
questo per rispondere al "pericolo" che avanzavi
------------
il mio predecessore era meglio se cambiava spacciatore :-)) negli excel dove non sapeva programmare ci ha messo dentro formule quindi è un vero schifo di una lentezza assurda ti faccio un esempio doveva caricare un file di sei mila articoli si è messo li con un ciclo for [ho preso il file me lo sono messa in una tabella di un db e carico lo stesso file in 0,03 secondi il lavoraccio che sto facendo è entro uno ad uno in questi file excel cerco di capire il giro che fa...lo smembro il codice che sego lo porto in dll e questo il primo step che mi sono prefissata perché quello che mi "spaventa" è l'interpretazione delle formule [mi devo mettere lì con calma una ad una capire quali sono i dati che prende e trasformare la formula in codice]
------------
quindi c'è un scambio bilaterale tra strutture vbexcel e vbvs che ho risolto in parte facendo / simulando get-put (se uno fa put l'altro fa get e viceversa)
per le strutture super complesse e annidate ho deciso per ora di passarle su temp db e con store procedure si passano i dati...in attesa di soluzioni migliorative...come accennavo non sono un guru ho molte lacune che per mia natura (curiosa) cerco di colmare
==============================================================
in realtà sono qui su questo bellissimo forum perché volevo aprire una domanda...
già che ci sono provo a scriverla qui semmai mi dirai se è potrebbe essere d'interesse comune
vorrei realizzare una applicazione "simile" a mfc perché ho scritto simile? perché quella generata da vs è in C ed io purtroppo il c non lo conosco
grazie mille della tua risposta per l'object
e per essere arrivato fino a qui a leggere
ciao
lily

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.