Discussione:
Sort in VBA - fallisce.
(troppo vecchio per rispondere)
paolopiace
2008-06-28 00:28:08 UTC
Permalink
Tramite VBA devo ordinare un Range per righe (quindi in base al
contenuto di una colonna), devo poi mettere l'ordinato risultante in
una matrice Variant e riportarla visibile sul foglio di Excel tramite
il comune Ctrl-Shft-Enter.

Ho provato il seguente codice ma produce l'errore #VALUE! in ogni
cella interessata.

Dim theMatrix() As Variant
theMatrix = Range("B2", "H7").Sort(Key1:=Columns(4),
Orientation:=xlSortRows)

Allora ho registrato la seguente Macro che, da sola, funziona
perfettamente,

Ma, se copio il codice di questa Macro e lo inserisco nel mio VBA,
smette completamente di funzionare!!

Range("B2:H6").Select
Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

Spero in qualche aiuto.
Norman Jones
2008-06-28 01:32:05 UTC
Permalink
Ciao Paolo,

=============
Tramite VBA devo ordinare un Range per righe (quindi in base al
contenuto di una colonna), devo poi mettere l'ordinato risultante in
una matrice Variant e riportarla visibile sul foglio di Excel tramite
il comune Ctrl-Shft-Enter.

Ho provato il seguente codice ma produce l'errore #VALUE! in ogni
cella interessata.

Dim theMatrix() As Variant
theMatrix = Range("B2", "H7").Sort(Key1:=Columns(4),
Orientation:=xlSortRows)

Allora ho registrato la seguente Macro che, da sola, funziona
perfettamente,

Ma, se copio il codice di questa Macro e lo inserisco nel mio VBA,
smette completamente di funzionare!!

Range("B2:H6").Select
Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
=============

Secondo la tua versione di Excel, la sintasi
del metodo Sort e del tipo:

expression.Sort(Key1,
Order1,
Key2,
Type,
Order2,
Key3,
Order3,
Header,
OrderCustom,
MatchCase,
Orientation,
SortMethod,
DataOption1,
DataOption2,
DataOption3)

Qui, 'expression' rappresenta un oggetto
range.

Segue che il metodo Sort agisce soltanto
su un range su un foglio; non si puo'
utilizzare il metodo Sort per ordinare un
array in VBA - a meno che non si copia
l'array su un foglio, ordina l'array e poi
rilegge i dati ordinati nell'array.

Se vuoi ordinare un array in memoria,
facendo una ricerca Google degli archivi
del NG per "Ordinare array" o "
QuickSort" o BubbleSort", troverai molti
algoritmi e suggerimenti.



---
Regards.
Norman
paolopiace
2008-06-28 02:25:58 UTC
Permalink
Norman, U R GR8!

In un altro Forum mi hanno suggerito questo, che io ho provato but...
negative.

Quindi, neppure con il WITH e` possibile?

Thank Norman!
----------------------------------------------------------------------------------
Try,

With Range("B2", "H7")
.Sort Key1:=.Cells(1, 4), Orientation:=xlSortRows
theMatrix = .Value
End With

The sort method is not returning a range object which you can then
load into theMatrix.
Norman Jones
2008-06-28 06:51:27 UTC
Permalink
Ciao Paolo,

=============
In un altro Forum mi hanno suggerito questo, che io ho provato but...
negative.

Quindi, neppure con il WITH e` possibile?

Thank Norman!
----------------------------------------------------------------------------------
Try,

With Range("B2", "H7")
.Sort Key1:=.Cells(1, 4), Orientation:=xlSortRows
theMatrix = .Value
End With

The sort method is not returning a range object which you can then
load into theMatrix.
=============

Il codice suggerito dell'altro forum utilizza
il metodo Sort per ordinare i dati *sul foglio*
e poi carica i dati ordinati nell'array.

Qui, la forma With ... End With non e' altro che
un modo, piu' efficiente, per dire:

'----------->
Range("B2", "H7").Sort Key1:=.Cells(1, 4), Orientation:=xlSortRows
theMatrix = Range("B2", "H7").Value
'<-----------

Ripeto, il metodo Sort agisce soltanto
su un range su un foglio; non si puo'
utilizzare il metodo Sort per ordinare un
array in memoria.

Per ordinare un array in VBA, vedi i
suggerimenti nella mia risposta precedente.

A proposito, quando utilizzi il metodo sort,
ti consiglio sempre di precisare, esplicitamente,
tutti gli argomenti del metodo. Facendo così,
eviterai le sorprese sgradevoli perché, in
assenza di valore esplicito, Excel userà l'ultimo
valore utilizzato da VBA o dall'utente



---
Regards.
Norman
paolopiace
2008-06-28 07:02:04 UTC
Permalink
Grazie ancora.

Norman, FYI, mikerickson su vbaexpress.com/forum mi ha passato questa
funzione che fa esattamente il lavoro di sorting.

http://vbaexpress.com/forum/showpost.php?p=149801&postcount=6

Ma lo fa su Range e funziona molto bene. Ora cerchero` di modificarla
per una Variant matix.

A presto,
Paolo
Norman Jones
2008-06-28 08:40:08 UTC
Permalink
Ciao Paolo,

=============
Norman, FYI, mikerickson su vbaexpress.com/forum mi ha passato questa
funzione che fa esattamente il lavoro di sorting.

http://vbaexpress.com/forum/showpost.php?p=149801&postcount=6

Ma lo fa su Range e funziona molto bene. Ora cerchero` di modificarla
per una Variant matix.
=============

Non vedo niente nella risposta di Mike Erickson
che sia in conflitto con la mia risposta.

Non mi e' chiaro la tua esigenza. Se il tuo scopo
sia di ordinare i dati sul foglio e utilizzare i dati
ordinati in un array, io ordinerei i dati con il
metodo Sort: il metodo e' ben ottimizato e, visto
che la vita e' corta, perche' reinventare l'acqua
calda? :-)

Se comunque, la tua esigenza sia di manipolare
i dati ordinati, senza toccare i dati sul foglio,
io leggerei i dati in un array e poi ordinerei i dati
con un algoritmo adatto, che sia una versione di
QuickSort, BubbleSort o altro.

Se, invece, la tua intenzione sia di copiare una
versione ordinata dei dati altrove sul foglio, io
copierei i dati e poi ordinerei i dati. utilizzando
il metodo Sort.

Finalmente, se il scopo sia di creare una UDF
(funzione utente) per ordinare dei dati sul foglio,
non credo sia possibile: una funzione restituisce
un valore; non puo' modificare il suo ambiente.
Infatti, ci sono un piccolo numero di eccezioni
a questa regola, ma questo non è rilevante alla
tua situazione.



---
Regards.
Norman
Bruno Campanini
2008-06-28 09:18:27 UTC
Permalink
Post by Norman Jones
Ciao Paolo,
=============
Norman, FYI, mikerickson su vbaexpress.com/forum mi ha passato questa
funzione che fa esattamente il lavoro di sorting.
http://vbaexpress.com/forum/showpost.php?p=149801&postcount=6
Ma lo fa su Range e funziona molto bene. Ora cerchero` di modificarla
per una Variant matix.
=============
Non vedo niente nella risposta di Mike Erickson
che sia in conflitto con la mia risposta.
[...]

Vox clamans in deserto...

Bruno
Norman Jones
2008-06-28 09:35:49 UTC
Permalink
Ciao Bruno,
Post by Bruno Campanini
Vox clamans in deserto...
heu, modo itera omnia quae mihi nunc
nuper narravisti, sed nunc anglice?

:-)

---
Regards,
Norman
Bruno Campanini
2008-06-28 10:28:50 UTC
Permalink
Post by Norman Jones
Ciao Bruno,
Post by Bruno Campanini
Vox clamans in deserto...
heu, modo itera omnia quae mihi nunc nuper narravisti, sed nunc anglice?
Tibi quod scripsi anglice narrare nescio...
lo farò in italiano:

Voce che chiama nel deserto, libero adattamento da
Vox clamantis in deserto (voce di chi chiama nel deserto).

Per traslato (cioè per estensione del significato):
consigli inascoltati,
persona che dà consigli che non vengono ascoltati.

That's all Folks

Bruno
Norman Jones
2008-06-28 11:32:43 UTC
Permalink
Ciao Bruno

=============
Post by Norman Jones
Post by Bruno Campanini
Vox clamans in deserto...
heu, modo itera omnia quae mihi nunc nuper narravisti, sed nunc anglice?
Tibi quod scripsi anglice narrare nescio...
lo farò in italiano:

Voce che chiama nel deserto, libero adattamento da
Vox clamantis in deserto (voce di chi chiama nel deserto).

Per traslato (cioè per estensione del significato):
consigli inascoltati,
persona che dà consigli che non vengono ascoltati.

That's all Folks
=============

Grazie, Bruno! Metterò questa espressione
da parte per uso futuro.

In questo caso, pero', sono convinto che
Paolo ascolti.

Speriamo che possiamo fornire Paolo con
la soluzione che cerca



---
Regards,
Norman
Norman Jones
2008-06-28 13:46:05 UTC
Permalink
Ciao Paolo,

Visto che i tuoi 2 thread sono legati allo
stesso problema, tentero' a rispondere
ad entrambi qui.

Prima di suggerire una soluzione, vorrei
ricapitulare la tua esigenza e i problemi
che incontri.

Comnciando con una matrice di dati su un
foglio, ad esempio l'intervallo B2:H6k, hai
l'esigenza copiare i dati in un array, ordinare
l'array e poi copiare l'array ordinato in un
secondo intervallo sul foglio, ad esempio
B12:H16.

Il secondo aspetto del problema e' di utilizzare
una UDF matriciale che legge i dati riordinati
e restituisci una matrice come risultato.

Per caricare l'array, riordinare i dati e copiare
i dati riordinati sul foglio, prova qualcosa del
genere:

'========>>
Option Explicit

Public Sub TesterSort()
Dim Rng As Range
Dim vArr As Variant
Dim bAscending As Boolean

Set Rng = Range("B2:H6")
vArr = Rng.Value
bAscending = False
QuickSort vArr, 4, LBound(vArr, 1), UBound(vArr, 1), bAscending
With Range("B12").Resize(UBound(vArr, 1), UBound(vArr, 2))
.Value = vArr
.Name = "RngOrdinato"
End With
End Sub

'-------------->>
Public Sub QuickSort(SortArray, col, L, R, bAscending)
'\\ Tom Ogilvy
'Originally Posted by Jim Rech 10/20/98 Excel.Programming
'Modified to sort on first column of a two dimensional array
'Modified to sort on single column
'Modified to do Ascending or Descending
Dim i, j, X, Y, mm

i = L
j = R
X = SortArray((L + R) / 2, col)
If bAscending Then
While (i <= j)
While (SortArray(i, col) < X And i < R)
i = i + 1
Wend
While (X < SortArray(j, col) And j > L)
j = j - 1
Wend
If (i <= j) Then
For mm = LBound(SortArray, 2) To UBound(SortArray, 2)
Y = SortArray(i, mm)
SortArray(i, mm) = SortArray(j, mm)
SortArray(j, mm) = Y
Next mm
i = i + 1
j = j - 1
End If
Wend
Else
While (i <= j)
While (SortArray(i, col) > X And i < R)
i = i + 1
Wend
While (X > SortArray(j, col) And j > L)
j = j - 1
Wend
If (i <= j) Then
For mm = LBound(SortArray, 2) To UBound(SortArray, 2)
Y = SortArray(i, mm)
SortArray(i, mm) = SortArray(j, mm)
SortArray(j, mm) = Y
Next mm
i = i + 1
j = j - 1
End If
Wend
End If
If (L < j) Then _
Call QuickSort(SortArray, col, L, j, bAscending)
If (i < R) Then _
Call QuickSort(SortArray, col, i, R, bAscending)
End Sub
'<<========

La UD|F PiPayOff diventa:

'===========>>
Option Explicit
Option Base 0

Public Function PiPayOff(NS As Long) As Double()
Dim numOfOpts As Long, c As Long, R As Long, n As Long
Dim colT As Long, colS As Long, colE As Long, colQ As Long
Dim PayOff_n As Double, maxE As Double
Dim Vals_M() As Double
Dim PiMatrix() As Variant
Dim delt_s As Double

ReDim Vals_M(NS)

colT = 1 'Type column - PUT or CALL
colS = 2 'Stock column
colE = 3 'Strike column
colQ = 7 'Quantity column

PiMatrix = Range("RngOrdinato").Value
'getMatrix(Range("rngOrdinato")) 'Range("B2:H6"))
numOfOpts = UBound(PiMatrix)

maxE = 0
For n = 1 To numOfOpts '\\ finds the max Strike
'\\ in the Portfolio
If PiMatrix(n, colE) > maxE Then
maxE = PiMatrix(n, colE)
End If
Next n

delt_s = 2 * maxE / NS '\\ calculate delta_S based
'\\ on the max strike

For n = NS To 1 Step -1 '\\ row=1: initialize Binary
'\\ Final Conds (PayOff)
Vals_M(n) = 0
PayOff_n = PiMatrix(1, colT) * _
((n * delt_s) - PiMatrix(1, colE))
If PayOff_n > 0 Then
Vals_M(n) = PiMatrix(1, colQ)
End If
Next n

For R = 2 To numOfOpts '\\ row=r: Adding all Vanilla
'\\ Final Conds (PayOff)
For n = NS To 1 Step -1
PayOff_n = PiMatrix(R, colT) * _
((n * delt_s) - PiMatrix(R, colE))
If PayOff_n > 0 Then
Vals_M(n) = Vals_M(n) + _
PiMatrix(R, colQ) * PayOff_n
End If
Next n
Next R

'For n = 1 To NS
' MsgBox Vals_M(n)
'Next n

PiPayOff = Vals_M()

End Function
'<<===========

La funzione legge i dati ordinati dall'intervallo
nominato RngOrdinato creato dalla routine
TesterSort.

Se ti fosse utilie. potrei inviarti il mio file di
prova, in risposta ad una tua email:


***@NOSPAMbtconnectDOTcom

(Cancella "NOSPAM" e sostituisci "DOT" con un punto)



---
Regards,
Norman
Norman Jones
2008-06-28 14:44:29 UTC
Permalink
Ciao Paolo,

A meno che non ti sia necessario copiare i dati ordinati sul foglio,
prova a sostituire il codice precedentew con la seguente versione:

'===========>>
Option Explicit
Option Base 0

Public Function PiPayOff(NS As Long, Rng As Range) As Double()
Dim numOfOpts As Long, c As Long, R As Long, n As Long
Dim colT As Long, colS As Long, colE As Long, colQ As Long
Dim PayOff_n As Double, maxE As Double
Dim Vals_M() As Double
Dim PiMatrix() As Variant
Dim delt_s As Double
Dim vArr As Variant
Dim bAscending As Boolean

ReDim Vals_M(NS)

colT = 1 'Type column - PUT or CALL
colS = 2 'Stock column
colE = 3 'Strike column
colQ = 7 'Quantity column

vArr = rng.Value
bAscending = False
QuickSort vArr, 4, LBound(vArr, 1), _
UBound(vArr, 1), bAscending

PiMatrix = vArr
numOfOpts = UBound(PiMatrix)

maxE = 0
For n = 1 To numOfOpts '\\ finds the max Strike
'\\ in the Portfolio
If PiMatrix(n, colE) > maxE Then
maxE = PiMatrix(n, colE)
End If
Next n

delt_s = 2 * maxE / NS '\\ calculate delta_S based
'\\ on the max strike

For n = NS To 1 Step -1 '\\ row=1: initialize Binary
'\\ Final Conds (PayOff)
Vals_M(n) = 0
PayOff_n = PiMatrix(1, colT) * _
((n * delt_s) - PiMatrix(1, colE))
If PayOff_n > 0 Then
Vals_M(n) = PiMatrix(1, colQ)
End If
Next n

For R = 2 To numOfOpts '\\ row=r: Adding all Vanilla
'\\ Final Conds (PayOff)
For n = NS To 1 Step -1
PayOff_n = PiMatrix(R, colT) * _
((n * delt_s) - PiMatrix(R, colE))
If PayOff_n > 0 Then
Vals_M(n) = Vals_M(n) + _
PiMatrix(R, colQ) * PayOff_n
End If
Next n
Next R

PiPayOff = Vals_M()

End Function

'-------------->>
Public Function QuickSort(SortArray, col, L, R, bAscending)
'\\ Tom Ogilvy
'Originally Posted by Jim Rech 10/20/98 Excel.Programming
'Modified to sort on first column of a two dimensional array
'Modified to sort on single column
'Modified to do Ascending or Descending
Dim i, j, X, Y, mm

i = L
j = R
X = SortArray((L + R) / 2, col)
If bAscending Then
While (i <= j)
While (SortArray(i, col) < X And i < R)
i = i + 1
Wend
While (X < SortArray(j, col) And j > L)
j = j - 1
Wend
If (i <= j) Then
For mm = LBound(SortArray, 2) To UBound(SortArray, 2)
Y = SortArray(i, mm)
SortArray(i, mm) = SortArray(j, mm)
SortArray(j, mm) = Y
Next mm
i = i + 1
j = j - 1
End If
Wend
Else
While (i <= j)
While (SortArray(i, col) > X And i < R)
i = i + 1
Wend
While (X > SortArray(j, col) And j > L)
j = j - 1
Wend
If (i <= j) Then
For mm = LBound(SortArray, 2) To UBound(SortArray, 2)
Y = SortArray(i, mm)
SortArray(i, mm) = SortArray(j, mm)
SortArray(j, mm) = Y
Next mm
i = i + 1
j = j - 1
End If
Wend
End If
If (L < j) Then _
Call QuickSort(SortArray, col, L, j, bAscending)
If (i < R) Then _
Call QuickSort(SortArray, col, i, R, bAscending)
End Function
'<<========



---
Regards,
Norman
paolopiace
2008-06-28 15:39:03 UTC
Permalink
Buongiorno Norman.

Mi hai dato un'enorme aiuto!
Inizio subito ad inserire il tuo codice nel mio.
Se nascono problemi, mi permettero` di
disturbarti ancora.

