Selezionare RANGE

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
eltorpe
00domenica 15 aprile 2018 15:06
Buonasera,
all'interno di una SUB ho:

Dim area as Range
Set area = Application.ThisWorbook.Worksheets("INPUT").UsedRange

Questo mi setta nell'oggetto "area" tutta la parte del foglio utilizzata (tantissime righe).
Come dovrei modificare per settare in "area" solamente il RANGE (righe e realtive colonne) che contenga nella colonna B (data estesa) la data di oggi? (Il RANGE diventerebbe di una ventina di righe e 12 colonne).

Ringrazio
raffaele1953
00domenica 15 aprile 2018 21:14
Scusa, mà non capisco bene
Hai un'area, dove desideri selezionare solo le righe con la data di oggi()... Per far cosa?
Intendi eliminarle/copiarle con un unico comando?
Penso esista tale comando, mà non lo conosco. Casomai filtrarle, per un fare un ciclo for?
For Each Cl In Rg.SpecialCells(xlCellTypeVisible) ... lavora su (una ventina di righe e 12 colonne)
eltorpe
00domenica 15 aprile 2018 21:51
Ciao Raffaele,
mi occorre inserire nella variabile "area" (che poi utilizzerò, trasferendolo su una matrice, per compilare una TextBox) non l'intero UsedRange ma una parte di esso ed esattamente quello che che nella colonna B (data) ha la data di oggi. Facendolo manualmente risulta così modificato:
Dim area As Range
Set area = Application.ThisWorkbook.Worksheets("INPUT").UsedRange
Set area = Application.ThisWorkbook.Worksheets("INPUT").Range("A519", "J540".
Quel RANGE (A519-J540) l'ho messo manualmente in quanto porta nella colonna B la data di oggi (funziona perfettamente).
Vorrei modificare la parte finale in modo tale che domani non debba modificare manualmente l'istruzione (magari .Range("A541", "J560")), ma sia la Sub a rilevare (in base alla data di domani nelle righe che inserirò) il RANGE di mio interesse.
Spero di essere stato chiaro.
Grazie comunque
raffaele1953
00domenica 15 aprile 2018 22:36
>>>Quel RANGE (A519-J540) l'ho messo manualmente
Ok, mi sembra che hai DB in ordine di date...???
Mà a questo punto un ricerca di riga nella data odierna? (facile, oppure "desideri" una data più vecchia)
Mi sembra che dovrai allegare un file con adeguate spiegazioni (senza dati sensibili).
eltorpe
00lunedì 16 aprile 2018 09:01
Buongiorno,
certo il DB risulta "ordinato" in ordine di data in quanto i nuovi record che inserisco giornalmente vanno ad accodarsi a quelli già presenti. Pertanto gli ultimi 20 record circa portano nella colonna B la data odierna. Piuttosto che settarli giornalmente nella parte di codice che ho postato (che fa parte di una sub eseguita facendo click su apposito pulsante) vorrei trovare un codice che faccia quanto sotto:
Set area = Application.ThisWorkbook.Worksheets("INPUT").Range("Axxx", "Jzzz" in cui colonna B contiene data = Date().
locatevaresino
00lunedì 16 aprile 2018 10:07
ciao

principio di costruzione per la tua sub() memorizzare un Range()


Sub SelezionaRange()
Dim RigI As Long, NriF As Long
Dim i As Long, conta As Long
conta = 0
For i = 1 To Cells(Rows.Count, 2).End(xlUp).Row
If Cells(i, 2).Value = Date Then
If conta = 0 Then
RigI = i
conta = 1
Else
NriF = i
End If
End If
Next i
Set area = Application.ThisWorkbook.Worksheets("INPUT").Range(Cells(RigI, "A"), Cells(NriF, "J"))
Range(Cells(RigI, "A"), Cells(NriF, "J")).Select
End Sub



raffaele1953
00lunedì 16 aprile 2018 11:00
Un saluto a locatevaresino
>>>certo il DB risulta "ordinato" in ordine di data
vb
Sub cerca()
Dim R1 As Long, R2 As Long, Area As range, Rg As Object, Data As Date
Data = #1/2/2018# 'attento cerca il 2/1/2018
Set Area = Sheets("Foglio1").range("B:B")
Set Rg = Area.Find(Data, LookIn:=xlValues, LookAt:=xlWhole)
If Rg Is Nothing Then 'oppure If Not Rg Is Nothing Then togliendo le due righe sotto
    MsgBox "nessuna corrispondenza"
Else
    R1 = Rg.Row 'prima riga trovata
End If
Set Rg = Area.Find(Data + 1, LookIn:=xlValues, LookAt:=xlWhole)
If Rg Is Nothing Then
    MsgBox "nessuna corrispondenza"
Else
    R2 = Rg.Row - 1 'ultima riga trovata
End If
Set Area = Sheets("Foglio1").range(Cells(R1, 1), Cells(R2, 100))
'se non funziona
'Set Area = Sheets("Foglio1").range(Sheets("Foglio1").Cells(R1, 1), Sheets("Foglio1").Cells(R2, 100))
Set Rg = Nothing
Set Area = Nothing
End Sub
eltorpe
00lunedì 16 aprile 2018 21:49
Buonasera,
ho testato ed adattato entrambe le soluzioni. RINGRAZIO SENTITAMENTE per l'interessamento. Se posso, vorrei esprimere alcune considerazioni a soli fini informali e non certo critici (non avendo titolo alcuno per farlo).
La soluzione proposta da locatevaresino risponde appieno a quanto richiesto. Ho solo commentato (') Range(Cells(RigI, "A"), Cells(NriF, "J")).Select in quanto non interessato alla selezione del RANGE sul foglio, ma al solo trasferimento dello stesso sulla variabile area.
Ho trasferito la parte del codice per settare il RANGE ricercato sulla mia Sub e funziona perfettamente.
La soluzione proposta da Raffaele risulta un attimo più indaginosa soprattutto dal momento che, per trovare l'ultima riga del RANGE ha necessità di trovare la data successiva a quella del giorno di interesse Set Rg = Area.Find(Data + 1, LookIn:=xlValues, LookAt:=xlWhole) altrimenti va in errore. Funziona bene per trovare un RANGE intermedio all'interno del Database inserendo (magari con un InputBox) la data di interesse a patto che la riga dopo l'ultima con tale data abbia la data del giorno seguente altrimenti va in errore. Problema che si pone se per un giorno alla settimana (in genere la domenica) non aggungo righe.Se imposto Data=Date andrà sempre in errore in quanto dopo le righe inserite oggi ci saranno righe bianche (nessuna con la data di domani).
L'impegno a fornire un codice è comunque molto apprezzato e per questo ringrazio ancora.
Saluti
raffaele1953
00lunedì 16 aprile 2018 22:34
In effetti hai ragione, era solo per non ciclare tutte le righe (casomai fossero 50.000)
Comuque basterebbe avviare solo il primo Set Rg = Area.Find(Data......ed subito dopo
vb
For X = R1 To Ur
    If Cells(X, 2) = Data Then
        R2 = X
    Else
        Exit For
    End If
Next X

Circa 21 operazioni VBA (20 per le righe con date uguali + 1 di ricerca data iniziale)
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 19:17.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com