IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

transformer une feuille d'un fichier XLS en CSV (problème avec formule)


Sujet :

VBScript

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Points : 5
    Points
    5
    Par défaut transformer une feuille d'un fichier XLS en CSV (problème avec formule)
    Bonjour,

    Je dois effectuer de manière automatique (vbscript) la transformation d'une feuille d'un fichier excel en fichier csv. Le problème que je rencontre provient du fait que lorsque l'utilisateur se trompe dans l'encodage de ses données, la formule écrite dans une des cellules de la feuille excel "tombe en erreur" et lorsque j'exécute le vbscript celui s'arrête lorsqu'il arrive sur la cellule dans laquelle la formule est en erreur.

    Je souhaiterai que lorsque le script arrive sur cette erreur, le script continue son traitement sans tenir compte de ce record.

    ci-dessus mon scriot dans son état actuel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    Option Explicit
     
    Dim objExcel, strExcelPath, objSheet, intRow, intCol
    DIM fso, CSVFile
    Dim str
     
    'Bind to Excel object
    On error Resume Next
    Set objExcel = CreateObject("Excel.Application")
    If Err.Number <> 0 Then
       On Error Goto 0
       Wscript.Echo "Excel application not found."
       Wscript.Quit
    End If
    On Error Goto 0 
     
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    '********************************************************
    strExcelPath = "c:\test\myxls.xls"
    Set CSVFile = fso.CreateTextFile("c:\test\mycsv.CSV", True)
     
    'Open specified spreadsheet and select the worksheet.
    objExcel.WorkBooks.Open strExcelPath
    Set objSheet = objExcel.ActiveWorkbook.Worksheets("test")
     
    ' Iterate through the rows of the spreadsheet after the first, until the
    ' first blank entry in the third column.
     
    intRow = 2
    Do while objSheet.Cells(intRow, 3).Value <> ""
       str = ""
       FOR intCol = 1 to 18
     
          IF intCol = 2 OR intCOl = 5 OR intCOl = 14 OR intCOl = 15 OR intCOl = 16 OR intCOl = 17 then
             str = str & " "
          else
             str = str &  objSheet.Cells(intRow, intCOL).Value
     
          end if
       NEXT
       Str = str & "x"
     
       CSVFile.Writeline(str) 
     
       intRow = intRow + 1
    Loop
    ' Close file
    CSVFile.Close
    ' Close workbook
    objExcel.ActiveWorkBook.Close
    'Clean up
    Set objSheet = Nothing
     
    '*********************************************************
    ' quit Excel
    objExcel.Application.Quit
     
    'Clean up
    Set objExcel = Nothing
     
    Wscript.Echo "Done"

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    sur qu'elle ligne l'erreur .? quel genre de formule y as t-'il sur la cellule correspondante...?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    si dans la feuille Excel on a pour la colonne A la formule = B / C
    si pour la ligne 14, l'utilisateur entre pour C14 une lettre, dans ce cas Excel ne peut résoudre la formule et indiquera #VALEUR#.

    Lorsque j' execute le VBscript, les 13 premières lignes seront bien écrites dans le fichier CSV et lorsque le script arrive à la 14ème ligne de la feuille Excel, le script s'arrête et renvoit le message d'erreur: Type incompatible: objSheet.Cells(intRow, intCOL).Value

    Ce que je voudrai, c'est que le script lorsqu'il rencontre une erreur "bypass" celle-ci et continue donc le traitement jusqu'au dernier record de la feuille Excel

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    et si tu modifie la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          str = str &  objSheet.Cells(intRow, intCOL).text

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    En effet, en utilisant .text à la place .value, ça fonctionne, mais le problème est que l'on exporte dans le fichier CSV des records en erreurs.

    Ce que je voudrai c'est avoir un fichier CSV sans erreurs et éventuellement un fichier qui loggerait les erreurs

    est il possible en utilisant le .value de "catcher" les erreurs?

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 147
    Points
    20 147
    Par défaut
    bonsoir

    tu peux tester ce type de synthaxe pour vérifier s'il y a une erreur dans la cellule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If objExcel.WorksheetFunction.IsErr(objSheet.Cells(intRow, intCol)) = True Then

    bonne soiree
    michel

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    bonjour Michel,

    J'obtiens toujours le même message d'erreur (type mismatch ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Do while objSheet.Cells(intRow, 3).Value <> ""
       str = ""
       FOR intCol = 1 to 18
     
          IF intCol = 2 OR intCOl = 5 OR intCOl = 14 OR intCOl = 15 OR intCOl = 16 OR intCOl = 17 then
             str = str & " " & ";"
          else
             If objExcel.WorksheetFunction.IsError(objSheet.Cells(intRow, intCol)) = True Then
                Wscript.Echo "Error line " &  intRow
             else
                Str = str & objSheet.Cells(intRow, intCol).Value
                str = str & ";"
             end if         
          end if
       NEXT
       Str = str & "x"
     
       CSVFile.Writeline(str) 
     
       intRow = intRow + 1
    Loop

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Après plusieurs tests, la seule solution qui fonctionne est je pense d'utiliser ce que BBIL m'a conseillé c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = str &  objSheet.Cells(intRow, intCOL).text
    et de tester si le texte retourné est un message d'erreur Excel (#VALEUR!, #NAME!,...) dans ce cas alors inscrire le record dans un fichier log.

    Si quelqu'un a une meilleure idée, il peut m'en faire part.

    Merci

Discussions similaires

  1. [ODBC] [PostGreSQL] exporter une requête vers un fichier xls ou csv
    Par sage74 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/02/2011, 14h00
  2. Lire une seule feuille d'un fichier XLS avec XLSSpreadSheet
    Par Nono23 dans le forum Composants VCL
    Réponses: 0
    Dernier message: 24/03/2010, 11h28
  3. [VBA-E] Copier une feuille d'un fichier 1 sur un fichier 2
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/03/2007, 16h47
  4. Enregistrer une table dans un fichier .xls
    Par kmaniche dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/10/2006, 09h59
  5. Réponses: 2
    Dernier message: 15/05/2006, 08h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo