macro per selezionare colonna

Anonimo
2014-08-22T07:26:15+00:00

Ciao a tutti, 

devo automatizzare un'analisi su dei dati che presentano sempre lo stesso numero di colonne ma un diverso numero di righe.

Quello che ho fatto finora è scrivere la macro che mi calcola le varie cose che mi servono (sarebbe la fase finale del lavoro già affrontato qui: http://answers.microsoft.com/it-it/office/forum/office\_2013\_release-excel/contare-valori-univoci-per-data/14a85fc3-182c-495d-aa44-b17378f36ee7).

Il problema è che queste macro usano i riferimenti al primo set di dati: come faccio a creare un rifermento in base al numero di righe del set di dati utilizzato di volta in volta?

Avevo pensato di far selezionare le colonne e fargli dare un nome da utilizzare poi nelle formule, ma ho il problema che in alcune colonne mi serve dalla riga 2 alla riga n-1, poiché la n contiene un totale di cui non ho bisogno.

Vi lascio tutto il codice della macro, è ancora incompleto ma ci sono sicuramente altri errori che spero mi aiuterete a trovare.

Grazie

Sub macro_completa()

' cancella_date Macro

'

    Range("AE12").Select

    Range(Selection, Selection.End(xlDown)).Select

    Range(Selection, Selection.End(xlDown)).Select

    Selection.ClearContents

' riempimento_date Macro

'

'

    Range("AE11").Select

    Selection.DataSeries Rowcol:=xlColumns, Type:=xlChronological, Date:= _

        xlDay, Step:=1, Stop:=Range("AC2"), Trend:=False

' individua nomi commesse

    Range("V2:V706").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _

        "V2:V706"), CopyToRange:=Range("AD2"), Unique:=True

' da i nomi agli intervalli per le formule

' [FORMULA DA AIUTO MICROSOFT]

    'Range("c1", Range("c1").End(xlDown)).Select

' [FORMULA CON REGISTRATORE MACRO]

    'Range("J2").Select

    'Range(Selection, Selection.End(xlDown)).Select

    'Range("J2:J706").Select

    'ActiveWorkbook.Names.Add Name:="qta", RefersToR1C1:= _

    '   "=Foglio1!R2C10:R706C10"

' NUMERO SCONTR X GIORNO

    Range("AF11").Select

    Selection.FormulaArray = _

        "=SUM(IF(RC[-1]=date,1/COUNTIFS(date,RC[-1],R2C16:R706C16,R2C16:R706C16),0))"

    Selection.AutoFill Destination:=Range("AF11:AF41")

    Range("AF11:AF41").Select

' NUM SCONTRINI X GIORNO X COMMESSA

' calcolo commessa 1

    Range("AG11").Select

    Selection.FormulaArray = _

        "=SUM(IF((RC[-2]=R2C7:R706C7)*(R2C30=Criteria),1/COUNTIFS(R2C7:R706C7,RC[-2],R2C16:R706C16,R2C16:R706C16,Criteria,R2C30),0))"

    Selection.AutoFill Destination:=Range("AG11:AG41")

    Range("AG11:AG41").Select

' calcolo commessa 2

    Range("AK11").Select

    Selection.FormulaArray = _

        "=SUM(IF((RC[-6]=R2C7:R706C7)*(R3C30=Criteria),1/COUNTIFS(R2C7:R706C7,RC[-6],R2C16:R706C16,R2C16:R706C16,Criteria,R3C30),0))"

    Selection.AutoFill Destination:=Range("Ak11:Ak41")

    Range("AK11").Select

' calcolo commessa 3

    Range("AO11").Select

    Selection.FormulaArray = _

        "=SUM(IF((RC[-10]=R2C7:R706C7)*(R4C30=Criteria),1/COUNTIFS(R2C7:R706C7,RC[-10],R2C16:R706C16,R2C16:R706C16,Criteria,R4C30),0))"

    Selection.AutoFill Destination:=Range("AO11:AO41")

    Range("AO11").Select

' calcolo commessa 4

    Range("AS11").Select

    Selection.FormulaArray = _

        "=SUM(IF((RC[-14]=R2C7:R706C7)*(R5C30=Criteria),1/COUNTIFS(R2C7:R706C7,RC[-14],R2C16:R706C16,R2C16:R706C16,Criteria,R5C30),0))"

    Selection.AutoFill Destination:=Range("AS11:AS41")

    Range("AS11").Select

' IMP VENDUTO X COMMESSA

' calcolo commessa 1

    Range("AH11").Select

    ActiveCell.FormulaR1C1 = _

        "=SUMIFS(R2C12:R706C12,R2C7:R706C7,RC[-3],Criteria,Extract)"

    Range("AH11").Select

    Selection.AutoFill Destination:=Range("AH11:AH41")

    Range("AH11").Select

