incomptabilité versions excel ?

  • Initiateur de la discussion gaston53
  • Date de début
G

gaston53

Guest
Bonjour à tous,

J'ai récemment créé un classeur qui manipule des données trés nombreuses, à partir d'un fichier texte, par du code vba excel.

Grosso modo, en voici l'esprit :
1) j'ouvre un fichier texte contenant 5 colonnes (colonne1 : standard, colonne2 : standard, colonne3 : #0.00, colonne4 : date et colonne5 : date).
2) je stocke l'ensemble du fichier dans une matrice: Dim col(10000, 1 To 5) As Variant
3) je recopie sur mon classeur les 5 premières colonnes et effectue un calcul de soustraction pour évaluer un délai entre la colonne 5 et 4, tel que :

For i = 1 To nb
Range("A" & i + 2).Value = col(i, 1)
Range("A" & i + 2).BorderAround Weight:=xlThin
Range("A" & i + 2).HorizontalAlignment = xlCenter
Range("B" & i + 2).Value = col(i, 2)
Range("B" & i + 2).BorderAround Weight:=xlThin
Range("B" & i + 2).HorizontalAlignment = xlCenter
Range("C" & i + 2).Value = col(i, 3)
Range("C" & i + 2).BorderAround Weight:=xlThin
Range("C" & i + 2).NumberFormat = "#,##0.00"
Range("D" & i + 2).Value = col(i, 4)
Range("D" & i + 2).BorderAround Weight:=xlThin
Range("D" & i + 2).HorizontalAlignment = xlCenter
Range("E" & i + 2).Value = col(i, 5)
Range("E" & i + 2).BorderAround Weight:=xlThin
Range("E" & i + 2).HorizontalAlignment = xlCenter
Range("F" & i + 2).Value = col(i, 5) - col(i, 4)
Range("F" & i + 2).BorderAround Weight:=xlThin
Range("F" & i + 2).HorizontalAlignment = xlCenter

Next

Ce code passe impeccable sur Excel version < 2003 mais dès qu'il est exécuté sur cette version, il me retourne un message d'erreur "erreur d'exécution 13' incompatibilité de type !!
Quelqu'un peut m'expliquer ce bug et la façon de le contourner SVP car je ne pige pas !!

Merci d'avance, Gaston53.
 
T

Ti

Guest
ok, alors ce sont les valeurs contenues dans les cellules col(i, 5) et col(i, 4) qui posent problème. Probablement qu'il y a là du texte au lieu de valeurs numériques (peut-être des nombres stockés sous forme de texte tout simplement).
 
G

gaston53

Guest
Bien vu, j'ai modifié :

Range("F" & i + 2).Value = col(i, 5) - col(i, 4)
en
Range("F" & i + 2).Value = cdate(col(i, 5)) - cdate(col(i, 4))
Cette fois le calcul se fait !

sauf qu'il y a 1 nouveau problème. Maintenant et selon les cas, il recopie dans mon classeur actif, à partir de la matrice, la date soit en format Français soit en format Anglais (inversion des jours et mois) !!

Pour Info, dans mon fichier texte la date est stockée au format "jj/mm/aaaa".

Ce "binz" me donne donc maintenant des délais négatifs !
 
T

Ti

Guest
ces problèmes de dates issues de fichiers texte sont effectivement de vraies plaies. Tu peux utiliser une fonction qui fera la conversion toujours dans le bon sens, comme ci-dessous :

Function ConversionDate(ByVal DateTexte$) As Date
Dim SplitDate
SplitDate = Split(DateTexte, "/")
ConversionDate = DateSerial(SplitDate(2), SplitDate(1), SplitDate(0))
End Function

Et ensuite au lieu de mettre cDate, tu utilises ConversionDate

Range("F" & i + 2).Value = conversionDate(col(i, 5)) - conversionDate(col(i, 4))

Mais, là encore, avec ces fichues dates, et sans test supplémentaire, je ne peux même pas te garantir que ça marchera.
 
@

@+Thierry

Guest
Bonjour Ti, Gaston, le Forum

Sans aucun Test... Mais bon... sait-on jamais

With Range("F" & i + 2)
.Value = CLng(col(i, 5)) - CLng(col(i, 4))
.NumberFormat = "DD/MM/YYYY"
End With

Bon Appétit
@+Thierry
 
G

gaston53

Guest
Bonsoir,

J'ai testé les 2 soluces.

Celle de @+Thierry -> me retourne le message d'erreur "erreur d'exécution 13' incompatibilité de type

