Pagina precedente | 1 | Pagina successiva
Facebook  

Selezionare RANGE

Ultimo Aggiornamento: 16/04/2018 22.34
Autore
Stampa | Notifica email    
Post: 17
Registrato il: 09/09/2017
Città: SASSARI
Età: 58
Utente Junior
2007
OFFLINE
15/04/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
Storicita del nuovo testamentoTestimoni di Geova Online...299 pt.16/10/2018 23.54 by Angelo Serafino53
Mariarosa Monaco (TGR Lombardia ex-TGR Basilicata)TELEGIORNALISTE FANS FORU...48 pt.16/10/2018 16.43 by CarliniCarlo
Monza Triestina 14/10 h 19:00blog191227 pt.16/10/2018 16.33 by TifosodaBG
Post: 3.359
Registrato il: 28/06/2011
Città: BINASCO
Età: 65
Utente Master
2007
OFFLINE
15/04/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)
------------------------------------
Un saluto Excel 2007 (se riesco capire il 2013)
Post: 17
Registrato il: 09/09/2017
Città: SASSARI
Età: 58
Utente Junior
2007
OFFLINE
15/04/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
Post: 3.361
Registrato il: 28/06/2011
Città: BINASCO
Età: 65
Utente Master
2007
OFFLINE
15/04/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).
[Modificato da raffaele1953 15/04/2018 22.38]
------------------------------------
Un saluto Excel 2007 (se riesco capire il 2013)
Post: 18
Registrato il: 09/09/2017
Città: SASSARI
Età: 58
Utente Junior
2007
OFFLINE
16/04/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().
Post: 2.071
Registrato il: 21/03/2008
Città: LOCATE VARESINO
Età: 70
Utente Veteran
2007 / 13
OFFLINE
16/04/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



Ciao da locate
excel 2007 / 13
Post: 3.363
Registrato il: 28/06/2011
Città: BINASCO
Età: 65
Utente Master
2007
OFFLINE
16/04/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
[Modificato da raffaele1953 16/04/2018 11.05]
------------------------------------
Un saluto Excel 2007 (se riesco capire il 2013)
Post: 19
Registrato il: 09/09/2017
Città: SASSARI
Età: 58
Utente Junior
2007
OFFLINE
16/04/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
Post: 3.367
Registrato il: 28/06/2011
Città: BINASCO
Età: 65
Utente Master
2007
OFFLINE
16/04/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)
------------------------------------
Un saluto Excel 2007 (se riesco capire il 2013)
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Home Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 01.27. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.5.0.0] - Copyright © 2000-2018 FFZ srl - www.freeforumzone.com