date USF > date Excel : inversé

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour
Par hasard j'ai remarqué que les nouvelles dates ( avant c'était manuel dans excel) entrées via l'USF étaient inversées
dans Excel par exemple : 05/02/2016 ( 5 février ) donne 02/05/2016 dans excel
j'ai essayé pas mal de choses mais rien
sauf en créant un nouveau : OK , mais si traitement de date ensuite est ce que A1 et B1 seront interprétées comme telles ??
Merci
 

Pièces jointes

  • test_date.xlsm
    158.2 KB · Affichages: 39
  • Classeur1.xlsm
    16.9 KB · Affichages: 32
  • test_date.xlsm
    158.2 KB · Affichages: 39
  • Classeur1.xlsm
    16.9 KB · Affichages: 27

pierrejean

XLDnaute Barbatruc
Re : date USF > date Excel : inversé

bonjour herve

Ne pas perdre de vue que les textBox ne contiennent que du Texte
Pour avoir une date il faut utiliser Cdate()
Pour le fichier test_date sub a modifier:

Code:
Private Sub OK_Click()
If valid = 1 Then
MsgBox " Vous avez déjà validé "
Exit Sub
End If
With Worksheets("ETAT")
dlig = (.Range("a1000").End(xlUp).Row) + 1
'MsgBox dlig
For n = 1 To 10
If IsDate(Controls("Box" & n).Value) Then
  valeur = CDate(Controls("Box" & n).Value)
Else
 valeur = Controls("Box" & n).Value
End If
.Cells(dlig, n).Value = valeur
Next n
    If CheckBox1 = True Then
    .Cells(dlig, 11) = "ü"
   End If


End With
valid = 1
tri
End Sub
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : date USF > date Excel : inversé

Bonsoir
N'aimant pas laisser subsister les doutes , j'ai quand même repris les 2 fichiers , car je pense que ce forum sert aussi à comprendre et s'améliorer en Excel-vba !
donc je joins à nouveau les 2 fichiers ou j'ai appliqué la même instruction pour les 2 box ( sans Cdate) et comme au début : Pourquoi Cela fonctionne dans "Classeur1" et pas dans l'autre "test_date" ??
Merci bonne soirée
 

Pièces jointes

  • Classeur1.xlsm
    20.6 KB · Affichages: 31
  • test_date.xlsm
    155.8 KB · Affichages: 33
  • Classeur1.xlsm
    20.6 KB · Affichages: 32
  • test_date.xlsm
    155.8 KB · Affichages: 41

Si...

XLDnaute Barbatruc
Re : date USF > date Excel : inversé

salut

Tu sembles confondre le format du contrôle avec celui de la cellule.
Le premier n'est pas directement transmis.
Teste chacune des lignes ajoutées
Code:
...
For n = 1 To 10
  .Cells(dlig, n).Value = Controls("Box" & n).Value
‘celle-ci 
‘ If n = 8 Or n = 9 Then .Cells(dlig, n) = Format(Controls("Box" & n), "dd mm yyyy")
  'ou celle-là
 ' If n = 8 Or n = 9 Then .Cells(dlig, n) = CDate(Controls("Box" & n))
Next n
 

Docmarti

XLDnaute Occasionnel
Re : date USF > date Excel : inversé

Bonjour.

À partir de VBA
Règle pour éviter l'inversion jour/mois dans les cellules:

- ne pas envoyer une date de type String dans une cellule dont le format de nombre n'est pas Texte.
- ne pas envoyer une date de type Date dans une cellule dont le format de nombre est Texte.

Donc, on peut
- envoyer une date de type Date uniquement dans une cellule dont le format de nombre n'est pas Texte.
- envoyer une date de type String uniquement dans une cellule dont le format de nombre est Texte.

Si on ne respecte pas cette règle, il y a inversion jour/mois.

Exemple de code :

Code:
Private Sub OK_Click()
 
With Worksheets("ETAT")
dlig = (.Range("a1000").End(xlUp).Row) + 1

For n = 1 To 10
   
CestUneDate = False

If Controls("Box" & n).Value <> "" Then
  
 If IsNumeric(Controls("Box" & n).Value) = False And IsDate(Controls("Box" & n).Value) = True Then
  CestUneDate = True
 End If
 
End If
 
 If CestUneDate = False Then
  
  .Cells(dlig, n).Value = Controls("Box" & n).Value
  
 Else
   
  If .Cells(dlig, n).NumberFormat <> "@" Then
    .Cells(dlig, n) = CDate(Controls("Box" & n))
  Else
   .Cells(dlig, n).Value = Controls("Box" & n).Value
  End If
  
 End If
  
Next

    If CheckBox1 = True Then
    .Cells(dlig, 11) = "ü"
   End If

End With


End Sub


Docmarti
 

Efgé

XLDnaute Barbatruc
Re : date USF > date Excel : inversé

Bonjour à tous

À partir de VBA
Règle pour éviter l'inversion jour/mois dans les cellules:

- ne pas envoyer une date de type String dans une cellule dont le format de nombre n'est pas Texte.
- ne pas envoyer une date de type Date dans une cellule dont le format de nombre est Texte.

Pas si l'on utilise .FormulaLocal et non .Value
A mettre dans un classeur vierge pour tester:
VB:
Sub tests_Dates()

Dim DtStrng As String
MsgBox "Version variable de type String" & vbLf & "Avec $A$1 au format Standard", 64
DtStrng = "01/05/2016"
Range("$A$1").NumberFormat = "General"
Range("$A$1").Value = DtStrng
MsgBox "Date inversée avec .Value", 64
Range("$A$1").Range("$A$1").FormulaLocal = DtStrng
MsgBox "Date corecte avec .FormulaLocal", 64

Dim DtDt As Date
MsgBox "Version variable de type Date" & vbLf & "Avec $A$2 au format Texte", 64
DtDt = "01/05/2016"
Range("$A$2").NumberFormat = "@"
Range("$A$2").Value = DtDt
MsgBox "Date inversée avec .Value", 64
Range("$A$2").FormulaLocal = DtDt
MsgBox "Date corecte avec .FormulaLocal", 64

End Sub

Cordialement
 

Docmarti

XLDnaute Occasionnel
Re : date USF > date Excel : inversé

Bonjour Efgé

Pas si l'on utilise .FormulaLocal et non .Value

C'est vrai que .FormulaLocal semble magique car il ne provoque jamais d'inversion jour/mois, contrairement à .Value qui n'empêche pas l'inversion.

Probablement parce que, contrairement à .Value, .FormulaLocal indique à VBA que la date n'est pas une date au format américain, mais une date au format local défini dans les paramètres régionaux du Panneau de Configuration et qu'en conséquence il ne faut pas la modifier en y cherchant une date au format américain.

Il serait peut-être préférable de toujours utiliser .FormulaLocal avec les dates, qu'elles soient de type String ou de type Date.

Cordialement

Docmarti
 

Statistiques des forums

Discussions
312 084
Messages
2 085 192
Membres
102 809
dernier inscrit
Sandrine83