Volevo anche dirti che il tuo primo statement
spiega esattamente cio` che devo fare.
Post by Norman Jones
Comnciando con una matrice di dati su un
foglio, ad esempio l'intervallo B2:H6, hai
l'esigenza copiare i dati in un array, ordinare
l'array
e poi copiare l'array ordinato in un secondo
intervallo sul foglio, ad esempio B12:H16.
Grazie ancora e Buona Giornata!
Paolo
Norman Jones
2008-06-28 15:45:59 UTC
Permalink
Ciao Paolo,

===========
[...]
Post by Norman Jones
e poi copiare l'array ordinato in un secondo
intervallo sul foglio, ad esempio B12:H16.
===========

Il mio ultimo codice non copia i dati
ordinati sul foglio: tutto e' fatti in
memoria.




---
Regards,
Norman
Norman Jones
2008-06-28 15:51:38 UTC
Permalink
Post by Norman Jones
Il mio ultimo codice non copia i dati
ordinati sul foglio: tutto e' fatti in
memoria
Il mio ultimo codice non copia i dati
ordinati sul foglio: tutto e' fatto in
memoria



---
Regards,
Norman
paolopiace
2008-06-28 16:34:16 UTC
Permalink
Si, avevo notato...
paolopiace
2008-07-02 07:49:46 UTC
Permalink
Ciao Norman...

Ora sono proprio al punto di dover ordinare la matrice. Non posso +
farne a meno.

Allora, ho provato la tua ottima QuickSort. Funziona bene ma,
purtroppo, mi serve qualcosa di piu`.
Infatti, se piu` elementi della colonna 9 (my ordering col) sono
uguali, devo assicurarmi che quelle righe vengano ordinate secondo la
prima colonna!

Ho cercato su internet ma non ho trovato una funzione VBA che
risolvesse questo problema. Ne conosci qualcuna?

Se no, devo usare il Sort di Excel su due colonne in hidden mode. Non
si deve vedere.

Mi daresti una mano?

Ho una piccola matrice di type Long che, se possibile, gradirei
mantenere (il type).

Spero, se possibile, di sentirti presto.

P.S. Garzie x il link rigaurdo al back up!
Maurizio Borrelli
2008-07-02 09:33:19 UTC
Permalink
Post by paolopiace
Ora sono proprio al punto di dover ordinare la matrice. Non posso +
farne a meno.
Allora, ho provato la tua ottima QuickSort. Funziona bene ma,
purtroppo, mi serve qualcosa di piu`.
Infatti, se piu` elementi della colonna 9 (my ordering col) sono
uguali, devo assicurarmi che quelle righe vengano ordinate secondo la
prima colonna!
Ho cercato su internet ma non ho trovato una funzione VBA che
risolvesse questo problema. Ne conosci qualcuna?
Se no, devo usare il Sort di Excel su due colonne in hidden mode. Non
si deve vedere.
Mi daresti una mano?
Ho una piccola matrice di type Long che, se possibile, gradirei
mantenere (il type).
[...]

Ciao paolopiace.

Purtroppo non ho potuto seguire tutto il discorso (ho appena cominciato
a leggere i vari thread) pertanto non so se colgo l`obiettivo ma
riguardo il discorso particolare dell`ordinamento di array in memoria,
oltre agli ottimi metodi che Norman (ciao!) ha gia` indicato, o che
indichera`, ti segnalo il seguente:

Public Sub WirthQuickSort_demo()
Dim r As Excel.Range
Dim a As Variant
Dim i As Long
Dim j As Long

Set r = Range("A2:F33")
' ordinamento secondo la terza colonna
a = WirthQuickSort(r.Value, 3)
For i = LBound(a, 1) To UBound(a, 1)
For j = 1 To r.Columns.Count
Debug.Print a(i, j),
Next
Debug.Print
Next
End Sub

' Adattamento da:
' Niklaus Wirth
' _Algoritmi + Strutture Dati = Programmi_
' Tecniche Nuove, Milano 1987.
' 2 ORDINAMENTI
' 2.2 Ordinamento di array
' 2.2.6 Ordinamento per partizione
'
Public Function WirthQuickSort(ByVal a As Variant _
, ByVal k As Long _
) As Variant
Const PLEFT = 0
Const PRIGHT = 1

Dim s() As Long

Dim c As Long
Dim n As Long
Dim l As Long
Dim r As Long
Dim i As Long
Dim j As Long
Dim p As Long

Dim v As Variant
Dim d As Variant

c = 1
n = ((UBound(a, 1) - LBound(a, 1)) \ 6) + 1

If n > c Then
ReDim s(PLEFT To PRIGHT, c To n)
Else
ReDim s(PLEFT To PRIGHT, c To c)
End If
s(PLEFT, c) = LBound(a, 1)
s(PRIGHT, c) = UBound(a, 1)

Do
l = s(PLEFT, c)
r = s(PRIGHT, c)
c = c - 1
Do
i = l
j = r
v = a((l + r) \ 2, k)
Do
Do While a(i, k) < v
i = i + 1
Loop
Do While v < a(j, k)
j = j - 1
Loop
If i <= j Then
p = 1: On Error Resume Next
Do
d = a(i, p)
If Err.Number Then Exit Do
a(i, p) = a(j, p)
a(j, p) = d
p = p + 1
Loop
On Error GoTo 0
i = i + 1
j = j - 1
End If
Loop Until i > j
If (j - l) < (r - i) Then
If i < r Then
c = c + 1
s(PLEFT, c) = i
s(PRIGHT, c) = r
End If
r = j
Else
If (l < j) Then
c = c + 1
s(PLEFT, c) = l
s(PRIGHT, c) = j
End If
l = i
End If
Loop Until l >= r
Loop Until c = 0

WirthQuickSort = a
End Function

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-07-02 13:53:42 UTC
Permalink
Ciao Paolo,

=============
Ora sono proprio al punto di dover ordinare la matrice. Non posso +
farne a meno.

Allora, ho provato la tua ottima QuickSort. Funziona bene ma,
purtroppo, mi serve qualcosa di piu`.
Infatti, se piu` elementi della colonna 9 (my ordering col) sono
uguali, devo assicurarmi che quelle righe vengano ordinate secondo la
prima colonna!

Ho cercato su internet ma non ho trovato una funzione VBA che
risolvesse questo problema. Ne conosci qualcuna?

Se no, devo usare il Sort di Excel su due colonne in hidden mode. Non
si deve vedere.

Mi daresti una mano?
=============

Per ordinare l'array, utilizzanando la colonna 9
come prima chiave e la colonna 1 come
sottochiave, poi sempre utilizzare la funzione
QuickSort suggerita da me.

A titolo di esempio, prova qualcosa del
genere:

'========>>
Option Explicit

Public Sub TestDoubleSort()
Dim RngIn As Range
Dim RngOut As Range
Dim vArr As Variant
Dim vSubArr As Variant
Dim i As Long, j As Long, u As Long
Dim bAscending As Boolean
Dim blSubSortNeeded As Boolean

Set RngIn = Range("A2:I11")
vArr = RngIn.Value
bAscending = True 'False
QuickSort vArr, 9, LBound(vArr, 1), UBound(vArr, 1), bAscending

u = UBound(vArr, 2)
For i = LBound(vArr, 1) To UBound(vArr, 1) - 1
If vArr(i, 9) = vArr(i + 1, 9) Then
If Not blSubSortNeeded Then
j = i
End If
blSubSortNeeded = True
Else
If blSubSortNeeded Then
QuickSort vArr, 1, j, i, bAscending
j = 0
blSubSortNeeded = False
End If
End If
Next i

Set RngOut = Range("A14").Resize(UBound(vArr, 1), u)
With RngOut
.Value = vArr
.Name = "RngOrdinato"
End With

End Sub
'<<========



---
Regards,
Norman
paolopiace
2008-07-02 15:32:42 UTC
Permalink
Ciao Norman.

Humm... sei sicuro che la TestDoubleSort funzioni?

Mi risulta che il For loop non faccia il sub-sorting secondo la
seconda key. Ho cercato di modificare i parametri del loop ma senza
successo.

Infatti, in questo esempio ci sono quattro elementi con lo stesso
valore (6) in Col 9, la key principale. Ma quelle righe non vengono
ordinate secondo Col 1, la key secondaria. Che ne pensi?

Ciao,
Paolo


1 1 100 100 0.1 0 0 1 1
5 -1 110 100 0.3 4.22 4.22 0.4 3
3 1 110 100 0.4 4.22 4.22 0.5 4
7 1 354 100 0.6 0 0 1 6
6 1 110 100 0.6 4.22 4.22 0.5 6
2 1 90 100 0.6 14.42 14.42 0.5 6
4 1 110 100 0.6 4.22 4.22 0.5 6
Norman Jones
2008-07-02 19:23:34 UTC
Permalink
Ciao Paolo,

=============
Humm... sei sicuro che la TestDoubleSort funzioni?

Mi risulta che il For loop non faccia il sub-sorting secondo la
seconda key. Ho cercato di modificare i parametri del loop ma senza
successo.

Infatti, in questo esempio ci sono quattro elementi con lo stesso
valore (6) in Col 9, la key principale. Ma quelle righe non vengono
ordinate secondo Col 1, la key secondaria. Che ne pensi?
=============

Penso che la mia procedura stesse mancando un'istruzione finale, dopo, là
dovrei essere:
Peno che la routine manchi un'istruzione finale; dopo:

Next i

ci voleva qualcosa del genere:

If blSubSortNeeded Then
QuickSort vArr, 1, j, i, bAscending
End If

In ogni caso, ho cambiato la routine in una fuzione,
ArrDoubleSort.

Quindi, prova:

'========>>
Option Explicit

Public Sub TestIt()
Dim WB As Workbook
Dim SH As Worksheet
Dim RngIn As Range
Dim RngOut As Range
Dim arr As Variant
Dim iUbound As Long
Dim arrSorted As Variant

Set WB = Workbooks("Pippo.xls1") '<<=== da CAMBIARE
Set SH = WB.Sheets("Foglio1") '<<=== da CAMBIARE
Set RngIn = SH.Range("A2:I8") '<<=== da CAMBIARE
Set RngOut = SH.Range("A14") '<<=== da CAMBIARE

arr = ArrDoubleSort(FirstCol:=9, _
SecondCol:=1, _
RngIn:=RngIn, _
blSortOrderAscending:=True)

iUbound = UBound(arr, 2)

Set RngOut = RngOut.Resize(UBound(arr, 1), iUbound)
RngOut.Value = arr

End Sub

'----------------->>
Public Function ArrDoubleSort(FirstCol As Long, _
SecondCol As Long, _
RngIn As Range, _
Optional blSortOrderAscending As Boolean) _
As Variant

Dim vArr As Variant
Dim i As Long, j As Long, u As Long
Dim bAscending As Boolean
Dim blSubSortNeeded As Boolean

Set RngIn = Range("A2:I8")
vArr = RngIn.Value
bAscending = blSortOrderAscending
QuickSort vArr, 9, LBound(vArr, 1), _
UBound(vArr, 1), blSortOrderAscending

For i = LBound(vArr, 1) To UBound(vArr, 1) - 1
If vArr(i, 9) = vArr(i + 1, 9) Then
If Not blSubSortNeeded Then
j = i
End If
blSubSortNeeded = True
Else
If blSubSortNeeded Then
QuickSort vArr, 1, j, i, bAscending
blSubSortNeeded = False
j = 0
End If
End If
Next i

If blSubSortNeeded Then
QuickSort vArr, 1, j, i, bAscending
End If

ArrDoubleSort = vArr

End Function

'----------------->>
Public Sub QuickSort(SortArray, col, L, R, bAscending)
'\\ Tom Ogilvy
'Originally Posted by Jim Rech 10/20/98 Excel.Programming
'Modified to sort on first column of a two dimensional array
'Modified to sort on single column
'Modified to do Ascending or Descending
Dim i, j, x, Y, mm

i = L
j = R
x = SortArray((L + R) / 2, col)
If bAscending Then
While (i <= j)
While (SortArray(i, col) < x And i < R)
i = i + 1
Wend
While (x < SortArray(j, col) And j > L)
j = j - 1
Wend
If (i <= j) Then
For mm = LBound(SortArray, 2) To UBound(SortArray, 2)
Y = SortArray(i, mm)
SortArray(i, mm) = SortArray(j, mm)
SortArray(j, mm) = Y
Next mm
i = i + 1
j = j - 1
End If
Wend
Else
While (i <= j)
While (SortArray(i, col) > x And i < R)
i = i + 1
Wend
While (x > SortArray(j, col) And j > L)
j = j - 1
Wend
If (i <= j) Then
For mm = LBound(SortArray, 2) To UBound(SortArray, 2)
Y = SortArray(i, mm)
SortArray(i, mm) = SortArray(j, mm)
SortArray(j, mm) = Y
Next mm
i = i + 1
j = j - 1
End If
Wend
End If
If (L < j) Then _
Call QuickSort(SortArray, col, L, j, bAscending)
If (i < R) Then _
Call QuickSort(SortArray, col, i, R, bAscending)
End Sub
'<<========




---
Regards,
Norman
Norman Jones
2008-07-02 19:37:25 UTC
Permalink
Ciao Paolo,

Ho inviato involontariamente la mia risposta prima che avessi emendato la
prima frase della risposta.
Post by Norman Jones
Penso che la mia procedura stesse mancando un'istruzione finale, dopo, là
Era intesa come:

Penso che la routine manchi un'istruzione finale;
dopo:



---
Regards,
Norman
paolopiace
2008-07-02 20:53:16 UTC
Permalink
Grande!

Mi dici, per favore, quali "1" vado a sostituire con SecondCol in
Function ArrDoubleSort?

Solo qui?
QuickSort vArr, 1, j, i, bAscending

che diventa
QuickSort vArr, SecondCol, j, i, bAscending

Oppure anche altrove?

Ho sostituito tutti i 9 con FirstCol e quel' 1 con SecondCol, ma c'e'
ancora qualcosa che non funziona.

Fammi sapere ed io correggo e ri-testo.

Grazie!
Paolo
Norman Jones
2008-07-02 22:23:03 UTC
Permalink
Ciao Paolo,

=============
Mi dici, per favore, quali "1" vado a sostituire con SecondCol in
Function ArrDoubleSort?

Solo qui?
QuickSort vArr, 1, j, i, bAscending

che diventa
QuickSort vArr, SecondCol, j, i, bAscending

Oppure anche altrove?

Ho sostituito tutti i 9 con FirstCol e quel' 1 con SecondCol, ma c'e'
ancora qualcosa che non funziona.

Fammi sapere ed io correggo e ri-testo.
=============

Chiedo scusa, ho risposto nel ramo incoretto
e ho anch dimenticato di copiare il testo del
tuo post. Quindi, per la coerenza del thread:

Prova a utilizzare la mia funzione ArrDoubleSort.

Gli argomenti della funzione sono:

FirstCol = il numero della colonna piu' importante
per l'ordinamento dei dati

SecondCol = il numero della seconda colonna per
l'ordinamento dei dati

RngIn = L'intervallo (o l'array) da essere ordinati

blSortOrderAscending = Il modo di ordinamento:
True = Ascendente;
False = Discendente
(Lasciando il valore vuoto, il
valore 'default' True va
utilizzato.

A proposito c'e un errore nella funzione;la riga:

Set RngIn = Range("A2:I8")

dovrebbe essere cancellata; l'avevo utilizzata per
una mia prova e, poi avevo dimenticato cancellerla.

Utilizzando come input i dati indicati da te:

1 1 100 100 0.1 0 0 1 1
5 -1 110 100 0.3 4.22 4.22 0.4 3
3 1 110 100 0.4 4.22 4.22 0.5 4
7 1 354 100 0.6 0 0 1 6
6 1 110 100 0.6 4.22 4.22 0.5 6
2 1 90 100 0.6 14.42 14.42 0.5 6
4 1 110 100 0.6 4.22 4.22 0.5 6

ottengo i risultati:

1 1 100 100 0.1 0 0 1 1
5 -1 110 100 0.3 4.22 4.22 0.4 3
3 1 110 100 0.4 4.22 4.22 0.5 4
2 1 90 100 0.6 14.42 14.42 0.5 6
4 1 110 100 0.6 4.22 4.22 0.5 6
6 1 110 100 0.6 4.22 4.22 0.5 6
7 1 354 100 0.6 0 0 1 6

Oppure, con gli input:

4 z 100 100 1 100 4.866 2 Tom
2 c 90 100 1.5 8.24 8.68 3 Ben
2 c 111 101 0.8 16.46 16.91 1 Anne
3 z 112 102 2.1 17.46 17.91 4 Tom
1 a 110 90 0.5 15.46 15.91 0 Tom
3 p 100 100 1 100 4.866 2 Anne
1 a 90 100 1.5 8.24 8.68 3 Ben
1 c 111 101 0.8 16.46 16.91 1 Anne
2 a 112 102 2.1 17.46 17.91 4 Tom
5 x 110 90 0.5 15.46 15.91 0 Tom

ottengo

1 c 111 101 0.8 16.46 16.91 1 Anne
2 c 111 101 0.8 16.46 16.91 1 Anne
3 p 100 100 1 100 4.866 2 Anne
1 a 90 100 1.5 8.24 8.68 3 Ben
2 c 90 100 1.5 8.24 8.68 3 Ben
1 a 110 90 0.5 15.46 15.91 0 Tom
2 a 112 102 2.1 17.46 17.91 4 Tom
3 z 112 102 2.1 17.46 17.91 4 Tom
4 z 100 100 1 100 4.866 2 Tom
5 x 110 90 0.5 15.46 15.91 0 Tom


---
Regards,
Norman
Norman Jones
2008-07-02 22:57:52 UTC
Permalink
Ciao Paolo,
blSortOrderAscending = Il modo di ordinamento: True = Ascendente;
False = Discendente
(Lasciando il valore vuoto, il
valore 'default' True va
utilizzato.
Il valore default (True) richiede che si
Post by Norman Jones
Public Function ArrDoubleSort(FirstCol As Long, _
SecondCol As Long, _
RngIn As Range, _
Optional blSortOrderAscending As Boolean) _
As Variant
con

Public Function ArrDoubleSort(FirstCol As Long, _
SecondCol As Long, _
RngIn As Range, _
Optional blSortOrderAscending As Boolean = True)
_
As Variant

Senza questo cambiamento, in assenza di
un valore esplicito per la variabile
blSortOrderAscending, il valore default
sarebbe False (= ordinamento discendente.



---
Regards,
Norman
paolopiace
2008-07-02 23:48:27 UTC
Permalink
Ciao Norman.

Temo di non riuscire a farmi capire e probabilmente sono io che non
capisco. Permettimi di riprovare...:

1) La ArrDoubleSort() che hai scritto tu (cool!!) chiama due volte la
QuickSort() ma gli passa HARD-CODED i numeri "9" invece di FirstCol e
"1" invece SecondCol.

2) Ovvero, la ArrDoubleSort() ha hard-coded "9" instead of FirstCol
(easy to replace, done) ed ha hard-coded "1" instead of SecondCol (not
clear wich "1" to replace).

Devo capire quali "1" in ArrDoubleSort() vanno replaced con SecondCol.

Certamente questo
QuickSort vArr, 1, j, i, bAscending
diventa
QuickSort vArr, SecondCol, j, i, bAscending

Magari qualche altro "1"?

Ciao,
Paolo
Norman Jones
2008-07-03 00:23:46 UTC
Permalink
Ciao Paolo,

=============
Temo di non riuscire a farmi capire e probabilmente sono io che non
capisco. Permettimi di riprovare...:

1) La ArrDoubleSort() che hai scritto tu (cool!!) chiama due volte la
QuickSort() ma gli passa HARD-CODED i numeri "9" invece di FirstCol e
"1" invece SecondCol.

2) Ovvero, la ArrDoubleSort() ha hard-coded "9" instead of FirstCol
(easy to replace, done) ed ha hard-coded "1" instead of SecondCol (not
clear wich "1" to replace).

Devo capire quali "1" in ArrDoubleSort() vanno replaced con SecondCol.

Certamente questo
QuickSort vArr, 1, j, i, bAscending
diventa
QuickSort vArr, SecondCol, j, i, bAscending

Magari qualche altro "1"?
=============

Per 'hardcode' le due colonne, prova la seguente versione della funzione:

'==========>>
Public Function ArrDoubleSort(RngIn As Range, _
Optional blSortOrderAscending As Boolean = True)
_
As Variant

Dim vArr As Variant
Dim i As Long, j As Long, u As Long
Dim bAscending As Boolean
Dim blSubSortNeeded As Boolean
Const FirstCol As Long = 9
Const SecondCol As Long = 1

vArr = RngIn.Value
bAscending = blSortOrderAscending
QuickSort vArr, 9, LBound(vArr, 1), _
UBound(vArr, 1), blSortOrderAscending

For i = LBound(vArr, 1) To UBound(vArr, 1) - 1
If vArr(i, 9) = vArr(i + 1, 9) Then
If Not blSubSortNeeded Then
j = i
End If
blSubSortNeeded = True
Else
If blSubSortNeeded Then
QuickSort vArr, 1, j, i, bAscending
blSubSortNeeded = False
j = 0
End If
End If
Next i

If blSubSortNeeded Then
QuickSort vArr, 1, j, i, bAscending
End If

ArrDoubleSort = vArr

End Function
'<<==========

Questa funzione va chiamata, in modo matriciale,
dal foglio cosi':

=ArrDoubleSort(A3:I11)

oppure:

=ArrDoubleSort(A3:I11;TRUE)

Per hardcode le due colonne. ma permettere
che siano precisate diversamente. prova invece:

'==========>>
Public Function ArrDoubleSort(RngIn As Range, _
Optional FirstCol As Long = 9, _
Optional SecondCol As Long = 1, _
Optional blSortOrderAscending As Boolean = True)
_
As Variant

Dim vArr As Variant
Dim i As Long, j As Long, u As Long
Dim bAscending As Boolean
Dim blSubSortNeeded As Boolean

vArr = RngIn.Value
bAscending = blSortOrderAscending
QuickSort vArr, 9, LBound(vArr, 1), _
UBound(vArr, 1), blSortOrderAscending

For i = LBound(vArr, 1) To UBound(vArr, 1) - 1
If vArr(i, 9) = vArr(i + 1, 9) Then
If Not blSubSortNeeded Then
j = i
End If
blSubSortNeeded = True
Else
If blSubSortNeeded Then
QuickSort vArr, 1, j, i, bAscending
blSubSortNeeded = False
j = 0
End If
End If
Next i

If blSubSortNeeded Then
QuickSort vArr, 1, j, i, bAscending
End If

ArrDoubleSort = vArr

End Function
'<<==========

Questa versione va chiamata cosi':

=ArrDoubleSort(A3:I11)

Oppure:

=ArrDoubleSort(A3:I11; 10)

oppure:

=ArrDoubleSort(A3:I11; 10; 2)

Oppure

=ArrDoubleSort(A3:I11;10;2.FALSO)

oppure

=ArrDoubleSort(A3:I11;;FALSE)


---
Regards,
Norman
paolopiace
2008-07-03 00:46:51 UTC
Permalink
Hummm, provo a spiegarmi in modo diverso... non mi sono fatto capire.

Norman, nel body della tua ArrDoubleSort() chiami due volte la
QuickSort esattamente cosi` (cut/paste):

