Posizionarsi su prima riga visibile



  • Posizionarsi su prima riga visibile
    di marinoernestoch data: 26/11/2013 10:34:02

    Buon giorno.
    Ho tre quesiti: questo è il terzo.
    Dopo aver visualizzato tutte le righe necessarie (frammezzo a righe nascoste-vedere discussione "SCROLL di righe") vorrei posizionarmi all'inizio.
    L'opzione Application.ScreenUpdating è già su True.
    L'area chiamata "possibili_richieste" è nella cella K1.
    La prima riga contiene, nelle prime colonne, i titoli.
    Infine la prima riga è BLOCCATA.
    Desidero, al termine della macro posizionarmi sul cella di richiesta, ma anche vedere nelle videata le primi righe mostrate.
    Con le righe di codice postate, pur puntando alla cella voluta, a video mi appaiono solo le ultime righe che ho precedentemente mostrato.
    E' possibile sapere, senza costruire ulteriori istruzioni, la prima riga visibile del foglio?
    Farei un select su di essa e poi un nuovo select sull'area "Possibili_richieste".
    Ringrazio
     
     Range("possibili_richieste").Select
      Range("possibili_richieste").Offset(1, 0).Select
        Range("possibili_richieste").Select



  • di Vecchio Frac data: 26/11/2013 14:30:11

    Ma [K1].select non risolve già da sè il problema?
    Si può vedere un esempio?





  • di marinoernestoch data: 26/11/2013 15:38:07

    No non risolve il problema xchè la prima riga è bloccata, quindi sempre visibile.
    Per cui facendo la prima select al campo "possibili risposte" si posiziona sulla riga già presente a video, ma non mi fa vedere quelle IMMEDIATAMENTE successive.
    La successiva select con offset, mi va su una riga nascosta e quindi non contraggiorna la mappa.
    Nell'attesa di sapere se esiste una funzione che mi da direttamente la "prima riga visibile del foglio", ho inserito nel loop: "prima_riga_visibile = IIf(prima_riga_visibile = 0, riga, prima_riga_visibile)" immediatamente prima di "Rows(riga).EntireRow.Hidden = False ' quella che serve la faccio vedere "
    dove "riga" identifica la riga del foglio che voglio rendere visibile.
    Alla fine del loop ho inserito, in luogo delle 3 select allegate inizialmente:
    Cells(prima_riga_visibile, Range("link").Column).Select
    Range("possibili_richieste").Select


     
    for .....
    If binario(indicefinale) Then   ' se in ON la riga si riferisce ad un indice richiesto 
       prima_riga_visibile =  IIf(prima_riga_visibile = 0, riga, prima_riga_visibile) 
       Rows(riga).EntireRow.Hidden = False   ' quella che serve la faccio vedere  
    .....
    end if
    
    next ....
    
    Cells(prima_riga_visibile, Range("link").Column).Select
    Range("possibili_richieste").Select
    



  • di Vecchio Frac data: 26/11/2013 15:49:39

    Allora ti do uno spunto di riflessione.
    Se le righe da 2 a 10 sono nascoste, la riga seguente
    [a2:a20].specialcells(xlCellTypeVisible)(1).select
    seleziona la prima cella visibile del range A2:A20 (nell'esempio, seleziona A11).





  • di marinoernestoch data: 26/11/2013 16:21:48

    Perfetto.
    Ho inserito
    Range("A2:A" & ultimariga).SpecialCells(xlCellTypeVisible)(1).Select

    dove ultimariga contiene il numero complessivo di righe usate nel foglio.
    Ora, delle tre discussioni odierne, mi resta in essere la domanda sullo scroll.
    grazie mille



  • di isy data: 26/11/2013 19:49:05

    Cit: Ora, delle tre discussioni odierne, mi resta in essere la domanda sullo scroll.

    Puoi allegare un esempio della pagina da provare (togli prima eventuali dati sensibili)



  • di marinoernestoch data: 26/11/2013 21:58:13

    La macro si attiva modificando il valore in K1 o L1 (area chiamata possibili_richieste).
    La formula in N1 assume il valore richiesto. Se L1 è compilato, K1 è ignorato.
    Per vedere tutto inserire 0 in L1. Di norma lavorare con K1 (singola richiesta).
    Per lavorare con logica binaria lavorare con L1.
    Le istruzioni topiche sono identificate la due serie di >>>>>>>>>>.
    I dati del foglio sono di dominio pubblico, scaricati dal sito yahoo.finance (occhio, contengono qualche errore) e raggruppati insieme.



  • di isy data: 26/11/2013 23:44:30

    Ciao

    Allego il file, stai forse cercando uno scorrimento simile...



  • di marinoernestoch data: 27/11/2013 09:09:03

    Grazie dell'impegno.
    E' un qualcosa di simile. Solo che non volevo rendere fisso il num.di riga da cui fare lo scroll: sarei vincolato a tenere una finestra o uno zoom con predefiniti valori. Il mio auspicio era che ci fosse una funzione che mi diceva quando arrivavo all'ultima posizione del video. Inoltre con l'istruzione che proponi mi fa sparire anche la prima riga di testata.



  • di isy data: 27/11/2013 10:05:50

    Ciao
    Cit: E' un qualcosa di simile. Solo che non volevo rendere fisso il num.di riga da cui fare lo scroll: sarei vincolato a tenere una finestra o uno zoom con predefiniti valori.

    Senza il tuo foglio che hai allegato non avrei potuto proporre nulla di valido.
    Se puoi definire con precisione alcune regole:
    Se tutte le righe che compaiono sul foglio hanno la stessa altezza è possibile chiedere quante sono quelle visualizzate e impostare questo numero come limite per settare lo scroll

    Se inserisci tutte le variabili che utilizzi possiamo suggerire precise soluzioni.
    Indicaci se non devi davvero bloccare i titoli ad esempio...




  • di marinoernestoch (utente non iscritto) data: 27/11/2013 11:34:50

    Ciao isy.
    I titoli devo rimanere bloccati, per estetica, ma sopratutto perchè è in quella riga che devono essere inserite le scelte operative (v.istruzioni). Non ci sono altre particolarità, oltre a quello già scritto.
    Usando il foglio come se fosse un dbase, tutte le righe hanno la stessa altezza.
    Ovviamente, essendo in un sistema grafico, anche se la dimensione dei caratteri non dovrebbe cambiare mai, lascio all'esigenza del momento, trascinare le dimensioni della finestra ed il valore dello zoom. Per questo motivo non posso assumere un valore fisso come numero di righe visibili. Ribadisco quindi che l'intendimento era solo sapere (xchè ignoro e xchè non so dove cercare, se non appoggiandomi a forum frequentato da persone preparate) se esiste una funzione in excel che mi dica l'ultima riga che è possibile visualizzare su una finestra.
    Una specie di funzione che applichi la formula : num. pixel della finestra attiva sottratto num. pixel delle barre visualizzate, moltiplicato in fattore di zoom, diviso l'altezza delle righe ottengo quante righe posso visualizzare. Farlo come utente mi sembra pazzesco!



  • di marinoernestoch data: 27/11/2013 12:50:22

    Ho trovato una soluzione di compromesso:
    "Cells(riga, Range("link").Column + 1).Select" , inserita dopo "Rows(riga).EntireRow.Hidden = False" .
    Quando "riga" è visualizzata nella parte finale della mappa, questa istruzione fa uno scroll di mezza pagina, portando la riga in questione al centro del video, lasciando spazio per le successive righe.

     
    ' >>>>>>>>>>>>>>>>>>>>>>>    qui quello che manca
                        If binario(indicefinale) And _
                            UCase(Cells(riga, Range("monitorare").Column)) <> "N" _
                            Then    ' se in ON la riga si riferisce ad un indice richiesto
                          '  prima_riga_visibile = IIf(prima_riga_visibile = 0, riga, prima_riga_visibile)
                          ' sostituita da specialcell
                             Rows(riga).EntireRow.Hidden = False  ' quindi faccio vedere la riga
         ' >>>>>>>>>>>>      ' con l'istruzione sotto attivata "sfarfalla e vedo solo una riga
         ' >>>>>>>>>>>>      'ActiveWindow.ScrollRow = riga   ' ActiveCell.Offset(riga).Row
                           ' soluzione di compromesso
                                 Cells(riga, Range("link").Column + 1).Select 
                            ' fine soluzione di compromesso 
                        End If  'binario in on
         ' >>>>>>>>>>>>>>>>>>>>>>>    fine qui quello che manca



  • di isy data: 27/11/2013 13:33:53

    Cit: Ho trovato una soluzione di compromesso:

    Quasi ci siamo..
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Range(Target.Address), Range("possibili_richieste")) Is Nothing Then
         
     ' quando si lavorava con le formule nel foglio
     '   Application.ScreenUpdating = False
     '   ActiveSheet.Range("$A:$A").AutoFilter Field:=1
     '   'ActiveSheet.Range("$A$1:$N$251").AutoFilter Field:=1, Criteria1:="S"
     '   ActiveSheet.Range("$A:$A").AutoFilter Field:=1, Criteria1:="S"
     '   Application.ScreenUpdating = True
    ' Sub Macro1() quando era routine non attivata da evento change
    '
    ' quando invece si valora con la macro attivata dall'evento
    Dim riga, prima_riga_visibile, colonna, ultimariga, ultimacolonna As Integer
    Dim binario(6) As Boolean
    Dim indice, indicefinale, contatore, partenza As Integer
    
    
    Application.ScreenUpdating = False
    Cells.EntireRow.Hidden = False
    HeightRighe = Application.ActiveWindow.VisibleRange.Rows.Height
    ultimariga = Range("link").End(xlDown).Row
    ultimacolonna = Range("link").Column
    
    contatore = 32
    partenza = Range("richiesta").Value
    Range("2:" & ultimariga).EntireRow.Hidden = True
    Application.ScreenUpdating = False
    If partenza = 0 Or partenza > 63 Then
    '  Selection.EntireRow.Hidden = False
      'Range("possibili_richieste").Select
    Else
      Application.ScreenUpdating = True
      contatore = 32
      partenza = Range("richiesta").Value
    
    '   primo passo trasformo il valore inserito (max 63= tutto acceso) e accendo i rispettivi
    '   valori boleani, secondo la codifica binaria:
    '   1 = 1;  2 = 2;  3 = 4; 4 =8; 5 = 16; 6 = 32
    ' es. valore inserito è 3, allora accendo 1 e 2 perchè 1+2 fa 3
    ' es. valore inserito è 8, alla accendo 4 perchè corrisponde all'8
    ' es. valore inserito è 15, allora accendo 4,3, 2, 1 perchè 8 +4 +2+1 = 15
        '    xx = WorksheetFunction.Dec2Bin(aa)
        For indice = 6 To 1 Step -1
            If partenza >= contatore Then
                binario(indice) = True
                partenza = partenza - contatore
                
            End If
            If partenza = 0 Then Exit For
            contatore = contatore / 2
        Next indice
    ' qui ho nascosto tutto e se trovo righe relative a titoli di indici richiesti la faccio vedere
    '    Range(Target.Address).Activate ' "possibili_richieste").Activate
        For riga = 2 To ultimariga   ' da qui lavoro per tutte le righe occupate
            For colonna = 1 To ultimacolonna - 1  ' da qui lavoro per le colonne occupate fino al LINK
               
            
                If VarType(Cells(riga, colonna).Value) = vbString Then  ' solo se il valore è alfabetico
                    indice = InStr(Cells(riga, colonna).Value, " ")      ' trovo lo spazio
                    If indice > 0 Then                                   ' solo se c'è spazio
                        indice = CInt(Left(Cells(riga, colonna), indice - 1)) 'allora ricavo il num. indice di borsa
                        contatore = 32                                               ' secondo la codifica binaria
                        For indicefinale = 6 To 1 Step -1     ' ora dall'indice di borsa risalgo
                             If indice = contatore Then Exit For ' ed esce quanto l'indice corrisponde al
                                contatore = contatore / 2            'sottomultiplo del 2
                        Next                                 ' es se 32 è il 6; se 16 è il 5 e così via
                   'indicefinale contiene l'indice dell'array boleana corrispondente
                   ' al valore numerico della stringa INDICE AZIONARIO
         ' >>>>>>>>>>>>>>>>>>>>>>>    qui quello che manca
                        If binario(indicefinale) And _
                            UCase(Cells(riga, Range("monitorare").Column)) <> "N" _
                            Then    ' se in ON la riga si riferisce ad un indice richiesto
                          '  prima_riga_visibile = IIf(prima_riga_visibile = 0, riga, prima_riga_visibile)
                          ' sostituita da specialcell
                             Rows(riga).EntireRow.Hidden = False  ' quindi faccio vedere la riga
                             
         ' >>>>>>>>>>>>      ' con l'istruzione sotto attivata "sfarfalla e vedo solo una riga
         ' >>>>>>>>>>>>      'ActiveWindow.ScrollRow = riga   ' ActiveCell.Offset(riga).Row
                        If (Rows(riga).Top + (Rows(riga).Height * 2)) >= HeightRighe Then
                          ActiveWindow.SmallScroll Down:=1
                        End If
                         End If  'binario in on
         ' >>>>>>>>>>>>>>>>>>>>>>>    fine qui quello che manca
                    End If ' indice > 0
            
                End If   ' il valore cella è una stringa
            Next colonna   ' per tutte le colonne fino al LINK
        Next riga      'per tutte le righe occupate
        
        'Cells(prima_riga_visibile, Range("link").Column).Activate
    ''''    Range("A2:A" & ultimariga).SpecialCells(xlCellTypeVisible)(1).Select
    ''''    Range("possibili_richieste").Activate
       '
    End If     'fine valore inseriro valido
    Application.ScreenUpdating = True
    ' End Sub quando era routine non attivata da evento change
    
    End If
    End Sub
    



  • di marinoernestoch data: 27/11/2013 17:52:57

    Complimenti isy. Era quello che volevo. Ho fatto un paio di prove modificando zoom e dimensione finestra.
    Funziona.
    Grazie



  • di Vecchio Frac data: 27/11/2013 21:20:38

    Per evitare lo sfarfallio usa Application.ScreenUpdating settato a False e poi lo reimposti su True all'uscita.





  • di marinoernestoch data: 27/11/2013 21:54:47

    Forse la parola sfarfallio non era completamente calzante: quello che succedeva era che la riga veniva visualizzata all'inizio della finestra e subito dopo, a seguito di scroll, spariva. Lo screenupdate a true era lasciato di proposito per veder l'incremento delle righe visualizzate dalla routine.
    Comunque il problema è stato risolto, su suggerimento di isy.
    Una considerazione: certo che conoscere tutte le possibilità offerte dal VBA di Excel, uno si fa centenario!



  • di Vecchio Frac data: 27/11/2013 22:04:41

    LOL e credimi, ce n'è ancora da scoprire ^_^