Vettore come output

di il
22 risposte

Vettore come output

Vorrei creare una funzione su Excel che preso un vettore (x1,...xn) di dimensioni 1,n mi restituisca il vettore di dimensioni 1,n^2 (x1*x1,x1*x2,...x1*xn,x2*x1,...x2*xn,...xn*xn)...

ma non riesco a creare funzioni che mi ritornino dei vettori ((

Grazie mille per ogni aiuto

22 Risposte

  • Re: Vettore come output

    Ciao.. per fare questo devi usare le macro di excell.. lo conosci un po' di visual basic 6??

    i vettori si definiscono con questa sintassi:

    dim v(1 to n) as integer (nel caso di vettori che contengono numeri interi)

    quindi il vettore che dovrà ritornare il risultato sarà definito come:

    dim vRit(1 to n^2) as integer

    per riempire il vettore di ritorno ti basta fare 2 for annidati che eseguono le operazioni da te indicate:

    dim i as integer
    dim j as integer
    dim cont as integer

    cont = 0

    for i = 1 to n
    for j = 1 to n
    cont = cont + 1
    vRit(cont) = v(i) * v(j)
    next
    next

    e così in vRit avrai il risultato...

    Saluti...
  • Re: Vettore come output

    Scusa mi potresti dire proprio come scrivere la Function?
    Io non ho problemi a fare i cicli for etc... ho proprio problemi nel rapporto tra VBA e Excel... e la sintassi da usare...

    Io vorrei semplicemente che se ho le celle A1:A3 che mi contengono dei numeri se scrivo in B1 \"=funzione(A1:A3)\" in B1:B9 ho i numeri che dicevamo... ma non riesco a dire alla funzione di \"scrivere un vettore\", di ritornarmi un vettore...
  • Re: Vettore come output

    Ciao.. la cosa che devi capire che le macro sono una cosa separata da excell.. non puoi scrivere quello che hai detto tu.. ma devi utilizzare un pulsante di comando che richiama la macro.. per prendere i dati in input devi usare il comando ad es.

    dim valore as integer

    valore = Range(\"cella\").value

    e per scrivere:

    range(\"cella\").value = valore

    per vedere come si associa una macro in excell vai a vedere la discussione \"Lunghezza vettore da excell\" dove ho già spiegato questo problema...

    dopo se hai qualcosa che nn ti è chiaro basta chiedermelo...

    Saluti...
  • Re: Vettore come output

    Sto cominciando a capire forse...
    quindi mettiamo che io metta il mio vettore di base (x1... xn)
    sempre in A1:An e voglia il mio vettore allungato in B1:Bm con m=n*n

    gli devo dire

    Sub nome macro
    vettore=range(\"A1:AN\").Value
    vettorellungato=allunga(vettore)
    range(\"B1:BM\").Value=vettoreallungato
    End Sub

    Function Allunga(vettore)
    fa i cicli...
    End Function

    è corretto?
  • Re: Vettore come output

    Anche ora però non riesco a far ritornare alla funzione allunga un vettore...
    sembra non capire che io voglio che sia restituito un vettore
    Come deve essere intestata?

    Altra cosa. Nella Macro se gli dico
    vettore1 = Range(\"A1:A3\").Value
    non mi dà errore

    ma se prima metto
    dim vettore1() as integer
    mi dà errore!!!
    eppure nelle caselle A1,A3 ci sono solo interi!!!!
  • Re: Vettore come output

    La funzione di cui avevo bisogno si può realizzare così (nel caso in cui n=3)

    Function Allunga(Vettore) As Variant
    Dim temp(9, 1)
    Dim i As Integer
    Dim j As Integer
    Dim cont As Integer
    cont = 0
    For i = 1 To 3
    For j = 1 To 3
    cont = cont + 1
    temp(cont, 1) = Vettore(i) * Vettore(j)
    Next
    Next
    Allunga = temp
    End Function

    e fa proprio ciò che volevo ... cioè mi metto nella casella in cui la chiamo il vettorone
    Ora rimane il problema della dimensione... cioè di come adattarlo per farlo funzionare con ogni dimensione
  • Re: Vettore come output

    Ciao.. basta che sostituisci i valori costanti con una variabile presa in input..
    ad esempio fai un contatore che conta il numero delle caselle:

    es.

    dim contCaselle as integer

    contCaselle = \"funzione che conta le caselle scritta a parte\"

    dim temp(1 to contCaselle * 2)

    ah.. un appunto: quello che hai scritto tu su temp non è proprio corretto.. infatti la dichiarazione temp(9, 1) è la definizione di una matrice!!.. un vettore si dichiara invece con la forma dim temp(1 to 9)..

    per assegnare un valore al vettore:
    temp(indice) = valore
    per leggere dal vettore
    valore = temp(indice)

    Saluti...
  • Re: Vettore come output

    Ciao ancora
    purtroppo se cambio il temp da matrice a vettore poi non mi funziona più... e in tutte le caselle mi restituisce sempre il valore x1*x1...

    e se voglio inizializzare la matric e/o il vettore con un parametro n preso come input mi dice \"errore: necessaria espressione costante\"
  • Re: Vettore come output

    Ciao.. ok.. allora devi utilizzare la redim preserve.. tanto vale che ti scrivo tutto il codice così vedi anke come si definisce il vettore nel modo che ti avevo detto il post prima:

    codice con vettore fisso (provalo e vedi se funziona)

    Function Allunga(Vettore) As Variant
    Dim temp(1 to 9) as integer
    Dim i As Integer
    Dim j As Integer
    Dim cont As Integer
    cont = 0
    For i = 1 To 3
    For j = 1 To 3
    cont = cont + 1
    temp(cont) = Vettore(i) * Vettore(j)
    Next
    Next
    Allunga = temp
    End Function

    codice con vettore variabile

    Function Allunga(Vettore) As Variant
    Dim temp() as integer
    Dim i As Integer
    Dim j As Integer
    Dim cont As Integer
    cont = 0
    For i = 1 To 3
    For j = 1 To 3
    cont = cont + 1
    redim preserve temp(1 to cont)
    temp(cont) = Vettore(i) * Vettore(j)
    Next
    Next
    Allunga = temp
    End Function

    l'istruzione redim preserve serve ad allungare il vettore mantenendo però i suoi elementi all'interno..

    fammi sapere se ti ha funzionato...

    Saluti...
  • Re: Vettore come output

    Purtroppo mi dà sempre lo stesso vizio che mi mette dappertutto x1*x1 con entrambe le funzioni...

    ma non si può inizializzare un vettore o un matrice con dimensione = n
    con n=espresione valutata precedentemente??
  • Re: Vettore come output

    Ciao.. ti da sempre x1 * x1 perchè è sbagliata l'inizializzazione del vettore nella function.. ecco come devi scrivere:

    Function Allunga(Vettore()) As Integer()

    così è definito sintatticamente meglio.. anke se la sintassi non me la ricordo tanto bene dovrebbe essere più o meno così..

    prova.. aspetto tue notizie..

    Saluti...
  • Re: Vettore come output

    Cambiando così l'intestazione mi dà proprio errore... mi restituisce #Valore!
  • Re: Vettore come output

    Vabbè.. visto che proprio non ti riesce ti scrivo tutto io.. uff..

    in generale dichiarazioni definisci il tuo vettore:

    dim v() as integer
    dim vRit() as integer

    poi definisci una funzione che legge i dati dalle celle di excell.. ad esempio quella che ti scrivo legge n celle della colonna A.. e calsola il risultato..

    private sub Calcola(n as Integer)
    dim i as integer
    dim j as integer
    dim cont as integer

    cont = 0
    redim v(1 to n)
    redim vRit(1 to n^2)

    'lettura dei dati dalle celle
    for i = 1 to n
    v(i) = cells(1, i).value
    next

    'elaborazione dei dati di v e risultati messi un vRit

    for i = 1 to n
    for j = 1 to n
    cont = cont + 1
    vRit(cont) = v(i) * v(j)
    next
    next

    'ora vRit contiene il risultato
    'ad esempio puoi stampare tutti i valori di vRit nella colonna b

    for i = 1 to n^2
    cells(2, i).value = vRit(i)
    next
    end sub

    questo è il codice giusto.. l'unica cosa che nn mi ricordo .. come già ti ho detto è l'istruzione cells dove non mi ricordo se il primo parametro da mettere è l'indice della riga e/o viceversa... provalo!!.. e fammi sapere se funziona.. o se nn va.. o se nn ti è chiaro qualche passaggio del codice...

    Saluti...
  • Re: Vettore come output

    Prima di tutto ti ringrazio per la sopportazione

    Per eseguire ciò che hai scritto l'ho messo così:

    Dim v() As Integer
    Dim vRit() As Integer

    Sub prova()
    Calcola (4)
    End Sub

    Function Calcola(n As Integer)
    Dim i As Integer
    Dim j As Integer
    Dim cont As Integer

    cont = 0
    ReDim v(1 To n)
    ReDim vRit(1 To n ^ 2)

    'lettura dei dati dalle celle
    For i = 1 To n
    v(i) = Cells(1, i).Value
    Next

    'elaborazione dei dati di v e risultati messi in vRit

    For i = 1 To n
    For j = 1 To n
    cont = cont + 1
    vRit(cont) = v(i) * v(j)
    Next
    Next

    'ora vRit contiene il risultato
    'ad esempio puoi stampare tutti i valori di vRit nella colonna b

    For i = 1 To n ^ 2
    Cells(2, i).Value = vRit(i)
    Next
    End Function

    E così effettivamente funziona tutto!!!
    Ora manca solo come importare \"n\" cioè io vorrei che lui riuscisse a leggere n come con un CONTA.VALORI di una certa colonna o di una certa riga.

    Grazie ancora!
Devi accedere o registrarti per scrivere nel forum
22 risposte