Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Sistemare un macro

Ultimo Aggiornamento: 03/11/2022 21:59
Post: 373
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
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
Post: 3.355
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
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
Post: 373
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
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
Post: 3.356
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
28/10/2022 17:10

tu chiedi.......poi.....

saluti





Domenico
Win 10 - Excel 2016
Post: 374
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
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
Post: 3.357
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
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
Post: 376
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
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
Post: 3.358
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
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
Post: 1.542
Registrato il: 27/06/2011
Utente Veteran
excel 2007
OFFLINE
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...
Post: 377
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
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
Post: 378
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
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
Post: 3.359
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
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
Post: 379
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
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
Post: 380
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
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
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
integrazione macro query (4 messaggi, agg.: 05/06/2019 17:50)
File fruibile 32bit e 64bit (3 messaggi, agg.: 04/03/2020 14:37)
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 21:26. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com