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

Macros et VBA Excel Discussion :

Extraction données AS400, chiffres convertis en texte [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Par défaut Extraction données AS400, chiffres convertis en texte
    Bonsoir à tous,

    J'ai récupéré un tableau Excel avec du VB et contenant une "ADODB.Connection" permettant de me connecter à un AS400 et de récupérer les données d'un fichier. En fonction des critères indiqués dans 2 cellules de la feuille Excel, je récupère bien mes données. Mais j'ai un problème sur les données numériques du fichier AS400 qui sont placées dans les cellules au format TEXTE. Ce qui est étonnant, cela se passe bien sur les zones numériques sans décimale par contre, "ça foire" dès que j'ai 3 décimales. Exemple dans la colonne prix d'achat, les données sont correctes sur les 26 premières lignes (mais au format texte quand même) puis la ligne suivante, je devrai avoir 1,908€ et j'ai au format texte toujours 1908,000 (comme s'il avait multiplié par 1000 !)

    Que faut-il faire pour lui dire que ce sont des chiffres et non du texte dans la requête ou ailleurs ?
    Je précise que :
    - les zones sont bien définies en numérique sur l'AS400 et avec des décimales.
    - ce code VB est exécuté avec Office 365.

    Extrait de code VB

    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
     
    Public Sub Conect(mon_sql As String, adresse_IP As String)
    Dim Con As New ADODB.Connection
    Dim Cmd As New ADODB.Command
    Dim Rs As ADODB.Recordset
    Dim txtc As String
     
    .../...
     
    txtc = "provider=IBMDA400;data source=" & was400 & ";Force Translate=65535"
    Con.Open txtc
     
    Set Cmd.ActiveConnection = Con
    mon_sql = "SELECT * FROM BIB_DATA.STOCK_MAGS WHERE nummag = '111' and secteur='10' and rayon='074' "
    Cmd.CommandText = mon_sql
     
    Set Rs = Nothing
    Set Rs = Cmd.Execute()
     
    rowCount = 6
    For colCount = 0 To Rs.Fields.Count - 1
        Sheets.Item(2).Cells(rowCount, colCount + 1).Value = Rs.Fields(colCount).Name
        Sheets.Item(2).Cells(rowCount, colCount + 1).Font.Bold = True
    Next colCount
     
    While Not Rs.EOF
     
        rowCount = rowCount + 1
        For colCount = 0 To Rs.Fields.Count - 1
            If Rs.Fields(colCount).ActualSize = -1 Then
                text = ""
            Else
                val = Rs.Fields(colCount).Value
                If VarType(val) = vbNull Then
                    text = ""
                Else
                    text = val
                End If
            End If
        Sheets.Item(2).Cells(rowCount, colCount + 1).Value = text
        Next colCount
        Rs.MoveNext
    Wend
     
     
    Set Rs = Nothing
    Con.Close
    Sheets.Item(2).Cells.Columns.AutoFit
    Sheets.Item(2).Activate
    Sheets.Item(2).Cells(1, 1).Activate
    FINI:
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.StatusBar = False
    Application.DisplayStatusBar = oldStatusBar
     
    'Ajouté pour mise en forme couleur + filtre auto
        Range("A6:U6").Select
        With Selection.Font
            .ThemeColor = xlThemeColorLight2
            .TintAndShade = 0.399975585192419
        End With
        Selection.AutoFilter
    capture : extrait du tableau Excel, en jaune les cellules ou les valeurs sont erronées

    Nom : capture extraction excel.png
Affichages : 480
Taille : 31,1 Ko

    Merci pour votre aide,
    Eric.

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Sur la champs spécifique essaie comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Texte=Val(replace(Valeur,",","."))
    Remarque que j'ai renommé tes variables car text et val sont des mots réservés à vba

    En plus, il sera mieux de déclarer les variables convenablement selon le type de chaque champs

  3. #3
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Par défaut
    Merci pour cette première aide et ta patience car je n'y arrive pas.

    Dans l'ordre j'ai suivi le premier conseil sur les noms de variables réservées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim text_rtv As String 'text est devenu text_rtv
    Dim Number As Long
    Dim val_rtv As Variant 'val est devenu val_rtv
    J'ai vérifié mon code et l'extraction continue à fonctionner avec ce premier changement et mon problème de zone numérique en format texte.
    J'ai tenté d'ajouter Texte=Val(replace(Valeur,",",".")) mais je ne dois pas le faire au bon endroit car j'ai un message d'erreur "Incompatibilité de type".

    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
     
    .../...
    While Not Rs.EOF
     
        rowCount = rowCount + 1
        For colCount = 0 To Rs.Fields.Count - 1
            If Rs.Fields(colCount).ActualSize = -1 Then
                text_rtv = ""
            Else
                val_rtv = Rs.Fields(colCount).Value
                If VarType(val_rtv) = vbNull Then
                    text_rtv = ""
                Else
                    text_rtv = val_rtv(Replace(Valeur, ",", ".")) 'Ici ajout de (Replace...
                End If
     
            End If
        Sheets.Item(2).Cells(rowCount, colCount + 1).Value = text_rtv
        Next colCount
        Rs.MoveNext
    Wend
    Dernier point que signifie "il sera mieux de déclarer les variables convenablement selon le type de chaque champs" ? Les champs du fichier d'origine ou autre chose ; merci de préciser et de m'aider car je n'ai pas saisi voire je ne comprends pas..

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Ligne 14

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    text_rtv = Val(Replace(val_rtv, ",", "."))
    Val est une fonction vba

  5. #5
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Par défaut
    Je n'ai pas dû tout comprendre car si je procède comme tu me l'as indiqué, j'ai le champ libellé article (colonne 8) qui contient 0 au lieu du libellé et rien de changé dans la colonne 12 contenant mon prix d'achat.

    Est-ce qu'il n'y a pas un commande qui permet de dire lorsque je récupère le champ prix_achat du fichier alors faire une mise en forme ?

    Encore merci pour ton aide.

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Oui c'est la remarque que j'avais faite concernant le typage des variable convenablement en fonction des types de champs

    Exemple à main levée pour le principe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    dim nm as double
    Dim txt as string
    Dim alfa as boolean
    Dim x
     
    X=array(toto,...
    For i=1 to 10
    Select case i
    Case 1, 2, 7: txt=x(i);alfa=true ' colonnes 1, 2 et 7 alphanumériques les autres numériques
    Case else: nm=val(replace(x(i),",",".")):alfa=false
    End select
    Cells(1, i+1)=iif(alfa,txt,nm)
    Next i

  7. #7
    Invité
    Invité(e)
    Par défaut
    bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
    ActiveSheet.UsedRange.NumberFormat = "General"
    ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
    End Sub

  8. #8
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Par défaut
    Voici les libellés des entêtes de colonne. C'est Alpha de 1 à 11

    Site = 112
    Niveau 1 = 10
    Niveau 2 = 001
    Niveau 3 = 111
    Niveau 4 = 001
    R2férence = 12345
    Code EAN = 7613035463301
    Désignation référence = LIBELLE DE L'ARTICLE
    Date créat° AAMMJJ = 181228
    Utilisateur = TOTO
    Code promo = vide (des blancs)
    Début promo AAMMJJ = 190319
    Fin promo AAMMJJ = 190321
    Prix de revient = 18,800
    Marge = 25,333-
    Type = %
    PV TTC = 19,900
    PV TTC promo = 15,000
    Stock = 0,000

  9. #9
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    Select Case colCount
                        Case 0 To 12, 15: Text_rtv = Val_rtv: Alfa = True             'Colonnes source fichier alpha
                        Case Else: Mont_rtv = CDbl(Replace(Val_rtv, ",", ".")): Alfa = False
                    End Select

  10. #10
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
    ActiveSheet.UsedRange.NumberFormat = "General"
    ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
    End Sub
    J'ai essayé et aucun changement.

  11. #11
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    Select Case colCount
                        Case 0 To 13, 16: text_rtv = val_rtv: alfa = True    'Colonnes source fichier alpha
                        'Case Else: Mont_Rtv = val(Replace(val_rtv, ",", ".")): alfa = False 'Autre colonnes qui sont numériques (formatage)
                        Case Else: Mont_Rtv = CDbl(Replace(val_rtv, ",", ".")): alfa = False
                    End Select
    En mettant cette syntaxe, j'ai une erreur "Incompatibilité de type. Première ligne remplie jusqu'à la colonne 14 Prix de revient, et le reste n'est pas rempli.
    JE confirme 14 et 15 sont bien numériques, 16 Alpha et 17 à 19 numériques

  12. #12
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Un numéro de télepgone est alphanumérique. On est bien d'accord
    Ensuite
    Tu adaptes tes numero de colonnes selon le type

  13. #13
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Par défaut
    Ok je pense ne pas avoir compris car il y a quelque chose qui ne va pas dans la source VB.

    Dans cette boucle, on est d'accord que des colonnes 1 à 13 ainsi que la 16 sont traitées comme de l'Alphanumérique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    Select Case colCount
                        Case 0 To 13, 16: text_rtv = val_rtv: alfa = True    'Colonnes source fichier alpha
    Puis ici, est-ce que cela signifie que toutes les autres colonnes sont traitées comme du numérique ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        Case Else: Mont_Rtv = CDbl(Replace(val_rtv, ",", ".")): alfa = False
                    End Select
    Qu'est devenu le cas de mon code % dans la colonne 16 qui est de l'alphanumérique ?
    Lorsque je mets un point d'arrêt avant de charger les colonnes 10 et 11 (utilisateur et code promo qui sont alpha) pourquoi j'ai dans val_rtv "???"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Svp Besoin d'aide Extraction donnée texte
    Par Docpat dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 17/02/2011, 18h07
  2. [Batch] Extraction données fichier texte
    Par Postit92 dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 01/03/2010, 14h20
  3. Réponses: 8
    Dernier message: 27/12/2009, 16h32
  4. extraction de données à partir d'un fichier text ou xml
    Par bigplayer dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2007, 17h13
  5. Réponses: 1
    Dernier message: 03/08/2006, 12h34

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