Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 2 di 2 primaprima 12
Visualizzazione dei risultati da 11 a 14 su 14

Excel 2013 - "blindare" inserimento ore in celle excel

  1. #11
    stige non  in linea Scolaretto
    Post
    185
    Like Inviati  
    4
    Like Ricevuti  
    0
    Quote Originariamente inviato da Marius44 Visualizza il messaggio
    Ciao
    Se il codice cha postato tuo, allora il mio suggerimento non "troppo oltre" le tue conoscenze. Basta studiare la funzione SPLIT di VBA e applicarla. Prova e, al caso, scrivi specificando cosa non ti riesce di fare.

    Ciao,
    Mario
    Scusa Marius ma il codice non mio, le mie conoscenze sono quasi pari a zero, ho provato a guardare ma non ho quasi neanche capito i suggerimenti che mi sono stati gentilmente forniti.

    Un esempio da adattare magari potrebbe essere gi alla mia portata, ma la soluzione ad un problema che dopo diversi giorni non sono riuscito a risolvere, decisamente meno

  2. #12
    L'avatar di TheTruster
    TheTruster non  in linea Moderatore Globale Ultimo blog: Mouse Wheel in Visual Basic 6 - ActiveX
    Post
    7,245
    Blogs
    3
    Like Inviati  
    19
    Like Ricevuti  
    13
    Il problema che anche se si cerca di intercettare l'evento di Change dell'Oggetto Worksheet, Excel esegue prima il cambio di formato in base al valore, pertanto quello che digitiamo, come testo, non corrisponde all'effettivo valore della cella. Tuttavia, quando il formato della cella impostato come un orario, se cerchiamo di prendere il valore dall'effettivo testo della cella (Target.Text) anche questo - nel caso di valori con la virgola - assume un valore con coerente con l'orario digitato.

    L'unica soluzione che sono riuscito a trovare lavorare con le celle impostate in formato Testo. Questo evita qualsiasi intervento da parte di Excel nell'interpretazione dei dati inseriti che, di conseguenza, vengono lasciati cos come sono.

    Questo il codice che ho scritto e che dovrebbe funzionare:

    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Dim s As String 
    
        If Intersect(Target, Range("b2:c200")) Is Nothing Then Exit Sub
        
        Application.EnableEvents = False
        If InStr(Target.Text, ":") > 0 Then
            GoTo Exit_Point
        Else
            s = Target.Text
            s = Replace(s, ".", ":")
            s = Replace(s, ",", ":")
            Target.Value = s
        End If
    
    Exit_Point:
        Application.EnableEvents = True
     
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
        If Intersect(Target, Range("b2:c200")) Is Nothing Then Exit Sub
        
        Target.NumberFormat = "@"
    
    End Sub
    
    Come si pu notare, nell'evento ChangeSelection dell'oggetto Worksheet, viene ogni volta impostato il formato Testo sulla cella selezionata, se questa ricade nel Range delle celle contenenti un orario.

    TheTruster
    ℹ️ Leggi di pi su TheTruster ...

  3. #13
    Marius44 non  in linea Scolaretto
    Post
    360
    Like Inviati  
    0
    Like Ricevuti  
    5
    Buonasera a tutti
    Per avallare la mia proposta aggiungo la mia soluzione (molto simile a quella di @TheTruster (che saluto)
    Private Sub Worksheet_Change(ByVal Target As Range)
       
     '  Sheets(1).Activate
       
     '  Columns("A:A").NumberFormat = "dd/mm/yyyy"
     '  Columns("b:b").NumberFormat = "[h]:mm;@"
     '  Columns("c:c").NumberFormat = "[h]:mm;@"
     '  Columns("D:D").NumberFormat = "[h]:mm;@"
       
     '  Application.EnableEvents = True
       
       If Intersect(Target, Range("b2:c200")) Is Nothing Then Exit Sub
          On Error Resume Next
          orario = Split(Target.Text, ":")
          If UBound(orario) >= 1 Then GoTo Xit
          On Error GoTo 0
          Application.EnableEvents = False
          
          Cells.Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder _
          :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
              
          Cells(Target.Row, Target.Column) = Fix(Target.Value) / 24 + (Target.Value - Fix(Target.Value)) / 14.4
          Cells(Target.Row, Target.Column).NumberFormat = "[hh]:mm;@"
    Xit:
          Application.EnableEvents = True
     
    End Sub
    
    Ciao,
    Mario
    Ultima modifica di Marius44; 17-01-2021 18:41  Motivo: tagcode

  4. #14
    stige non  in linea Scolaretto
    Post
    185
    Like Inviati  
    4
    Like Ricevuti  
    0
    Quote Originariamente inviato da TheTruster Visualizza il messaggio
    Il problema che anche se si cerca di intercettare l'evento di Change dell'Oggetto Worksheet, Excel esegue prima il cambio di formato in base al valore, pertanto quello che digitiamo, come testo, non corrisponde all'effettivo valore della cella. Tuttavia, quando il formato della cella impostato come un orario, se cerchiamo di prendere il valore dall'effettivo testo della cella (Target.Text) anche questo - nel caso di valori con la virgola - assume un valore con coerente con l'orario digitato.

    L'unica soluzione che sono riuscito a trovare lavorare con le celle impostate in formato Testo. Questo evita qualsiasi intervento da parte di Excel nell'interpretazione dei dati inseriti che, di conseguenza, vengono lasciati cos come sono.

    Questo il codice che ho scritto e che dovrebbe funzionare:

    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Dim s As String 
    
        If Intersect(Target, Range("b2:c200")) Is Nothing Then Exit Sub
        
        Application.EnableEvents = False
        If InStr(Target.Text, ":") > 0 Then
            GoTo Exit_Point
        Else
            s = Target.Text
            s = Replace(s, ".", ":")
            s = Replace(s, ",", ":")
            Target.Value = s
        End If
    
    Exit_Point:
        Application.EnableEvents = True
     
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
        If Intersect(Target, Range("b2:c200")) Is Nothing Then Exit Sub
        
        Target.NumberFormat = "@"
    
    End Sub
    
    Come si pu notare, nell'evento ChangeSelection dell'oggetto Worksheet, viene ogni volta impostato il formato Testo sulla cella selezionata, se questa ricade nel Range delle celle contenenti un orario.

    TheTruster
    Ragazzi, vi ringrazio, siete fantastici, la soluzione di TheTruster funziona perfettamente, quella di Marius invece mi ripropone anomalie nei valori restituiti una volta digitati.

    Grazie ancora

+ Rispondi al messaggio
Pagina 2 di 2 primaprima 12

Potrebbero interessarti anche ...

  1. Risposte: 1
    Ultimo Post: 30-11-2017, 17:28
  2. Risposte: 5
    Ultimo Post: 03-04-2014, 18:05
  3. [Excel] Macro aggiungi testo "xxx" in cella "A1"
    Da dighitosz nel forum Microsoft Excel
    Risposte: 3
    Ultimo Post: 26-02-2013, 08:40
  4. Risposte: 14
    Ultimo Post: 25-12-2012, 19:30
  5. Risposte: 11
    Ultimo Post: 02-10-2012, 15:51