+ Rispondi al Thread
Pagina 2 di 2 primaprima 12
Visualizzazione dei risultati da 11 a 16 su 16

Discussione: [excel 2016] di che oggetto ha bisogno Find ???

  1. #11
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    237
    Oh, tranquillo! Ti capisco perfettamente... Ora che il Find non ti da più problema riesci a recuperare la proprietà Column?

  2. #12
    LuDo non è in linea Scolaretto
    Luogo
    Parigi
    Post
    158
    Sgrubak, nel mio codice no, ma...

    Poffare, poffarbacco, Marius44 !!!
    Come è possibile: funziona! e posso ottenere perfino la colonna.
    Ma non vedo differenze sostanziali tra un tuo "Dim ... as Range" ed un mio "Dim... as Range".
    Com'è possibile?

    Cos'ha il tuo codice di diverso dal mio?
    Ultima modifica di LuDo; 22-01-2019 12:24 

  3. #13
    Marius44 non è in linea Scolaretto
    Luogo
    Catania
    Post
    310
    Ciao
    forse perchè (per risponderti ho fatto poche prove e non molto ortodosse) non ho dichiarato dd che, comunque, assume il value della cella.
    Onestamente non so risponderti .... ma almeno funziona.

    Grazie per il riscontro. Ciao,
    Mario

  4. #14
    LuDo non è in linea Scolaretto
    Luogo
    Parigi
    Post
    158

    Angry funziona solo 5 minuti !

    Non capisco.
    Qui sotto, il codice di Marius44 riadattato alla mia situazione.
    Ho osservato che con il Range "CaleDate" non c'era nulla da fare (Find non trova), allora mi sono detto che quel range aveva qualcosa di strano e ne ho fatto un altro ("CaleDate2") con gli stessi valori e gli ho detto di cercare la data che sta scritta in C5 (Cells(5, 3)).
    Funziona, ottengo la msgbox con la colonna e la data (giuste).

    Però nel mio Range ci voglio delle formule, allora ce le metto (ogni cella è il giorno precedente + 1). Non funziona più ed ottengo sempre la msgbox "nulla".
    Allora, alla riga Find, aggiungo "LookIn:=xlValues"; non funziona nemmeno adesso.
    Lascio perdere, mi do per vinto e torno alla situazione precedente: valori nelle celle e niente "LookIn:=xlValues" alla riga del Find.
    NON FUNZIONA PIU' !!! - Ma come è possibile...!


    codice:
    Sub Compila2()
    
    Dim rng As Range
    dd = Cells(5, 3).Value              'cella in cui ho inserito una data
    Set rng = Range("caleDate2").Find(dd)  'elenco di date
    If Not rng Is Nothing Then
      rng.Select
      c = rng.Column
      MsgBox c & " " & dd
    Else
        MsgBox "Niente"
    End If
    
    End Sub
    EDIT: Chiudo il file salvandolo, lo riapro e la macro adesso funziona, e persino sul Range "CaleDate" (il primo).
    Quindi c'è qualcosa che resta in memoria...
    Ultima modifica di LuDo; 23-01-2019 10:46 

  5. #15
    Marius44 non è in linea Scolaretto
    Luogo
    Catania
    Post
    310
    Ciao
    Come detto, le mie prove non erano molto ortodosse e, forse, occorre settare a Nothing rng prima di uscire dalla sub?

    Ciao,
    Mario

  6. #16
    LuDo non è in linea Scolaretto
    Luogo
    Parigi
    Post
    158

    ci siamo quasi...

    Di nuovo ciao a tutti.
    Non mi sono fatto vivo per tutto questo tempo perché continuavo a lavorare su questo progetto.
    Adesso sono arrivato ad un punto in cui posso fare la lista dei problemi incontrati. Vedrete che le soluzioni che ho adottato sono di aggiramento dei problemi e non di soluzione.
    Per prima cosa, ho scoperto che, quando gli facevo cercare delle date, Find non sopportava che nelle celle ci fossero formule, non ho capito perché. L’Argomento LookIn, che ho usato in tutti i sensi, non aveva nessun tipo di influenza. Ho risolto la questione mettendo delle date nelle celle, al posto delle formule. Vorrà dire che affiderò al VBA la loro compilazione.
    Poi, mi sono impicciato abbastanza con i Ranges. Apparentemente, una variabile Range ha veramente bisogno di coccole e comprensione: bisogna dichiararla con cura, bisogna valorizzarla con Set, spiegarle che mamma tornerà a prenderla dopo pranzo ed asciugare le sue lacrime. Da quello che ho capito, una variabile lasciata Variant prende da sola il formato del valore che riceve. Invece una variabile Range non ha ancora questa autonomia, un po’ come se stesse alla scuola materna nella sezione dei piccoli.

    Per memoria, ricordo che mi è tecnicamente impossibile postare il file, ma ne posso sintetizzare di nuovo la struttura: un range chiamato “lista in cui si fa l’elenco degli “eventi”: un evento è un congedo strutturato in un nome (es.: Mario), una data di cessazione (es.: 13/01/2019) ed una data di riassunzione (es.: 17/01/2019), poi un campo note. In questo Range “lista” posso mettere quanti congedi voglio, uno per riga. Quindi, una serie di calendari, uno per mese, i quali hanno le date sulle colonne di una riga. I calendari sono composti di tre Ranges: le date (caleDate), i nomi (caleNomi) che invece stanno in colonna a sinistra del calendario, e infine il range dei risultati che non è altro che l’intersezione fra le colonne delle date e le righe dei nomi. Tutto questo dodici volte, per avere in un’unica stampa un quadro complessivo dell’intero anno.
    Adesso, sono arrivato a scrivere un codice un po’ complesso, in grado di compilare dodici mesi di calendario per i congedi di tutto un servizio. Mi servo di una funzione che mi trova la colonna in cui è situata una certa data, e funziona nella maggior parte dei casi. Ho infatti superato uno ad uno i problemi di cui sopra e adesso mi intoppo su un altro aspetto del funzionamento di Find: l’argomento After. Infatti, se una data di cessazione coincide con il primo giorno del mese, Find ha bisogno di cominciare la ricerca “dopo” almeno la seconda cella, altrimenti non troverà mai la prima.
    Ebbene, i miei Find non riconoscono il parametro after:=. Prova ne è che se lo scrivo tutto minuscolo, l’iniziale non diventa mai maiuscola. In più, per la variabile contenente l’oggetto della ricerca, ho provato a specificare prima “what:=” e neanche questo prende l’iniziale maiuscola…
    Che cosa succede?
    Ecco qui sotto il codice attuale, con la funzione in cui ho annullato i tentativi infruttuosi di parametrare Find.
    Grato per qualsiasi consiglio.
    codice:
    Sub compila()
    For m = 1 To 12
        Call compilaMese2(m)
        'r = MsgBox(m & " - Continuo?", vbYesNo)
        'If r = vbNo Then Exit Sub
    Next m
    End Sub
    
    Sub compilaMese2(m) 'versione in corso
    Dim nome As String, note As String
    Dim cess, riass
    Dim riga As Integer, colRiass As Integer, colCess As Integer, mese As Range, giorni As Range, calnomi As Range  ', rgCess As Range
    
    Application.FindFormat.Clear 'cancella i formati delle ricerche precedenti (è utile?)
    
    Select Case m
    
    Case 1
    Set mese = ActiveSheet.Range("gennaio")
    Set giorni = ActiveSheet.Range("caleDate01")
    Set calnomi = ActiveSheet.Range("caleNomi01")
    
    Case 2
    Set mese = ActiveSheet.Range("febbraio")
    Set giorni = ActiveSheet.Range("caleDate02")
    Set calnomi = ActiveSheet.Range("caleNomi02")
    
    
    Case 3
    Set mese = ActiveSheet.Range("marzo")
    Set giorni = ActiveSheet.Range("caleDate03")
    Set calnomi = ActiveSheet.Range("caleNomi03")
    
    
    Case 4
    Set mese = ActiveSheet.Range("aprile")
    Set giorni = ActiveSheet.Range("caleDate04")
    Set calnomi = ActiveSheet.Range("caleNomi04")
    
    
    Case 5
    Set mese = ActiveSheet.Range("maggio")
    Set giorni = ActiveSheet.Range("caleDate05")
    Set calnomi = ActiveSheet.Range("caleNomi05")
    
    
    Case 6
    Set mese = ActiveSheet.Range("giugno")
    Set giorni = ActiveSheet.Range("caleDate06")
    Set calnomi = ActiveSheet.Range("caleNomi06")
    
    
    Case 7
    Set mese = ActiveSheet.Range("luglio")
    Set giorni = ActiveSheet.Range("caleDate07")
    Set calnomi = ActiveSheet.Range("caleNomi07")
    
    
    Case 8
    Set mese = ActiveSheet.Range("agosto")
    Set giorni = ActiveSheet.Range("caleDate08")
    Set calnomi = ActiveSheet.Range("caleNomi08")
    
    
    Case 9
    Set mese = ActiveSheet.Range("settembre")
    Set giorni = ActiveSheet.Range("caleDate09")
    Set calnomi = ActiveSheet.Range("caleNomi09")
    
    
    Case 10
    Set mese = ActiveSheet.Range("ottobre")
    Set giorni = ActiveSheet.Range("caleDate10")
    Set calnomi = ActiveSheet.Range("caleNomi10")
    
    
    Case 11
    Set mese = ActiveSheet.Range("novembre")
    Set giorni = ActiveSheet.Range("caleDate11")
    Set calnomi = ActiveSheet.Range("caleNomi11")
    
    
    Case 12
    Set mese = ActiveSheet.Range("dicembre")
    Set giorni = ActiveSheet.Range("caleDate12")
    Set calnomi = ActiveSheet.Range("caleNomi12")
    
    End Select
    
    
    'prendo valori formati delle celle esempio (customizzabili)
    fA = ActiveSheet.Range("FtAss").Interior.ColorIndex 'impiegato assente
    fP = ActiveSheet.Range("FtPres").Interior.ColorIndex 'impiegato presente
    fO = ActiveSheet.Range("FtOcc").Interior.ColorIndex 'periodo occupato (Servizio)
    
    'vuoto CaleRisultati da valori e formati precedenti
    With mese
        .ClearContents
        .Interior.ColorIndex = fP
        .HorizontalAlignment = xlLeft
    End With
    
    NrRgLista = Range("lista").Rows.Count
    mini = Application.WorksheetFunction.Min(giorni)
    massi = Application.WorksheetFunction.Max(giorni)
    mini = CDate(mini)
    massi = CDate(massi)
    'MsgBox mini & " - " & massi 'FUNZIONA!
    colMin = TrovaColonna(mini, giorni)
    colMax = TrovaColonna(massi, giorni)
    'MsgBox colMin & " - " & colMax 'FUNZIONA!
    For i = 2 To NrRgLista  'per ogni evento della lista, esclusa la prima riga (nomi di campi)
    With Range("lista").Rows(i)
        nome = .Cells(1).Value
        cess = .Cells(2).Value
        riass = .Cells(3).Value
        note = .Cells(4).Value 'il secondo campo note non viene trattato
        If note <> "" Then
            frmt = fO
        Else
            frmt = fA
        End If
    End With
    
    riga = calnomi.Find(nome).Row 'trova nel calendario la riga con quel nome
    
    
    If nome <> "" Then
    
        If mini < cess And cess < riass And riass < massi Then
            colCess = TrovaColonna(cess, giorni)
            colRiass = TrovaColonna(riass, giorni)
            Cells(riga, colCess).Value = "c"
            Cells(riga, colCess).HorizontalAlignment = xlRight
                If note <> "" Then
                    Cells(riga, colCess + 1).Value = note
                    Cells(riga, colCess).Value = ""
                End If
            Cells(riga, colRiass) = "r"
            Range(Cells(riga, colCess + 1), Cells(riga, colRiass - 1)).Interior.ColorIndex = frmt
    
    
        ElseIf cess < mini And mini < riass And riass < massi Then
            colRiass = TrovaColonna(riass, giorni)
            Cells(riga, colRiass) = "r"
            Range(Cells(riga, colMin), Cells(riga, colRiass - 1)).Interior.ColorIndex = frmt
    
    
        ElseIf mini < cess And cess < massi And massi < riass Then
            colCess = TrovaColonna(cess, giorni)
            Cells(riga, colCess) = "c"
            Range(Cells(riga, colCess), Cells(riga, colMax - 1)).Interior.ColorIndex = frmt
    
    
        ElseIf cess < riass And riass < mini Then
            'nulla
    
        ElseIf massi < cess And cess < riass Then
            'nulla
    
        Else
            MsgBox (nome & " - " & cess & " - " & riass & Chr(10) & mese & Chr(10) & "qualcosa non va...")
    
        End If
    
    
    
    End If
    Next
    End Sub
    
    Function TrovaColonna(cosaCerchi, dove As Range) ' usata in compila
    'Dim ultima As Range
    Dim dove2 As Range
    'Set ultima = dove.Cells.Count
    Set dove2 = dove.Find(cosaCerchi) ', after:=ultima)
    If dove2 Is Nothing Then
        TrovaColonna = 0
    Else
        TrovaColonna = dove2.Column
    End If
    End Function

+ Rispondi al Thread
Pagina 2 di 2 primaprima 12

Permessi di invio

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