Stellar Blade Un'esclusiva PS5 che sta facendo discutere per l'eccessiva bellezza della protagonista. Vieni a parlarne su Award & Oscar!

Excel Forum Per condividere esperienze su Microsoft Excel

Sistemare un macro

  • Messaggi
  • OFFLINE
    L2018
    Post: 373
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Senior
    EXCEL 2016 - SPREAD32
    00 28/10/2022 15:04
    Buongiorno
    in una macro ho questo codice:
    --------------------------
    Dim A
    A = Array(3, 5, 1, 0, 4, 2)
    --------------------------
    Come faccio per trasformare l'espressione in una InputBox che mi dia la possibilità di inserire un numero qualsiasi di valori, da usare poi come Array ?
    Forse è il caso di spiegare meglio
    Vorrei una Inputbox, nella quale posso digitare dei valori, numerici, separati da virgola
    L'intera stringa, comprese le virgole, dovrebbe comparire in A2 (in una sola cella)
    Fatto questo, l'elenco dei valori deve essere considerato un Array, di nome A, sul quale la macro dovrà effettuare una certa elaborazione
    Grazie

    LEO
    [Modificato da L2018 28/10/2022 16:05]

    LEO
    https://t.me/LordBrum
  • OFFLINE
    dodo47
    Post: 3.355
    Registrato il: 06/04/2013
    Utente Master
    2010
    00 28/10/2022 16:09
    ciao
    usa la funzione split...
    se dalla inputBox rilevi per esempio: 1,3,2,4 puoi fare:
    a=inputBox.......
    b=split(a, ",")

    in b avrai l'array

    saluti
    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    L2018
    Post: 373
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Senior
    EXCEL 2016 - SPREAD32
    00 28/10/2022 16:32
    Domenico

    ti ringrazio, funziona, io avevo fatto un tentativo più complesso, e invece era semplice.

    Ora, però, come temevo, mi si crea un problema non chiaro per l'elaborazione dell'array, ma non so se posso postare o chiedo troppo

    LEO

    LEO
    https://t.me/LordBrum
  • OFFLINE
    dodo47
    Post: 3.356
    Registrato il: 06/04/2013
    Utente Master
    2010
    00 28/10/2022 17:10
    tu chiedi.......poi.....

    saluti





    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    L2018
    Post: 374
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Senior
    EXCEL 2016 - SPREAD32
    00 28/10/2022 19:11
    ci provo.

    nel foglio allegato c'è una macro che all'origine comprendeva l'espressione:
    A=Array("3,5,1,0,4,2")
    e funzionava.
    Ora, con la mia pretesa, per comodità, di usare una InputBox, si è scompaginato il calcolo
    Se nella InputBox io scrivo 3,5,1,0,4,2 il risultato è 456: sbagliato, DEVE essere 463 o 464 a seconda che l'algoritmo ragioni 0-based o 1-based
    Se però chiediamo 0,1,2,3,4,5 oppure 5,4,3,2,1,0 restituisce i risultati giusti, rispettivamente 1 e 720
    Se ne deduce che l'algoritmo è 1 based, ma allora con la prima stringa dovrebbe dare 464.
    in pratica l'algoritmo si è rovinato passando da Array() a InputBox.
    La colpa sarà senz'altro mia,ma ormai non mi ci raccapezzo
    Potreste risistemarlo gentilmente?
    Capisco che non è tanto un problema di Excel quanto di codice

    Grazie

    LEO
    [Modificato da L2018 28/10/2022 19:13]

    LEO
    https://t.me/LordBrum
  • OFFLINE
    dodo47
    Post: 3.357
    Registrato il: 06/04/2013
    Utente Master
    2010
    00 28/10/2022 19:34
    ciao
    non ci capisco nulla dell'algoritmo.

    Che significa (e come ci si arriva) quando dici che :

    3,5,1,0,4,2 il risultato è 456: sbagliato, DEVE essere 463 o 464 a seconda che l'algoritmo ...etc etc

    Intanto ti suggerisco di valorizzare meglio le dim, le tue sono tutte variant , inoltre evita questo tipo dio struttura:
    f = 1: For i = 2 To N - 1: f = f * i: Next

    chi legge per la prima volta ha difficoltà.....comunque è solo un suggerimento.

    Sottoponi anche la macro che funzionava con A=Array("3,5,1,0,4,2"), mi sembra alquanto strano che utilizzando lo Split di una InputBox si stravolga il tutto. In fin dei conti è uguale a: A=split(.....).
    Ti ricordo che l'array dello Split parte da = (zero), A(0) - A(1) - A(2) - etc etc

    Infine le macro che non interessano gli eventi (come la tua) vanno messe in moduli standard, non nei moduli dei fogli.

    Segui in debug che succede....


    Buon we




    [Modificato da dodo47 28/10/2022 19:42]
    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    L2018
    Post: 376
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Senior
    EXCEL 2016 - SPREAD32
    00 01/11/2022 11:28
    Buongiorno

    vorrei aggiornare il mio ultimo quesito

    se in A1 io scrivo: 2,3,4,5

    c'è un modo per fare accettare questa stringa, che suppongo testuale, da una macro in modo che essa venga trasformata in

    Array (2,3,4,5), cioè per es.: X=Array(2,3,4,5) ?

    dovrebbe funzionare come se io chiedessi nella macro l'Array di A1, ma dovrebbe risultare un Array numerico.

    Grazie

    LEO

    LEO
    https://t.me/LordBrum
  • OFFLINE
    dodo47
    Post: 3.358
    Registrato il: 06/04/2013
    Utente Master
    2010
    00 02/11/2022 10:39
    ciao Leo
    dopo lo Split, carica il suo risultato in un altro array utilizzando cInt:
    Dim strarray as Variant
    Dim intarray as Variant
    Dim x as Long
    
    strarray = Split(Range("A1").Value, ",")
    ReDim intarray(LBound(strarray) to UBound(strarray))
    For x = LBound(strarray) To UBound(strarray)
        intarray(x) = CInt(strarray(x))
    Next x


    In intarray() avrai i tuoi numeri

    saluti




    [Modificato da dodo47 02/11/2022 10:40]
    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    tanimon
    Post: 1.542
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 02/11/2022 12:43
    ciao a tutti,
    ciao Leo ed un saluto a Domenico [SM=g27811]

    ricostruire una macro implica la conoscenza dei processi che deve eseguire,
    cosa che è solo nella tua testa e perdonami,

    ma non ho voglia di "scervellarmi" a capire la logica delle elaborazioni che vuoi vengano eseguite.

    a parte gli ottimi suggerimenti di Domenico e per curiosità,
    nella macro del file da te postato #5

    visto che influisce sulla elaborazione seguente alla sua determinazione,

    quale dovrebbe essere l'esatto valore della variabile N?

    voglio dire, dovrebbe essere
    - il numero di indice dell'array?
    - o il valore dell'ultimo indice dell'array?

    ciao
    Frank







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    L2018
    Post: 377
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Senior
    EXCEL 2016 - SPREAD32
    00 02/11/2022 16:38
    ciao
    un saluto anche a Dodo e a Frank Tanimon
    un grosso contrattempo mi impedisce di rispondere sollecitamente
    spero di rispondere in serata

    LEO

    LEO
    https://t.me/LordBrum
  • OFFLINE
    L2018
    Post: 378
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Senior
    EXCEL 2016 - SPREAD32
    00 02/11/2022 22:24
    ciao Domenico
    cerco di rispondere ad ogni tua osservazione, ripartendo da prima del weekend, anche se ormai sei andato avanti.

    L'algoritmo di cui parlo si occupa di permutazioni.
    Le permutazioni possono essere sviluppate in almeno 2 modi diversi, con diverse varianti
    il modo più diffuso è quello lessicografico, cioè alfabetico.
    Quindi in questo caso, partendo da una qualsiasi permutazione, l'algoritmo trova il numero esatto della posizione in cui essa si trova nello sviluppo lessicografico.

    Con qualche algo, che però ormai ho manomesso e non ritrovo, ottengo, dalla permutazione 3,5,1,0,4,2, il valore di posizione 456:
    sbagliato, DEVE essere 463 o 464 a seconda che l'algoritmo sia in base 0 o in base 1.
    Tutto sta a vedere se l'errore dipende dal codice, cioè dall'uso dei contatori, o dall'uso impreciso della funzione SPLIT(), o da un improbabile lacuna del VBA.(ovvio che io non sono pratico di VBA).
    nelle poche variabili usate, almeno tre, F, X() e ORD, per il fatto che possono assumere valori astronomici, devono essere
    Variant, in fase di sviluppo non credo sia necessario mettere INTEGER o LONG, si puo' fare dopo.
    L'espressione: "f = 1: For i = 2 To N - 1: f = f * i: Next" è un modo rapido per calcolare il fattoriale di un numero, sta su una sola riga per mia comodità visiva, ed è ampiamente prevista dal VBA, potrei corredare il tutto con dei REM, questo sì

    A mio carico devo dire di non aver capito bene l'uso di Inputbox e di Split(), e relative opzioni, ma psicologicamente rifiuto la InputBox, e il MsgBox
    Mi sembra di aver capito che la macro dia risultati sballati se gli elementi sono numeri in forma di testo e/o se i numeri sono composti da più di 1 cifra
    ecco la macro, che funziona:
    -------------------
    MACRO
    Public Sub Giusta()
    Dim N, x(), i, f, k, ord, A
    A = Array(3, 5, 1, 0, 4, 2)
    N = UBound(A) + 1
    ReDim x(1 To N)
    For i = 1 To N: x(i) = A(i - 1): Next
    f = 1
    For i = 2 To N - 1: f = f * i: Next
    ord=0
    For i = 1 To N - 1
        ord = x(i) * f + ord
        f = f / (N - i)
        For k = i + 1 To N
            If x(k) > x(i) Then
                x(k) = x(k) - 1
            End If
        Next
    Next
    Range("A2").Value = ord
    End Sub
    
    -------
    Il codice funziona ma per variare la quantità degli elementi bisogna agire al suo interno, altri tentativi da me fatti per modificarla non hanno funzionato.

    Mi faresti un gran favore se inserissi tu al posto giusto il subcodice che mi hai fornito stamattina, io col mio nervoso di oggi non ci sono riuscito.

    =====================
    @tanimon ciao
    onestamente la mia domanda iniziale non l'ho posta bene, ma ora è:
    come prelevare da A1 un elenco di valori numerici separati da virgole,
    da dare in pasto all'elaborazione, invece di modificare manualmente l'espressione A = Array(3, 5, 1, 0, 4, 2)
    L'esatto valore della variabile N è semplicemente la quantità di valori numerici dell'espressione appena scritta, nel caso di qui sopra 6
    ---------------
    scusatemi per questo post logorroico, e ormai mi confondo fra copie e correzioni
    LEO
    [Modificato da L2018 02/11/2022 22:54]

    LEO
    https://t.me/LordBrum
  • OFFLINE
    dodo47
    Post: 3.359
    Registrato il: 06/04/2013
    Utente Master
    2010
    00 03/11/2022 12:04
    ciao
    per prendere da A1 i valori separati da ",", basta usare lo Split come anticipato.
    Poichè lo Split restituisce un array in formato testo, è sufficiente che quando fai riferimento, tramuti il dato in numero (cInt)

    A = Split(Range("A1"), ",")
    N = UBound(A) + 1
    ReDim x(1 To N)
    For i = 1 To N
    x(i) = CInt(A(i - 1))
    Next
    f = 1
    For i = 2 To N - 1
    f = f * i
    Next
    ord = 0
    For i = 1 To N - 1
    ord = x(i) * f + ord
    f = f / (N - i)
    For k = i + 1 To N
    If x(k) > x(i) Then
    x(k) = x(k) - 1
    End If
    Next
    Next
    Range("A2").Value = ord

    Ti suggerisco di applicare le Dim corrette....

    saluti
    [Modificato da dodo47 03/11/2022 12:54]
    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    L2018
    Post: 379
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Senior
    EXCEL 2016 - SPREAD32
    00 03/11/2022 14:03
    ciao Dodo
    la miseria, funziona benissimo, grazie infinite
    ma come potevo immaginare una soluzione così semplice ?
    in Basic ci sarei, e ci sono, arrivato, ma il VBA non ancora lo conosco affatto
    ho solo incollato il tuo codice alle variabili originali.
    Ottimo
    grazie ancora

    LEO

    LEO
    https://t.me/LordBrum
  • OFFLINE
    L2018
    Post: 380
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Senior
    EXCEL 2016 - SPREAD32
    00 03/11/2022 21:59
    Re:
    dodo47, 03/11/2022 12:04:


    Ti suggerisco di applicare le Dim corrette....



    scusami quali sono le Dim corrette ?
    riposto la macro così come mi è venuta

    MACRO
    Public Sub Giusta()
    Dim N, x(), i, f, k, ord, A
    
    A = Split(Range("A1"), ",")
    N = UBound(A) + 1
    ReDim x(1 To N)
    For i = 1 To N: x(i) = CInt(A(i - 1)): Next
    f = 1: For i = 2 To N - 1: f = f * i: Next
    ord = 1
    For i = 1 To N - 1
    ord = x(i) * f + ord
    f = f / (N - i)
    For k = i + 1 To N
    If x(k) > x(i) Then
    x(k) = x(k) - 1
    End If
    Next
    Next
    Range("A2").Value = ord
    Range("A1").Select
    End Sub


    a parte le variabili che appaiono tutte variant ma che non inficiano il calcolo, spero di non aver dimenticato niente.
    Ma in realtà si è creato un problema per me seccante, che magari è di algoritmo piuttosto che di Excel.
    Ho ringraziato subito per l'entusiasmo di una soluzione numerica, ma in serata ho notato che:
    se io ho la sequenza 0,1,2,3 oppure la sequenza 1,2,3,4 è innegabile che siano entrambe permutazioni di 4 elementi
    Purtroppo però la posizione di 0,1,2,31, giusto, ma posizione 1,2,3,418, sbagliato perchè dovrebbe dare 1, così come posizione di 3,2,1,024, giusto, ma posizione di 4,3,2,133, sbagliato, perchè le permutazioni di 4 elementi sono sempre 24.
    E siccome mi sento vagamente OT, mi rassegno e mi tengo il mio eseguibile in Basic che non sbaglia

    @Dodo grazie comunque per avermi suggerito l'istruzione Cint(), vedrò di cavarmela

    LEO

    LEO
    https://t.me/LordBrum