Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

sostiuire caratteri in una stringa

31 views
Skip to first unread message

Pino

unread,
Apr 21, 2022, 12:47:51 PM4/21/22
to
Buonasera,
con una macro devo poter scambiare in una stringa un carattere con un
altro sempre della stessa stringa.
La sequenza di caratteri, in pratica la successione dei 26 caratteri
alfabetici maiuscoli, seguita dai 26 minuscoli l’ho denominata
striscia.
Ora estraendo due numeri casuali, ad esempio 8 e 15 devo sostituire
l’ottavo carattere con il quindicesimo e il quindicesimo con l’ottavo.
E devo ripetere questo cambio molte volte in modo da avere alla fine
una sequenza di 52 caratteri assolutamente causale.
Ho provato con l’istruzione replace ma non sono riuscito a venirne a
capo.
Consigli?
Grazie

issdr

unread,
Apr 22, 2022, 2:21:18 AM4/22/22
to
Pino wrote:

> Ora estraendo due numeri casuali, ad esempio 8 e 15 devo sostituire
> l’ottavo carattere con il quindicesimo e il quindicesimo con
> l’ottavo. E devo ripetere questo cambio molte volte in modo da avere
> alla fine una sequenza di 52 caratteri assolutamente causale.
> Ho provato con l’istruzione replace ma non sono riuscito a venirne a
> capo.

quelli che indichi sono passaggi del tuo metodo? oppure ti occorre avere
i risultati intermedi?

se il primo caso fosse quello affermativo, valuta in alternativa questa
UDF che "mescola" la stringa in ingresso:

https://www.devhut.net/vba-shuffle-a-string/

ciao

Pino

unread,
Apr 22, 2022, 3:49:10 AM4/22/22
to
Scriveva issdr venerdì, 22/04/2022:
Grazie, purtroppo non ho capito molto di quella macro.
Ho già la stringa con i 52 caratteri e ho già ricavato i due numeri
causali, mettiamo 3 e 5, ma quello che non riesco a fare è scambiare i
due caratteri e cioè vorrei fare quello che in Basic si faceva con
l'istruzione swap.
Esempio data la stringa iniziale "ABCDEFGHIL" e che i due numeri
casuali siano 3 e 5 - la la stringa deve diventare ora "ABEDCFGHIL".
Questo è quello che non riescoa a fare.
Grazie

Zipper

unread,
Apr 22, 2022, 4:26:00 AM4/22/22
to
Pino ha detto questo venerdì :

> Grazie, purtroppo non ho capito molto di quella macro.
> Ho già la stringa con i 52 caratteri e ho già ricavato i due numeri causali,
> mettiamo 3 e 5, ma quello che non riesco a fare è scambiare i due caratteri e
> cioè vorrei fare quello che in Basic si faceva con l'istruzione swap.
> Esempio data la stringa iniziale "ABCDEFGHIL" e che i due numeri casuali
> siano 3 e 5 - la la stringa deve diventare ora "ABEDCFGHIL".
> Questo è quello che non riescoa a fare.
> Grazie

Nel mio piccolo penso che lo schema potrebbe essere:
PRIMOcaratt = mid(ABCDEFGHIL,3)
SECONDOcaratt = mid(ABCDEFGHIL,5)
TEMP = SECONDOcaratt
SECONDOcaratt = PRIMOcaratt
PRIMOcaratt = TEMP

issdr

unread,
Apr 22, 2022, 4:42:29 AM4/22/22
to
Pino wrote:

> cioè vorrei fare quello che in Basic si faceva con
> l'istruzione swap

manca anche a me. non posso cercarla con calma adesso, ma ricordo di
avere visto in rete una sub che lo fa, utilizzando gli xor

Zipper

unread,
Apr 22, 2022, 4:50:02 AM4/22/22
to
Sembra che issdr abbia detto :
x = x xor y
y = x xor y
x = x xor y

Pino

unread,
Apr 22, 2022, 6:05:53 AM4/22/22
to
issdr scriveva il 22/04/2022 :
Mi ero fissato nel voler sistemare tutto con replace ma senza successo
e alla fine ho risolto con Mid.
Grazie a tutti.

issdr

unread,
Apr 22, 2022, 7:59:48 AM4/22/22
to
la puoi condividere?

Pino

unread,
Apr 23, 2022, 3:22:37 AM4/23/22
to
Dopo dura riflessione, issdr ha scritto :
For j = 1 To 52
swap1 = Mid(stringa, j, 1)
n1 = Round(Rnd() * 51 + 1)
swap2 = Mid(stringa, n1, 1)
Mid(stringa, n1, 1) = swap1
Mid(stringa, j, 1) = swap2
Next j

issdr

unread,
Apr 23, 2022, 9:31:51 AM4/23/22
to
Pino wrote:

> For j = 1 To 52
> swap1 = Mid(stringa, j, 1)
> n1 = Round(Rnd() * 51 + 1)
> swap2 = Mid(stringa, n1, 1)
> Mid(stringa, n1, 1) = swap1
> Mid(stringa, j, 1) = swap2
> Next j

👍

oltre a questo sistema e alla sub/function con gli xor, c'è questo hack
simpatico dell'istruzione split (che nativamente restituisce tutta la
stringa in input se si passa un separatore vuoto):

,----[ https://www.mrexcel.com/board/threads/how-to-split-a-word-in-vba-if-it-has-no-delimiters.747266/post-3671860 ]
| Temp = StrConv("LUNCH", vbUnicode)
| Temp = Left(Temp, Len(Temp) - 1)
| aLetter = Split(Temp, Chr(0))
`----

Ammammata

unread,
Apr 25, 2022, 2:35:45 AM4/25/22
to
Il giorno Sat 23 Apr 2022 09:22:33a, *Pino* ha inviato su
microsoft.public.it.office.excel il messaggio
news:t409fo$104i$1...@gioia.aioe.org. Vediamo cosa ha scritto:

> For j = 1 To 52
>

devi mescolare un mazzo di carte per un poker?

--
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........
0 new messages