' calcolo commessa 2

    Range("AL11").Select

    ActiveCell.FormulaR1C1 = _

        "=SUMIFS(R2C12:R706C12,R2C7:R706C7,RC[-7],Criteria,R3C30)"

    Range("AL11").Select

    Selection.AutoFill Destination:=Range("AL11:AL41")

    Range("AL11").Select

' QTA VENDUTA X COMMESSA

   Range("AI11").Select

   ActiveCell.FormulaR1C1 = _

        "=SUMIFS(R2C10:R706C10,R2C7:R706C7,RC[-4],Criteria,Extract)"

    Range("AI11").Select

    Selection.AutoFill Destination:=Range("AI11:AI41")

    Range("AH11").Select

End Sub

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2014-08-26T06:59:53+00:00

...

Allo stesso modo ho aggiunto alla macro il salvataggio del file excel e del pdf del riepilogo con il nome che si crea in automatico. Qui c'è un altro limite poiché il salvataggio avviene correttamente solo nel pc che ha esattamente il percorso esplicitato nella macro. Poco male perché chi la userà lavorerà sempre dallo stesso posto ma è comunque un limite. 

Nessun limite, il percorso può essere adattato a necessità. Ad esempio:

ThisWorkbook.Path & "\File.pdf"

La risposta è stata utile?

0 commenti Nessun commento

7 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2014-08-22T13:31:03+00:00

    ...

    A me non  funziona, evidentemente sbaglio qualcosa.

    No, sbaglio io. L'istruzione corretta è la seguente:

    lr = Sheets("Foglio1").Cells(Rows.Count, 1).End(xlUp).Row

    oppure volendo utilizzare range:

    lr = Sheets("Foglio1").Range("A" & Rows.Count).End(xlUp).Row

    Entrambe restituiscono un numero e non selezionano nulla, se vuoi selezionare l'intera riga:

    Sheets("Foglio1").Rows(lr).Select

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-08-22T11:34:21+00:00

    ...

    In generale, la seguente consente di determinare l'ultima riga occupata per la colonna numeroColonna del foglio 'Foglio1':

    lr = Worksheets("foglio1").Range(Rows.Count, numeroColonna).End(xlUp).Row

    se l'ultima riga contiene un totale, la potrai escludere con:

    lr = lr - 1

    A me non  funziona, evidentemente sbaglio qualcosa.

    Devo prima dichiarare lr, giusto?

    Quindi scrivo:

    Sub ultima_riga()

    Dim lr As Long

    lr = Sheets("Foglio1").Range(Rows.Count, 1).End(xlUp).Row

    End Sub

    Inoltre non capisco se poi mi seleziona l'intera riga o no.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2014-08-22T10:40:31+00:00

    In generale, la seguente consente di determinare l'ultima riga occupata per la colonna numeroColonna del foglio 'Foglio1':

    lr = Worksheets("foglio1").Range(Rows.Count, numeroColonna).End(xlUp).Row

    se l'ultima riga contiene un totale, la potrai escludere con:

    lr = lr - 1

    Allo stesso modo è possibile determinare un intervallo variabile sul quale effettuare certe operazioni

    With Worksheets("foglio1")

      sRange = .Range(.Cells(2, "V"), .Cells(lr, "V")).Address

    End If

    [EDIT]

    Aggiungo che puoi sempre inserire ed utilizzare, anche in vba, un nome che fa riferimento ad un intervallo dinamico:

    =SCARTO(Foglio1!$C$2;0;0;CONTA.VALORI(Foglio1!$C2:$C1000))

    Uhm... forse la cosa più semplice è definire i nomi dal menù formule con l'intervallo dinamico e poi richiamarli nelle formule della macro...

    EDIT: Oppure, meno elegante ma ugualmente funzionale, gli faccio cancellare l'ultima riga della matrice dei dati...

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2014-08-22T08:10:20+00:00

    ...

    Il problema è che queste macro usano i riferimenti al primo set di dati: come faccio a creare un rifermento in base al numero di righe del set di dati utilizzato di volta in volta?

    ...

    In generale, la seguente consente di determinare l'ultima riga occupata per la colonna numeroColonna del foglio 'Foglio1':

    lr = Worksheets("foglio1").Range(Rows.Count, numeroColonna).End(xlUp).Row

    se l'ultima riga contiene un totale, la potrai escludere con:

    lr = lr - 1

    Allo stesso modo è possibile determinare un intervallo variabile sul quale effettuare certe operazioni

    With Worksheets("foglio1")

      sRange = .Range(.Cells(2, "V"), .Cells(lr, "V")).Address

    End If

    [EDIT]

    Aggiungo che puoi sempre inserire ed utilizzare, anche in vba, un nome che fa riferimento ad un intervallo dinamico:

    =SCARTO(Foglio1!$C$2;0;0;CONTA.VALORI(Foglio1!$C2:$C1000))

    La risposta è stata utile?

    0 commenti Nessun commento