1) QuickSort vArr, 9, LBound(vArr, 1), UBound(vArr, 1),
blSortOrderAscending

2) QuickSort vArr, 1, j, i, bAscending

Quindi mi sembra che QuickSort riceva sempre e comunque i numeri 9 e 1
per le colonne per l'ordinamento.

Piu` ci sono sparsi altri 9 ed 1 nel body di ArrDoubleSort(). Quindi,
se non sbaglio, le colonne per il sorting non possono essere cambiate.

O sbaglio?
Norman Jones
2008-07-03 01:21:30 UTC
Permalink
Ciao Paolo.

=============
Hummm, provo a spiegarmi in modo diverso... non mi sono fatto capire.

Norman, nel body della tua ArrDoubleSort() chiami due volte la
QuickSort esattamente cosi` (cut/paste):

1) QuickSort vArr, 9, LBound(vArr, 1), UBound(vArr, 1),
blSortOrderAscending

2) QuickSort vArr, 1, j, i, bAscending

Quindi mi sembra che QuickSort riceva sempre e comunque i numeri 9 e 1
per le colonne per l'ordinamento.

Piu` ci sono sparsi altri 9 ed 1 nel body di ArrDoubleSort(). Quindi,
se non sbaglio, le colonne per il sorting non possono essere cambiate.

O sbaglio?
=============

Non ti sbagli! E' tardi qui, e sono lento!

Evviva! Finalmente ti ho capito!

Prova la seguente versione:

'========>>
Public Function ArrDoubleSort( _
RngIn As Range, _
FirstCol As Long, _
SecondCol As Long, _
Optional blSortOrderAscending As Boolean = True) _
As Variant

Dim vArr As Variant
Dim i As Long, j As Long, u As Long
Dim bAscending As Boolean
Dim blSubSortNeeded As Boolean

vArr = RngIn.Value
bAscending = blSortOrderAscending
QuickSort vArr, FirstCol, LBound(vArr, 1), _
UBound(vArr, 1), blSortOrderAscending

For i = LBound(vArr, 1) To UBound(vArr, 1) - 1
If vArr(i, FirstCol) = vArr(i + 1, FirstCol) Then
If Not blSubSortNeeded Then
j = i
End If
blSubSortNeeded = True
Else
If blSubSortNeeded Then
QuickSort vArr, SecondCol, j, i, bAscending
blSubSortNeeded = False
j = 0
End If
End If
Next i

If blSubSortNeeded Then
QuickSort vArr, FirstCol, j, i, bAscending
End If

ArrDoubleSort = vArr

End Function
'<<========

Si potrebbe chiamare questa funzione
(ad esempio) cosi':


=ArrDoubleSort(A2:K11,11,2)



---
Regards,
Norman
paolopiace
2008-07-03 02:25:22 UTC
Permalink
Benissimo.

Quindi avevo fatto le modifiche corrette questa mattina e ti ho
chiesto chiarimenti per assicurarmi di aver fatto giusto.

Allora... funziona ma ha ancora qualche problema.

Ha ordinato la seguente matrice secondo la colonna 9 (key1) e secondo
colonna 7 (key2) ma la key2 ha fallito sulle ultime due righe che
dovrebbero essere scambiate. Strano, visto che le prime due righe sono
ordinate correttamente da key2.

Norman, Che ne pensi?

2 1 90 100 0.04 3 3 0.5 0
5 -1 110 100 0.09 4.22 4.22 0.4 0
3 1 110 100 0.4 4.22 4.22 0.5 4
1 1 2 1 0.5 0 0 -20 5
6 1 110 100 0.6 4.22 4.22 0.5 6
4 1 110 100 0.69 4.22 4.22 0.5 7
7 1 214 100 0.69 0 0 1 7
Norman Jones
2008-07-03 11:14:20 UTC
Permalink
Ciao Paolo.

=============
Quindi avevo fatto le modifiche corrette questa mattina e ti ho
chiesto chiarimenti per assicurarmi di aver fatto giusto.

Allora... funziona ma ha ancora qualche problema.

Ha ordinato la seguente matrice secondo la colonna 9 (key1) e secondo
colonna 7 (key2) ma la key2 ha fallito sulle ultime due righe che
dovrebbero essere scambiate. Strano, visto che le prime due righe sono
ordinate correttamente da key2.

Norman, Che ne pensi?

2 1 90 100 0.04 3 3 0.5 0
5 -1 110 100 0.09 4.22 4.22 0.4 0
3 1 110 100 0.4 4.22 4.22 0.5 4
1 1 2 1 0.5 0 0 -20 5
6 1 110 100 0.6 4.22 4.22 0.5 6
4 1 110 100 0.69 4.22 4.22 0.5 7
7 1 214 100 0.69 0 0 1 7
=============

Putroppo, non ti capisco!

A me, la tua matrice sembri gia' ordinata
per quanto riguarda le colonne 9 e 1.

Inoltre, anche se non ho visto la matrice
iniziale non ordinata), non mi risulta che le
ultime due righe debbano essere scambiate:
visto che,per queste due righe, i valori della
colonna 9 sono uguali, se deve ordinarle a
seconda dei valori della prima colonna e, a
questo proposito, il valore 7 è maggior del
valore 4 .

Mi scuso, ma penso che mi sfugga qualcosa.


---
Regards,
Norman
Norman Jones
2008-07-03 11:49:00 UTC
Permalink
Ciao Paolo

============
Putroppo, non ti capisco!
[...]
============

Come non detto!
Post by paolopiace
colonna 7 (key2)
come

colonna 1 (key2)

forse perche' sinora si trattava sempre
delle colonne 9 e 1 per le due chiavi.

Vado a mangiare ora, ma ti rispondero'
al piu' presto.



---
Regards,
Norman
Norman Jones
2008-07-03 12:41:17 UTC
Permalink
Ciao Paolo,

=============
Benissimo.

Quindi avevo fatto le modifiche corrette questa mattina e ti ho
chiesto chiarimenti per assicurarmi di aver fatto giusto.

Allora... funziona ma ha ancora qualche problema.

Ha ordinato la seguente matrice secondo la colonna 9 (key1) e secondo
colonna 7 (key2) ma la key2 ha fallito sulle ultime due righe che
dovrebbero essere scambiate. Strano, visto che le prime due righe sono
ordinate correttamente da key2.

Norman, Che ne pensi?

2 1 90 100 0.04 3 3 0.5 0
5 -1 110 100 0.09 4.22 4.22 0.4 0
3 1 110 100 0.4 4.22 4.22 0.5 4
1 1 2 1 0.5 0 0 -20 5
6 1 110 100 0.6 4.22 4.22 0.5 6
4 1 110 100 0.69 4.22 4.22 0.5 7
7 1 214 100 0.69 0 0 1 7
=============

Penso sia un 'bug' deplorabile e non non credo
che fosse migliorato dall'ora (02:30 a St Albans)
alla quale avevo postato l'ultimaversione della mia
funzione!
Post by Norman Jones
If blSubSortNeeded Then
QuickSort vArr, FirstCol, j, i, bAscending
End If
con

If blSubSortNeeded Then
QuickSort vArr, SecondCol, j, i, bAscending
End If



---
Regards,
Norman
Norman Jones
2008-07-03 14:41:24 UTC
Permalink
Ciao Paolo,

=============
Penso sia un 'bug' deplorabile e non non credo
che fosse migliorato dall'ora (02:30 a St Albans)
alla quale avevo postato l'ultimaversione della mia
funzione!
=============

A seconda dalla tua risposta la doppia negazione
non era (era) intesa! :-)



---
Regards,
Norman
paolopiace
2008-07-03 14:49:31 UTC
Permalink
Perfetto! Proprio perfetto!

Ora, compito mio, dovro` cercare di non usare nessuna Variant nel
codice e fare tutto in Double.

