Newsgroup: it.comp.lang.visual-basic
Titolo: VBA help

Salve,
qualcuno potrebbe indicarmi un codice VBA che permetta di ordinare
lessicograficamente le lettere di una stringa?
Esempio: TASSO dovrebbe venire riordinato come AOSST.
Grazie mille
K

lessicograficamente le lettere di una stringa?
Tenendo presente che ogni lettera corrisponde ad un numero
potresti copiare la stringa in un un array di byte, ordinare tale
array utilizzando un algoritmo di ordinamento recuperabile 
facilmente anche su internet, quindi copiare l' array ordinato
nella nuova stringa.
Ti mostro una possibile soluzione:
Ho copiato da msdn un esempio di quicksort in visual basic.
Poiche' riguarda array di stringhe, lo modificato leggermente
per lavorare con array di byte.
Il codice sotto la firma va copiato in un modulo .bas
e per provarlo basta lanciare nella finestra di verifica
la sub Test passando come parametro la parola
(o frase) di cui si vogliono ordinare le lettere.
hth, hal
-------------------------------------------------------------------
Option Explicit
' ============================ QuickSort ============================
' QuickSort works by picking a random "pivot" element in SortArray,
' then moving every element that is bigger to one side of the pivot,
' and every element that is smaller to the other side. QuickSort is
' then called recursively with the two subdivisions created by the
' pivot. Once the number of elements in a subdivision reaches two,
' the recursive calls end and the array is sorted.
' ===================================================================
'
Private Sub QuickSortByte(SortArray() As Byte, ByVal Low As Long, _
                   ByVal High As Long)
   Dim I As Long, J As Long, RandIndex As Long, Partition As Byte
   If Low < High Then
      ' Only two elements in this subdivision; swap them if they are
      ' out of order, then end recursive calls:
      If High - Low = 1 Then
         If (SortArray(Low) > SortArray(High)) Then
            SwapByte SortArray(Low), SortArray(High)
         End If
      Else
         ' Pick a pivot element at random, then move it to the end:
         RandIndex = Rnd() * (High - Low) + Low ' RandInt%(Low, High)
         SwapByte SortArray(High), SortArray(RandIndex)
         Partition = UCase(SortArray(High))
         Do
            ' Move in from both sides towards the pivot element:
            I = Low: J = High
            Do While (I < J) And (UCase(SortArray(I)) <= Partition)
               I = I + 1
            Loop
            Do While (J > I) And (UCase(SortArray(J)) >= Partition)
               J = J - 1
            Loop
            ' If we haven't reached the pivot element it means that 2
            ' elements on either side are out of order, so swap them:
            If I < J Then
               SwapByte SortArray(I), SortArray(J)
            End If
         Loop While I < J
         ' Move the pivot element to its proper place in the array:
         SwapByte SortArray(I), SortArray(High)
         ' Recursively call the QuickSort procedure (pass the
         ' smaller subdivision first to use less stack space):
         If (I - Low) < (High - I) Then
            QuickSortByte SortArray, Low, I - 1
            QuickSortByte SortArray, I + 1, High
         Else
            QuickSortByte SortArray, I + 1, High
            QuickSortByte SortArray, Low, I - 1
         End If
      End If
   End If
End Sub
Private Sub SwapByte(a As Byte, b As Byte)
    a = a Xor b
    b = b Xor a
    a = a Xor b
End Sub
Public Sub Test(ByVal parola As String)
    Dim tmp() As Byte
    Dim ordinato As String
 
    tmp() = StrConv(parola, vbFromUnicode)
    QuickSortByte tmp, 0, Len(parola) - 1
    ordinato = tmp()
    ordinato = StrConv(ordinato, vbUnicode)
 
    Debug.Print ordinato
End Sub


CUT
scusa hal ma:
Private Sub SwapByte(a As Byte, b As Byte)
dim dum as byte
     dum= a
     a = b
     b = dum
 End Sub
    o ancora una sola dichiarazione di dum
public dum as Byte
Private Sub SwapByte(a As Byte, b As Byte)
     dum= a
     a = b
     b = dum
 End Sub
perchè M$ consiglia xor... per la velocità?... oppure per far vedere che sa
usare Xor?
toglimi questo dubbio!???!
:-)
Saluti

Wodka4U ha scritto:

L' esempio di M$ da cui sono partito lavorava con array di String, sicche' la 
routine di swap era cosi':
Private Sub SWAP(first As String, second As String)
         Dim temp As String
         temp = first
         first = second
         second = temp
End Sub
Dato che nell' empio da me proposto il lavoro veniva fatto su un array di Byte,
ho pensato di evitare l' allocazione di una variabile temporanea, utilizzando
in modo sicuro lo Xor (senza rischi di overflow).
Tutto li'.
ciao, hal

 ha scritto nel messaggio
news:9p6pkq$gbgbn$1...@ID-56381.news.dfncis.de...
CUT
Thanks!...
:-)

...

Grazie,
ma, cosa intendi per "modulo .bas"? Io ho gia' usato del codice VBA in un
modulo non di classe e tutto mi funziona a dovere, ma con questo codice non
riesco ad ingranare. Potresti fornirmi istruzioni maggiormente dettagliate?
Grazie
K

riesco ad ingranare. Potresti fornirmi istruzioni maggiormente dettagliate?
Non ho capito nulla :-(
Questo codice in vb basta copiarlo e va.
Nel tuo caso specifico, qual e'  il problema ?
ciao, hal

...

Il problema e' che, nonostante io abbia copiato il codice sorgente in un
modulo di VBA-Excel, quando torno sul foglio di calcolo e richiamo le
funzioni definite dall'utente, non trovo la funzione di cui al modulo appena
creato e quindi non riesco a richiamarla in una cella per avere in questa
medesima cella, disposte in ordine alfabetico, tutte le lettere della
stringa contenuta in un'altra cella.
Nel caso non ti risultasse chiara anche questa mia ulteriore spiegazione,
non importa: non mi offendo se mi mandi un file *.xls con il modulo gia'
funzionante, per farmi vedere esattamente, come hai implementato il codice,
al fine di ottenere la relativa funzione.
Mille grazie
K

al fine di ottenere la relativa funzione.
^____^
Volentieri, ma non installo office sulle mie macchine :-(
Ho tutte le versioni, XP compresa, ancora belle incartate :-PPP
Passo la palla ....
ciao, hal