data Trova



  • data Trova
    di Textomb data: 11/08/2014 19:11:37

    Ho sempre temuto la ricerca dei valori con le date per via della mia incapacità ad interpretare correttamente i formati che Excel utilizza.
    Infatti qui, in allegato, ho un esempio di un errore causato da qualcosa che al momento non ho saputo decifrare.
    Quando ricerco una data in un elenco impostato in formato esteso "gggg gg/mmmm/aaaa" il codice mi funziona correttamente in Italiano [$-410] mentre in Inglese [$-409] non funziona più.
    Potrete scaricare l'esempio e vi renderete certamente conto.
    Il problema è che ho bisogno di ricercare la data nella colonna con la versione in inglese...
    Quale errore sto commettendo?
    grazie mille.



  • di scossa data: 11/08/2014 22:20:54

    Ricordo ancora una volta che il VBA con te "parla" in italiano (local) ma "pensa" in 'mericano.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Sub trova_Inglese()
    Dim myd As Range
    Dim data As Date
    
    data = Range("C1")
    
    Set myd = Range("a1:a20").Find(data, LookIn:=xlFormulas)
    MsgBox myd.Address
    
    
    End Sub
    



  • di Textomb data: 12/08/2014 00:33:12

    grazie mille per la risposta ma Ti prego di illuminarmi su una cosa che proprio non riesco a ficcarmela in testa.
    Ho appunto sostituito il file in allegato.
    I valori sono i medesimi ma stavolta provengono da un banalissimo calcolo.
    A questo punto xlFormulas non funziona più!!! E la cosa bella è che mentre prima in Italiano funzionava ora ha perso la funzionalità anche lì.
    Come devo procedere per risolvere il problema una volta per sempre?



  • di scossa data: 12/08/2014 09:11:38

    Come dicevo, purtroppo quei geni di MS fanno comunicare il VBA con l'utente in lingua locale, infatti sia che tu - nella finestra immediata del VBE - scriva
    ?format(Range("C1").value,"[$-410]dddd dd/mmmm/yyyy")
    o scriva
    ?format(Range("C1").value,"[$-409]dddd dd/mmmm/yyyy")

    otterrai sempre
    martedì 01/aprile/2014
    in lingua locale .......

    Quindi, visto che lato celle il formato viene recepito, la cosa più semplice è usare il "lato celle" per fare da interprete.

    N.B.: ovviamente non dobbiamo dichiarare la variabile data come date ma come string.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Sub trova_Inglese()
      Dim myd As Range
      Dim data As String
      
      data = Evaluate("=TEXT(C1,""[$-409]dddd dd/mmmm/yyyy"")")
      
      Set myd = Range("a1:a20").Find(data, LookIn:=xlValues)
      MsgBox myd.Address
    
    End Sub
    
    
    Sub trova_Italiano()
      Dim myd As Range
      Dim data As String
      
      data = Format(Range("C1"), "dddd dd/mmmm/yyyy")
      'oppure
      'data = Evaluate("=TEXT(C1,""[$-410]dddd dd/mmmm/yyyy"")")
      
      Set myd = Range("e1:e20").Find(data, LookIn:=xlValues)
      MsgBox myd.Address
    
    End Sub
    
    
    



  • di scossa data: 12/08/2014 09:50:21

    Ovviamente si potrebbe fare un'unica sub parametrizzando le variabili in gioco:



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    '
    'in un modulo standard
    '
    Sub trova_Multi(ByVal rng As Range, Optional ByVal sNumForm As String = "[$-410]dddd dd/mmmm/yyyy") 'Italiano per default
      Dim myd As Range
      Dim data As String
      
      data = Evaluate("=TEXT(C1,""" & sNumForm & """)")
      
      Set myd = rng.Find(data, LookIn:=xlValues)
      MsgBox myd.Address
    
    End Sub
    
    
    
    '
    ' nel modulo di classe del fogliodove inserisci due CommandButtton ActiveX
    '
    Private Sub CommandButton1_Click() 'Inglese
      Call trova_Multi(Range("a1:a20"), "[$-409]dddd dd/mmmm/yyyy")
    End Sub
    
    
    Private Sub CommandButton2_Click() 'Italiano
      Call trova_Multi(Range("e1:e20"))
    End Sub
    
    



  • di Textomb data: 12/08/2014 09:59:50

    Finalmente. Comunque tutto questo non è normale!!!
    Ieri ho perso tre ore senza trovare una soluzione valida. Alla fine il problema è che io parlo in Italiano. Lui invece lo legge in Inglese, però mi fa vedere il risultato nella mia lingua. Ma quando gli chiedo cosa vuole mi dice che in Inglese non lo capisce. E, ovviamente, neanche in Italiano. Booooh!!!!
    Meno male che tra lui e me ci sono esperti come Scossa (che ringrazio) che riescono a tradurre e raggirare i "dispetti" dell'interprete.
    Alla fine il codice definitivo che cercavo è il seguente.
    Grazie mille
     
    data = Evaluate("=TEXT(C1,""" & Range("a1").NumberFormat & """)")



  • di Textomb data: 12/08/2014 10:05:00

    ho letto dopo la Sub trova_Multi.
    Direi Eccelllente!
    grazie ancora



  • di lepat (utente non iscritto) data: 12/08/2014 10:06:32

    a me non funziona, data è una stringa, nelle celle non ci sono stringhe, ma numeri



  • di Textomb data: 12/08/2014 10:12:36

    Per errore nel file che ho allegato ho inserito la data da ricercare che non c'é in elenco (16/04/2014).
    Nei milioni di tentativi che ho fatto ho dimenticato di cambiarlo... Non vorrei che non te ne fossi accorto...



  • di scossa data: 12/08/2014 10:49:03

    Ovviamente va gestito il fallimento della ricerca.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Sub trova_Multi(ByVal rng As Range, Optional ByVal sNumForm As String = "[$-410]dddd dd/mmmm/yyyy")
      Dim myd As Range
      Dim data As String
      
      data = Evaluate("=TEXT(C1,""" & sNumForm & """)")
      
      Set myd = rng.Find(data, LookIn:=xlValues)
      If Not myd Is Nothing Then
        MsgBox myd.Address
        'resto del codice, quello serio
      Else
        MsgBox data & " non trovata!"
      End If
      
      Set myd = Nothing
    
    End Sub



  • di lepat (utente non iscritto) data: 12/08/2014 18:38:54

    Citazione

    Per errore nel file che ho allegato ho inserito la data da ricercare che non c'é in elenco (16/04/2014).
    Nei milioni di tentativi che ho fatto ho dimenticato di cambiarlo... Non vorrei che non te ne fossi accorto...


    infatti non mi ero accorto, grazie