Storia lunga... ma in sostanza devo ottimizzare la memoria visto che
alla fine quella matrice sara` enorme.

Norman, where are you located? Dove si trova St Albans?

Io sono a San Jose, CA. Sto usando il Google group Italiano di
microsoft.public.it.office.excel perche` non c`e` paragone con la
qualita` ed efficienza di quello qui in USA. Infatti, questo group
Italiano mi e` stato consigliato da developers che conosco in
Microsoft...

Spero di non disturbarti piu`, almeno riguardo a questo sorting.

Ma ci setiremo ancora certamente.

Buona giornata!
Paolo
Norman Jones
2008-07-03 15:12:49 UTC
Permalink
Ciao Paolo,

=============
Perfetto! Proprio perfetto!
=============

Mi fa molto piacere, mi ci siamo sempre
qui se dovessi avere bisogno!

=============
Ora, compito mio, dovro` cercare di non usare nessuna Variant nel
codice e fare tutto in Double.

Storia lunga... ma in sostanza devo ottimizzare la memoria visto che
alla fine quella matrice sara` enorme.
=============

Se potresti darci ulteriori informazioni, io provero'
di ottimizzare il codice; oppure potrei, forse,
suggerire un'altro approcchio.

Mi pare che si tratti di una applicazione di borsa.
vero?

=============
Norman, where are you located? Dove si trova St Albans?

Io sono a San Jose, CA. Sto usando il Google group Italiano di
microsoft.public.it.office.excel perche` non c`e` paragone con la
qualita` ed efficienza di quello qui in USA. Infatti, questo group
Italiano mi e` stato consigliato da developers che conosco in
Microsoft...
=============

