+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20

Discussione: Contare righe

  1. #1
    firstcode non è in linea Novello
    Post
    13

    Contare righe

    Ciao,
    avrei una domanda su come fare un contatore specifico, purtroppo non ho trovato nulla cercando nel web

    Ho un file strutturato in questo modo:


    A B C D E F
    ------------------------------------------
    A 1 1 1 1 1
    A 1 1 1 1 1
    A 1 1 1 1 1
    A 1 1 1 1 1

    b 2 2 2 2 2
    b 2 2 2 2 2
    b 2 2 2 2 2

    c 3 3 3 3 3
    c 3 3 3 3 3
    c 3 3 3 3 3

    dunque con valori uguali che si ripetono nelle righe, poi una riga di intervallo, altri valori uguali che si ripetono, altra riga ... e così via. (le colonne B C D E F hanno valori diversi ma qui le ho messe uguali per comodità.


    su un foglio excel (es sheet1) ho attiva una macro con una variabile oSap che assumerà i valori di A,b,c ;per prima cosa dovrei trovare oSap in una colonna di un altro foglio (es sheet2); per ora sono riuscito a scrivere la parte che mi trova oSap nella colonna A e seleziona la prima cella dell'elenco

    codice:
     'definisco una variabile con contenuto di una cella o gà definita prima
     Dim oSap As Range
     Set oSap = Cells(1, 4)
    
    
     'faccio partire l ricerca che trova il valore ricercato
         Cells.Find(What:=oSap, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
             :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
             False, SearchFormat:=False).Activate

    ma ora non riesco ad andare oltre; ecco quel che mi servirebbe capire e fare:

    - con la prima cella selezionata vorrei contare le righe in cui c'è A (qui in totale 4, che iniziano dalla 1 ) e non ci riesco perchè me le conta comunque fino alla fine del foglio, utilizzando questo metodo

    codice:
     Contatore = ActiveSheet.UsedRange.Rows.Count
    ho provato a fare qualche esperimento anche con i cicli ma non riesco ad ottenere ciò che voglio
    forse basterebbe anche saper il numero della prima e ultima riga con A ( e così in seguito per 'b' e per 'c')



    - dopodichè, sempre dalla cella selezionata, dovrei muovermi verso destra e selezionare un range di colonne contigue per il numero di riche righe contenenti A, di cui a questo punto dovrei conoscere il valore, (per es "D1:F4")

    Per raggiungere questo risultato dovrei usare la notazione RC, non ci ho ancora provato perchè mi manca il primo dato (numero righe) ma se volete già darmi qualche consiglio, è ben accetto.

    Quindi poi dovrei selezionare e copiare il range altrove, ma questa è un'operazione che dovrei riuscire a compiere da solo.

    grazie in anticipo per tutti i suggerimenti

  2. #2
    L'avatar di Zer0Kelvin
    Zer0Kelvin non è in linea Scolaretto
    Luogo
    Teramo - provincia
    Post
    268
    Ciao.
    Innanzitutto un piccolo consiglio: i metodi Activate e Select(in genere usati assieme a riferimenti ad Activecell) andrebbero evitati come la peste ; normalmente non sono necessari e sono inaffidabili.
    Molto meglio assegnare il risultato ad una variabile.
    Seguendola tua logica:
    codice:
    'definisco una variabile con contenuto di una cella o gà definita prima
     Dim oSap As Range
     Dim rFind As Range
    Dim lRighe as LongPtr
     Set oSap = Cells(1, 4)
    
    
     'faccio partire l ricerca che trova il valore ricercato
        Set rFind =  Cells.Find(What:=oSap, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
             :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
             False, SearchFormat:=False)
      If not rFind is Nothing then '... (esegue le operazioni solo se Find ha successo)
    Adesso. per trovare il n° di righe si potrebbe usare il metodo End che seleziona(in questo caso) l'ultima cella prima della cella vuota, equivalente (se non ricordo male ) alla pressione dei tasti Control+Freccia giù:
    codice:
    lRighe=rFind.Row.End(xlDown)-rFind.Row + 1
    Questo metodo però fallisce se la cella trovata si trova subito prima della cella vuota.
    Altrimenti si può fare con un ciclo
    codice:
    lRighe=1
    
    Do While rFind=rFind.Offset(lRighe,0)
      lRighe=lRighe +1
    Loop
    In lRighe ci sarà il n° di righe desiderato.

    MA, visto che la tua necessità sembra essere di selezionare un'area rettangolare contigua, è possibile ottenerla con una singola istruzione...
    Supponendo che tu abbia(così come descritto nel post) sempre delle aree rettangolari circondate da celle vuote, si può ottenere l'area tramite la semplice istruzione
    codice:
    Dim rArea as Range
    ...
    ...
    Set rArea = rFind.CurrentRegion
    PS: alla fine della procedura, dopo aver fatto tutto ciò che devi, ricordati di settare a Nothing tutte le variabili oggetto (i Range, in questo caso)
    codice:
      Set rFind=Nothing
      Set rArea=Nothing
    End Sub
    Ultima modifica di Zer0Kelvin; 04-12-2016 05:46 
    __________________________
    [Excel 2010]
    -Condividere la conoscenza aumenta la ricchezza di tutti. (Z0°K)
    -Dai ad un uomo un e pesce lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
    -Il sonno della ragione genera mostri. (Francisco Goya)

  3. #3
    firstcode non è in linea Novello
    Post
    13
    Ciao, ti ringrazio per la risposta e mi scuso se non ho potuto replicare prima.

    purtroppo il codice che mi hai consigliato non funziona
    innanzi tutto, non so perchè, ma anche la prima parte che avevo scritto io adesso non va, nel senso che non mi trova il valore nella prima riga ma in una riga qualsiasi. a volte

    anche in una cella qualsiasi, fuori dalla colonna A
    poi ho provato un pò di combinazioni con i tuoi suggerimenti ma non mi cambia nulla, nel senso che ora trova il valore di A in una riga che sembra essere scelta a caso e poi conta

    comunque tutte le righe (lo so perchè ho messo un msgbox che mi indica il valore)

    Riassumendo, il codice dovrebbe essere questo, sai dirmi per favore dove sbaglio?

    codice:
    Sub contar ()
    
    'definisco una variabile con contenuto di una cella o gà definita prima
    
     Dim oSap As Range
     Dim rFind As Range
    Dim lRighe as LongPtr
     Set oSap = Cells(1, 4)
    
    Foglio2.activate 'attivo la ricerca nel foglio diverso
    
     'faccio partire l ricerca che trova il valore ricercato
        Set rFind =  Cells.Find(What:=oSap, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
             :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
             False, SearchFormat:=False)
      If not rFind is Nothing then '... (esegue le operazioni solo se Find ha successo)
    
    lRighe=1
    
    Do While rFind=rFind.Offset(lRighe,0)
      lRighe=lRighe +1
    Loop
    
    End sub
    mi pare di capire che manca l'istruzione del Conta e l'Else del blocco If

    grazie

  4. #4
    patel45 non è in linea Scolaretto
    Post
    116
    allega un file di esempio con anche il risultato desiderato im modo da poter testare il codice

  5. #5
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    14,567
    Blogs
    5
    Ricordo ancora una volta a tutti che qui non si allegano file e non si chiedono file per risolvere i problemi e fornire soluzioni tipo "pappa pronta".

    In questo forum NON si usa così.

    Torniamo a discutere del codice mostrato.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  6. #6
    patel45 non è in linea Scolaretto
    Post
    116
    allegare il file serve per testare facilmente, la pappa pronta c'è se il file lo allega chi risolve il problema, non se lo allega chi fa la richiesta.
    Comunque ho capito che non sono il benvenuto...

  7. #7
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    14,567
    Blogs
    5
    Nessuno ha detto che non sei il benvenuto, ma ti avevo già detto che qui non funziona con scambio di file. Se serve, l'utente può postare una url da cui scaricare il file ma la risposta non potrà essere un file completo e funzionante perché non è questo lo scopo di questo forum.
    Si dovrà ragionare sui problemi del codice fornendo suggerimenti che possano mettere sulla buona strada chi ha fatto la richiesta, magari dettagliandoli a favore di tutti i partecipanti.

    Grazie per la collaborazione.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  8. #8
    patel45 non è in linea Scolaretto
    Post
    116
    frequento diversi forum, è la prima volta che trovo un moderatore così scorbutico che colpisce anche prima che avvenga l'infrazione, la prima pagina è costellata di lucchetti, possibile che tutti gli utenti scorretti si siano riuniti su questo forum ? ti dovrebbe far riflettere, probabilmente un po' di gentilezza in più unita ad una manica un po' più larga non guasterebbe.

  9. #9
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    14,567
    Blogs
    5
    La gentilezza non c'entra e non dovresti permetterti di giudicare come io non lo faccio nei confronti della tua arroganza e presupponenza.

    Non c'è nulla da riflettere, abbiamo un regolamento e i moderatori servono a farlo rispettare.

    Se sei abituato a forum senza regole né regolamenti va benissimo, ma non dire come gestire questo, le maniche "larghe" o "strette" non sono decise da te.

    A questo punto, fine del flame e lasciamo che il thread si sviluppi tranquillamente.
    Ultima modifica di AntonioG; 16-12-2016 19:13 
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  10. #10
    L'avatar di Zer0Kelvin
    Zer0Kelvin non è in linea Scolaretto
    Luogo
    Teramo - provincia
    Post
    268
    Ciao.
    Il fatto che l'istruzione Find sembri trovare celle a caso è dovuto al fatto che viene usato Cells.Find che esegue la ricerca in qualunque cella.
    Per cercare in colonna A si usa
    Range("A:A").Find...eccetera
    Il codice completo sarebbe
    codice:
    Sub contar ()
    
    'definisco una variabile con contenuto di una cella o gà definita prima
    
     Dim oSap As Range
     Dim rFind As Range
     Dim lRighe as LongPtr
     Set oSap = Cells(1, 4)
    
    Foglio2.activate 'attivo la ricerca nel foglio diverso
    
     'faccio partire l ricerca che trova il valore ricercato
        Set rFind =  Range("A:A").Find(What:=oSap, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
             :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
             False, SearchFormat:=False)
        If not rFind is Nothing then '... (esegue le operazioni solo se Find ha successo)
            lRighe=1
            Do While rFind=rFind.Offset(lRighe,0)
                  lRighe=lRighe +1
            Loop
         else
             'quello che vuoi fare se il valore non viene trovato
         end if
    End sub
    Tieni presente che il metodo find può fallire a causa di determinate formattazioni (es. date).
    Ribadisco che se vi sono righe vuote sopra e sotto ogni blocco, come nell'esempio, il metodo migliore per contare le righe è
    codice:
    lRighe=rFind.Currentregion.Rows.Count
    __________________________
    [Excel 2010]
    -Condividere la conoscenza aumenta la ricchezza di tutti. (Z0°K)
    -Dai ad un uomo un e pesce lo avrai sfamato per un giorno; insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
    -Il sonno della ragione genera mostri. (Francisco Goya)

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi