Scuola forum (scuo.la) - Forum di discussione per le scuole

Scuola forum (scuo.la) - Forum di discussione per le scuole (https://www.scuolaforum.org/)
-   Informatica (https://www.scuolaforum.org/informatica/)
-   -   Ordinare celle Excel 2007 in maniera relativa in VBA (https://www.scuolaforum.org/informatica/399-ordinare-celle-excel-2007-maniera-relativa-vba.html)

Scuola 12-24-2007 10:34 PM

Ordinare celle Excel 2007 in maniera relativa in VBA
 
Salve,
con Excel 2003 ero abituato a selezionare con una macro l'intervallo di celle che volevo ordinare e poi scrivere qualcosa del genere:

Quote:

Rows("2:2").Select
Range("F2").Activate
Range(Selection, Selection.End(xlDown)).Select

Selection.Sort Key1:=Range("C1"), Order1:=xlAscending, Key2:=Range("k1") _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
Ora, con la versione 2007, la faccenda è un po' cambiata, e la stessa operazione viene registrata più o meno così, nonostante io la registri utilizzando i riferimenti relativi:

Quote:

Range("F2").Select
ActiveCell.Rows("1:1").EntireRow.Select
ActiveCell.Activate
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Statistiche").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Statistiche").Sort.SortFields.Add Key:=ActiveCell. _
Offset(0, 2).Range("A1:A351"), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Statistiche").Sort.SortFields.Add Key:=ActiveCell. _
Offset(0, 10).Range("A1:A351"), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Statistiche").Sort
.SetRange ActiveCell.Range("A1:BQ351")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Il problema è, come si può vedere, che la macro è piena di riferimenti sia al foglio che alla quantità di righe selezionate, ma non va bene perchè il loro numero può variare (il numero di righe selezionate indendo).

Come si può adattare quindi questa macro per far si che ordini le righe selezionate indipendentemente dalla loro quantità e dal foglio in cui si trovano?

Grazie mille

Anastasia 01-01-2008 06:36 PM

Ciao.

Come primo suggerimento, per rendere relativo il foglio su cui lancerai la macro, sostituirei ActiveWorkbook.Worksheets("Statistiche") con Activesheet.

Seconda cosa, per rendere relativo anche la selezione delle celle, dichiarerei una variabile per la selezione delle celle (del tipo Selezione= Selection.Address) da mettere dopo che hai selezionato appunto tutte le celle che ti interessa elaborare (in questo caso dopo Range(Selection, Selection.End(xlDown)).Select). Questa variabile poi la inserirei al posto di tutte le dichiarazioni di Range fissi per ottenere così l'ordinamento in maniera relativa.

Tienici aggiornati
Ciao

Scuola 01-06-2008 08:21 PM

Ho provato così:

codice:

Public Sub Ordina_Click()

Dim selezione

    Range("F2").Select
    ActiveCell.Rows("1:1").EntireRow.Select
    ActiveCell.Activate
    Range(Selection, Selection.End(xlDown)).Select
   
selezione = Selection.Address
   
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=selezione, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:=selezione, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:=selezione, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
        xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:=selezione, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
        xlSortNormal
    With ActiveSheet.Sort
        .SetRange selezione
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
 
End Sub

Il problema è che mi da questo errore:

Quote:

errore di run-time '1004':
errore definito dall'applicazione o dall'oggetto
Hai idea come risolvere?
Grazie ancora
Ciao


Tutti gli orari sono GMT +2. Attualmente sono le 03:06 PM.