Da una stringa così:
X100Y50
come faccio a ricavare i valori di x e y singolarmente?
Da considerare che potrebbero esserci anche stringhe scritte così:
N100X100Y50
La lunghezza di una stringa o la complessità della composizione dei caratteri non è un problema.
Qui tu forse per "valori" vuoi intendere i numeri che seguono le due lettere " X " e " Y "....
allora, se le cifre che compongono i due valori sono note (nel senso che se già sai che la X ha un valore che non supera le centinaia, e la Y un valore che non supera le decine, potresti fare così:
Public Sub Button1_Click()
Dim a As Integer ' porremo il primo risultato nella variabile " a "
Dim b As Integer ' porremo il secondo risultato nella variabile " b "
a = Val(Mid$("X100Y50", 2, 3)) ' raccoglie "tre" caratteri cominciando dal 2° a sinistra.... cioè " 100 ", e converte il risultato in un numero
b = Val(Right$("X100Y50", 2)) ' raccoglie i primi "due" caratteri a destra della stringa.... cioè " 50 ", e converte il risultato in un numero
Print a, b ' va a mostrare in console i due risultati: 100 e 50
End
La conversione da Stringa ad Integer non è obbligatoria: dipende ovviamente dal successivo uso che devi fare di ciascun risultato.
Quella funzione Mid$ puoi leggerla, volendo, anche così: "Della stringa "X100Y50", partendo dal 2° carattere a sinistra, prendo 3 caratteri !" :)
Se invece i valori possono essere composti da qualunque numero di cifre, allora il discorso cambia !
Provo ad esporre un metodo di soluzione fra altri possibili.
Quello che senz'altro è noto, è che il primo carattere (a partire da sinistra) della stringa è certamente la lettera "X", la quale quindi non entrerà a far parte del suo valore. La prima cifra utile sarà certamente il secondo carattere della stringa... ma non sappiamo se il valore è rappresentato dalla sola cifra delle unità, oppure se v'è anche un'altra cifra (quella delle decine), ed un'altra ancora (quella delle centinaia), e così via.
Procediamo così:
Public Sub Button1_Click()
Dim a As String[]
' tronco la stringa in due sotto-stringhe, ed elimino la "Y" che utilmente mi fa anche da "separatrice" fra i due valori:
a = Split("X100Y50", "Y")
' A questo punto, la prima sotto-stringa è contenuta nella variabile stringa[]: a[0], mentre la seconda sotto-stringa in: a[1].
' Della prima sotto-stringa (contenuta nella variabile a[0]) prendo un numero di caratteri pari alla totale lunghezza della sotto-stringa medesima
' (pongo genericamente la "totale" lunghezza della sotto-stringa, perché io non conosco quanto è lunga, cioè di quante cifre è composta), ma....
' ...ma in vero non prendo proprio tutti i caratteri, perché parto dal 2° carattere a sinistra (lo faccio per escludere la "X");
' e mostro il risultato in console:
Print "X = "; Mid$(a[0], 2, Len(a[0]))
' mostro, infine, il risultato in console della seconda sotto-stringa, già priva della "Y":
Print "Y = "; a[1]
End
i metodi sono molteplici puoi anche fare in questo modo:
controlli se esiste il carattere che indica la presenza del dato:
Dim pn, px, py, n, x, y As Integer
Dim stringa As String
stringa = "N100X200Y300"
pn = InStr(stringa, "N")
px = InStr(stringa, "X")
py = InStr(stringa, "Y")
If pn <> 0 Then 'il carattere N esiste
N = Val(Mid(stringa, pn + 1, px - pn - 1))
Endif
x = Val(Mid(stringa, px + 1, py - px - 1))
y = Val(Mid(stringa, py + 1, (Len(stringa) - py)))
Print n
Print x
Print y
in questo modo i alori di n posso esserci o non esserci, inoltre il numero di cifre dei valori possono avere un qualsiasi numero
i metodi sono molteplici puoi anche fare in questo modo:
Il mio caro amico fsurfing :ciao: ha preso in esame il caso più difficile con la stringa: "N100X200Y300" .
Voglio provarci anch'io, utilizzando il metodo da me sopra esposto:
Public Sub Button1_Click()
Dim a As String[]
a = Split("N100X200Y300", "X" & "Y")
' vado semplicemente a vedere i risultati:
Print "N = "; Mid$(a[0], 2, Len(a[0])) ' qui puoi anche fare così: Replace$(a[0], "N", "")
Print "X = "; a[1]
Print "Y = "; a[2]
End
... la variabile N può non esserci ma al suo posto potrei trovare una variabile G ... o nessuno.
Poniamo dunque questa eventualità.
Public Sub Button1_Click()
Dim a As String[]
Dim b, c As String
' la variabile "b" conterrà la stringa, nella quale sappiamo solo
' che sono certamente presenti i caratteri "X" ed "Y", ma non sappiamo
' se c'è - ed eventualmente quale sia - all'inizio un carattere alfabetico "diverso" (N o G) da "X" ed "Y".
' Qui per ovvi fini esplicativi la stringa è nota:
b = "N100X200Y300"
' ricaviamo la prima lettera della stringa:
c = Left$(b, 1)
If c < Chr(88) Then ' se la prima lettera non è "X" né "Y", allora...
a = Split(b, "X" & "Y") '...avremo 3 sotto-stringhe e porremo "X" ed "Y" come termini "separatori"
' mostriamo i risultati:
Print c & " = "; Replace$(a[0], c, "") ' eliminiamo il primo carattere dal valore della prima sotto-stringa, ma lo riproponiamo solo come termine di eguaglianza
Print "X = "; a[1]
Print "Y = "; a[2]
' se, invece, il primo carattere è la "X" o la "Y", allora...
Else
a = Split(b, "Y") '...avremo solo due sotto-stringhe e porremo "Y" come termine "separatore"
' mostriamo in console i risultati:
Print "X = "; Replace$(a[0], c, "") ' eliminiamo il primo carattere dal valore della prima sotto-stringa, ma lo riproponiamo solo come termine di eguaglianza
Print "Y = "; a[1]
Endif
End
... ma quella di fsurfing funziona perfettamente.
fsurfing è uno del gruppo dei migliori :coder: in questo forum.
Ed altra cosa importante la stringa potrebbe avere anche un solo dato ad esempio X200 e basta .
...forse dovrai far verificare al tuo programma innanzitutto di quanti dati è formata la stringa (credo sia importante non tanto quanto è lunga la stringa, ma di quanti dati specifici è composta).
Più o meno una cosa del genere: :-[
c[20, 100] As String
g[100] As String
Public Sub Button1_Click()
Dim a, d, e As Integer
Dim b As String
b = "G5N10X200Y3000" ' facciamo finta che la stringa (avente una quantità di dati specifici a noi non conosciuta) sia questa
For a = 1 To Len(b) ' cominciamo una verifica "passo-passo"...
g[a] = Mid$(b, a, 1) '...di ciascun carattere presente nella stringa
Select Case g[a]
Case "A" To "Z" ' se il carattere è alfabetico, allora...
If d > 0 Then
Print g[d] & " = " & c[d, e] ' mostra i risultati (tranne l'ultimo)
Endif
Inc d
g[d] = g[a]
Case Else ' caso in cui il carattere è numerico:
Inc e
c[d, e] = c[d, e - 1] & g[a]
End Select
Next
Print g[d] & " = " & c[d, e] ' Alla fine viene mostrato anche l'ultimo dei risultati
End