Io mi trovo in Inghilterra, a 40 km di Londra.

=============
Spero di non disturbarti piu`, almeno riguardo a questo sorting.
=============

Al contrario, caro Paolo, per me sarebbe una piacere!

=============
Ma ci setiremo ancora certamente.
=============

Spero proprio di si'!

Saluti!


---
Regards,
Norman
paolopiace
2008-07-03 16:11:50 UTC
Permalink
Post by Norman Jones
=============
Ora, compito mio, dovro` cercare di non usare
nessuna Variant nel codice e fare tutto in Double.
=============
Se potresti darci ulteriori informazioni, io provero'
di ottimizzare il codice; oppure potrei, forse,
suggerire un'altro approcchio.
Essenzialmente sono vincolato ad una matrice Double pre-esistente.
Devo fare il Sorting di quella senza cambiare il Type.

In pratica, la ArrDoubleSort() ricevera` una matrice Long, non un
Range, e ritornera` sorted la stessa matrice Long. Non dovrebbe essere
un big tweak della ArrDoubleSort().
Post by Norman Jones
Mi pare che si tratti di una applicazione di borsa. Vero?
Correct.
Si tratta di un algoritmo di numeric calculus su un certo modello
matematico. La matrice in questione contiene solo i dati di partenza.

A presto...
Paolo
Norman Jones
2008-07-03 16:10:29 UTC
Permalink
Ciao Paolo,

=============
[...]
Io sono a San Jose, CA. Sto usando il Google group Italiano di
microsoft.public.it.office.excel perche` non c`e` paragone con la
qualita` ed efficienza di quello qui in USA. Infatti, questo group
Italiano mi e` stato consigliato da developers che conosco in
Microsoft...
[...]
=============

Avrei voluto aggiungere che e' chiaro che
i tuoi amici sono in gamba, o come si dice
in inglese, 'they know their onions!': in
questo ng troverai molti bravi ragazzi/e e,
insieme, risolviamo solitamente tutti i
problemi postati sul NG - Il nostro motto
è:

Il possibile l'abbiamo già fatto, l'impossibile
lo stiamo facendo, per i miracoli ci stiamo
attrezzando!

:-))


---
Regards,
Norman

Loading...