Celle de Ti -> passe mais problème toujours identique (dates bizrres donc délais négatifs incohérents)

Mouais !! histoire de ne pas vous demander de galérer à ma place, j'ai fouillé un peu (beaucoup) mon code en basculant des points d'arrêts et en posant des espions aux différentes étapes. SURPRAÏSE (avé l'accent english)

Quand Excel ouvre mon fichier texte (avec cette seule version 2003 car je le rappelle les versions antérieures tournent sans problème) les colonnes 4 et 5 sont :

1) une traitée en String (colonne 5) .. pourquoi ?
2) l'autre en date (colonne 4) .. pourquoi ?
3) le plus beau est à venir, quand excel rencontre une cellule contenant une date, soit il la reconnait et la traite au format Français (18/02/2004 c'est sur il n'y a pas 18 mois dans l'année) soit il la reconnait et la traite au format anglais (03/02/2004 devient automatiquement 02/03/2004) d'où mes décallages et les diffiultés que je rencontre !

Comme y disaient dans les visiteurs "mais qu'est-ce c'est qu'ce binz"

Bon courage et bonne soirée à tous, Gaston53 :-(
 
@

@+Thierry

Guest
Re Bonsoir Gaston, Ti, le Forum

J'ai eu aussi un sbinz comme toi, en fait je traite le TXT à l'import directement, ici c'est un bout d'extrait d'une procédure que j'ai écrite et qui tourne tous les jours :

Dim Enregistrement As String
Dim Contenu As Variant
Dim i As Integer, ii As Byte, iii As Byte
Dim Chemin As String

Chemin = ThisWorkbook.Path & "\"
TheTxtFile = "LeFichierTexte.txt"

Open Chemin & TheTxtFile For Input As #1

&nbsp;&nbsp;Do While Not EOF(1)
&nbsp;&nbsp;Line Input #1, Enregistrement
&nbsp;&nbsp;Contenu = Split(Enregistrement, Chr(59))

&nbsp;&nbsp;&nbsp;If UBound(Contenu) > 37 Then GoTo Alarm

&nbsp;&nbsp;&nbsp;For ii = 1 To 38
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iii = ii - 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;With Sheets("Import")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case ii
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case 4 To 9
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cells(i, ii) = CDate(Format(Contenu(iii), "DD/MM/YYYY"))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case 16
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cells(i, ii) = "'" & Contenu(iii)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If .Cells(i, ii) = "" Then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cells(i, ii).Interior.ColorIndex = 3
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cells(i, ii).Interior.ColorIndex = xlNone
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case 25 To 29
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cells(i, ii) = "'" & Contenu(iii)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case Else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cells(i, ii) = Contenu(iii)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End With
&nbsp;&nbsp;&nbsp;Next ii
&nbsp;&nbsp;i = i + 1
&nbsp;&nbsp;Loop
Close #1

Ici le Fichier Txt lui doit contenir 38 Champs séparés par des ";" (Chr(59))... Les Champs 4 à 9 doivent être impérativement des Dates... (le fichier Txt est US !!) pour moi avec ça, je suis arrivé à maîtriser le problème...

Bon Courage
@+Thierry
 
G

gaston53

Guest
Bonjour,

Je crois, à partir de la solution de Ti (fonction ConversionDate), être arrivé à une solution pas trés orthodoxe mais fonctionnelle :

-----------------------------------------------------------------------------------------
Function ConversionDate(ByVal DateTexte$) As Date

Dim SplitDate

SplitDate = Split(DateTexte, "/")

If CInt(SplitDate(0)) >= 12 Then
ConversionDate = DateSerial(SplitDate(2), SplitDate(1), SplitDate(0))
Else
ConversionDate = DateSerial(SplitDate(2), SplitDate(0), SplitDate(1))
End If

End Function
-----------------------------------------------------------------------------------------

Vous remarquerez que bête et méchant comme je suis, je me suis adapté tant bien que mal au bug de traitement entre les dates "transformées" par excel au format Français ou Anglais selon que le jour du mois est supérieur ou égal à 12 -> bascule en Anglais sinon on reste en Français.

Bien sûr, j'ai dû modifier la boucle incluse dans mon algo de traitement des informations telle que suit :

-----------------------------------------------------------------------------------------
For i = 1 To nb
Range("A" & i + 2).Value = col(i, 1)
Range("A" & i + 2).BorderAround Weight:=xlThin
Range("A" & i + 2).HorizontalAlignment = xlCenter
Range("B" & i + 2).Value = col(i, 2)
Range("B" & i + 2).BorderAround Weight:=xlThin
Range("B" & i + 2).HorizontalAlignment = xlCenter
Range("C" & i + 2).Value = col(i, 3)
Range("C" & i + 2).BorderAround Weight:=xlThin
Range("C" & i + 2).NumberFormat = "#,##0.00"
Range("D" & i + 2).Value = ConversionDate(col(i, 4))
Range("D" & i + 2).BorderAround Weight:=xlThin
Range("D" & i + 2).HorizontalAlignment = xlCenter
Range("E" & i + 2).Value = ConversionDate(col(i, 5))
Range("E" & i + 2).BorderAround Weight:=xlThin
Range("E" & i + 2).HorizontalAlignment = xlCenter
Range("F" & i + 2).Formula = "=RC[-1]-RC[-2]"
Selection.NumberFormat = "General"
Range("F" & i + 2).BorderAround Weight:=xlThin
Range("F" & i + 2).HorizontalAlignment = xlCenter

Next
-----------------------------------------------------------------------------------------

Là, comme vous pouvez le voir, pour les colonnes D et E j'utilise la fonction ConversionDate modifiée et pour le calcul du délai, en colonne F, j'utilise plutôt Range("F" & i + 2).Formula = "=RC[-1]-RC[-2]" car je me heurtais encore au même problème que j'ai contourné de façon certes pragmatique mais pas trés élégante (tant pis pour la beauté de la programmation) !

Reste que cette version restructurée ne fonctionne que sur Excel 2003 et je ne connais pas le moyen d'inclure dans mon code une détection de la version qui me permettrait de basculer selon la version vers mon code d'origine (supporté jusqu'à Excel version < 2003) et ce nouveau code purement compatible Excel 2003 ?

Comme l'affirme Ti, j'ai vraiment l'impression de réinventer la roue !
Merci de votre aide car je me suis largement appuyé dessus pour arriver à cette solution.

Gaston53, :)
 
G

gaston53

Guest
Allez, ça doit être presque la fin.

J'ai implémenté dans mon code un test de version Excel. Reste juste à savoir comment se comporte ce code avec une version > 2000 (celle que j'utilise au boulot) et <2003 (celle que j'utilise at home).

Donc le code modifié prenant automatiquement en compte la version Excel :

-------------------------------------------------------------------------------------------
'on formate les cellules et on recopie les données dans le classeur
For i = 1 To nb
Range("A" & i + 2).Value = col(i, 1)
Range("A" & i + 2).BorderAround Weight:=xlThin
Range("A" & i + 2).HorizontalAlignment = xlCenter
Range("B" & i + 2).Value = col(i, 2)
Range("B" & i + 2).BorderAround Weight:=xlThin
Range("B" & i + 2).HorizontalAlignment = xlCenter
Range("C" & i + 2).Value = col(i, 3)
Range("C" & i + 2).BorderAround Weight:=xlThin
Range("C" & i + 2).NumberFormat = "#,##0.00"
'On traite le bug de conversion de date à partir de la version 2003
If Val(Application.Version) < 11 Then
Range("D" & i + 2).Value = col(i, 4)
Else
Range("D" & i + 2).Value = ConversionDate(col(i, 4))
End If
Range("D" & i + 2).BorderAround Weight:=xlThin
Range("D" & i + 2).HorizontalAlignment = xlCenter
'On traite le bug de conversion de date à partir de la version 2003
If Val(Application.Version) < 11 Then
Range("E" & i + 2).Value = col(i, 5)
Else
Range("E" & i + 2).Value = ConversionDate(col(i, 5))
End If
Range("E" & i + 2).Value = ConversionDate(col(i, 5))
Range("E" & i + 2).BorderAround Weight:=xlThin
Range("E" & i + 2).HorizontalAlignment = xlCenter
'On traite le bug de conversion de date à partir de la version 2003
If Val(Application.Version) < 11 Then
Range("F" & i + 2).Value = col(i, 5) - col(i, 4)
Else
Range("F" & i + 2).Formula = "=RC[-1]-RC[-2]"
End If
Selection.NumberFormat = "General"
Range("F" & i + 2).BorderAround Weight:=xlThin
Range("F" & i + 2).HorizontalAlignment = xlCenter

Next
-------------------------------------------------------------------------------------------

Et voilà .... Pfuiii la suée !!
Encore merci de votre aide, Gaston53 :)
 

Discussions similaires

Réponses
4
Affichages
356

Membres actuellement en ligne

Statistiques des forums

Discussions
314 144
Messages
2 106 357
Membres
109 563
dernier inscrit
sylla121