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
|