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

VB.NET Discussion :

Lecture tableau Excel erreur NullReferenceException [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut Lecture tableau Excel erreur NullReferenceException
    Bonjour tout le monde,

    J’améliore actuellement un programme VB.net fonctionnel que j'ai précédemment créé.

    L'objectif de la fonction est d'aller piocher les données qui ce trouvent dans un tableau excel lorsque je sélectionne une valeur dans une listbox puis de les afficher via des labels (ci-dessous).



    Je me retrouve avec cette erreur :

    Une exception de première chance de type 'System.NullReferenceException' s'est produite dans Programme_test.exe

    {"Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est*: La référence d'objet n'est pas définie à une instance d'un objet."}

    Partie du code générant l'erreur :
    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
    64
    65
    66
    67
    Imports System
    Imports System.IO
    Imports System.Text
    Imports System.Windows.Forms
    Imports System.Drawing
    Imports Excel = Microsoft.Office.Interop.Excel
     
    Public Class Form1
     
        Dim appXL As Excel.Application
        Dim wbXl As Excel.Workbook
        Dim shXL As Excel.Worksheet
        Dim raXL As Excel.Range
        Dim dest_fichier_Excel As String = "C:\Gestion_des_stocks.xlsx"
     
        Private Sub open_XL()
            appXL = New Excel.Application
            appXL.Visible = True
            wbXl = appXL.Workbooks.Open(Dest_fichier_Excel)
            shXL = wbXl.ActiveSheet
            appXL.DisplayAlerts = False
        End Sub
     
        Function recuperation_tableau()
            Dim i As Integer
            Dim tab As String
     
            i = Excel_chiffre(ListBox1.SelectedItem)
            tab = "B" & i
            tab = shXL.Range(tab).Value
            Label23.Text = shXL.Range(tab).Value ' --- Errreur ---
            tab = "C" & i
            Label33.Text = shXL.Range(tab).Value
            tab = "D" & i
            Label34.Text = shXL.Range(tab).Value
            tab = "E" & i
            Label35.Text = shXL.Range(tab).Value
            tab = "F" & i
            Label36.Text = shXL.Range(tab).Value
            tab = "I" & i
            Label37.Text = shXL.Range(tab).Value
            tab = "J" & i
            Label38.Text = shXL.Range(tab).Value
            tab = "M" & i
            Label39.Text = shXL.Range(tab).Value
            tab = "N" & i
            Label40.Text = shXL.Range(tab).Value
     
            Return vbNull
        End Function
     
        Private Sub close_XL()
            raXL = Nothing
            shXL = Nothing
            wbXl.Close()
            appXL.Quit()
            appXL = Nothing
        End Sub
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            open_XL()
            recuperation_tableau()
            'close_XL()
     
     
        End Sub
    End Class
    L'erreur se produit sur la ligne 31 . Label23.Text = shXL.Range(tab).Value.



    Chose que je ne comprend pas, car lorsque je créé un programme test avec le même code sans le reste du programme je n’obtiens plus d'erreurs .

    Et si je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Dim appXL As new Excel.Application
        Dim wbXl As new Excel.Workbook
        Dim shXL As new Excel.Worksheet
        Dim raXL As Excel.Range
    Une autre erreur apparaît.


    Pouvez-vous m'aider à trouver une solution à ce problème ?

    Merci à vous,


    teo

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,


    Et si tu mets un espion sur le i de cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     i = Excel_chiffre(ListBox1.SelectedItem)
    et que tu l'exécutes au pas à pas, ton i vaut combien ?

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut
    Dans le load j'initialise cette valeur pour que i ne retourne pas de valeurs nulles ou négatives :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Private Sub sd_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            open_XL()
            SaveWorksheetAsPDF(True)
            ListBox1.SelectedIndex = 4
            Label7.Text = "Litres"
            TextBox8.Text = Format(Now, "dd/MM/yyyy")
        End Sub
    La fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function Excel_chiffre(ByVal selection As String) As Integer
    retourne l'index pour les valeurs se situant au minimum à la 4eme place de la listbox.

    Dans ce cas la valeur initiale de "i" est 4.

    Cependant lorsque je lance le test avec affichage des variables locales j'obtiens -1. C'est étrange, je vais vérifier si le problème vient de là.

    Merci

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut
    Le problème ne vient pas de là, car même après avoir corriger l'erreur j'obtiens le même message.

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,


    La fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function Excel_chiffre(ByVal selection As String) As Integer
    retourne l'index pour les valeurs se situant au minimum à la 4eme place de la listbox.

    Dans ce cas la valeur initiale de "i" est 4.

    Cependant lorsque je lance le test avec affichage des variables locales j'obtiens -1. C'est étrange, je vais vérifier si le problème vient de là.

    Merci
    Pas sûr, pas sûr. Dans VB.net, les indices partent toujours à zéro. Donc quand tu mets 4, tu vise en fait le cinquième élément. Et le fait que tu obtiennes -1 incite à penser que tu n'as rien de sélectionné.

    En passant, pourquoi fais-tu une fonction qui te retourne un Integer, alors que tu as besoin d'un String pour passer les adresses à Excel ?

    Si tu prends un paramètre String et que tu veux qu'il vire en integer, il est préférable que tu "ordonnes" toi-même la conversion, plutôt que de faire confiance au transtypage automatique de VB.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut
    Rassure moi tu vois la différence entre les deux paragraphe ?
    Bonsoir chaparo,

    Oui, je vois la différence avec les deux paragraphes. J'ai essayé d’ajouter à l'instanciation new, car j'ai lue sur de nombreux forums que c'est cela qui générait cette erreur. J'ai appliqué bêtement pour voir si cela pouvait résoudre mon problème, sans résultat.

    et quand tu dis
    L'erreur se produit sur la ligne 31 . Label23.Text = shXL.Range(tab).Value.
    dans la fenêtre d'espion
    shXL est différent de Nothinget
    shXL.Range(tab) aussi ?
    Effectivement shXL vaut Nothing, je pense que le problème vient de là.


    Tu pourrais aussi jeter un œil sur cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     i = Excel_chiffre(ListBox1.SelectedItem)
    et t'assurer que i n'est pas égal à zéro ou à . Parce que si ton i est à zéro, c'est certain qu'Excel va rugir.

    Pour plus de sûreté, sélectionne vraiment ta valeur du ListBox avec un clic de souris, même si elle semble déjà sélectionnée. Cela m'a déjà joué des tours de ne pas le faire.
    Bonsoir clementmarcotte,

    J'ais bien vérifié la valeur retournée par "i" , la valeur de "tab" est bien "B4" ligne 29
    Également, je pense qu'il serait préférable que tu gardes application.displayalerts à true tant et aussi longtemps que ton programme ne sera pas fonctionnel. Tout d'un coup qu'Excel t'enverrait LE message qui te donnerait la solution
    C'est noté, je l'ai remis sur true pour les tests. En fait j'ai retirée les alertes afin de ne pas avoir à m'occuper des msbox d'excel.

    En passant, pourquoi fais-tu une fonction qui te retourne un Integer, alors que tu as besoin d'un String pour passer les adresses à Excel ?

    Si tu prends un paramètre String et que tu veux qu'il vire en integer, il est préférable que tu "ordonnes" toi-même la conversion, plutôt que de faire confiance au transtypage automatique de VB.
    Effectivement je n'y avais pas pensé à cause du transtypage automatique de VB. Maintenant que tu me l'as expliqué je penserais à le faire directement.


    Encore merci pour votre participation,


    Teo

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Par défaut
    Salut teo971

    Regarde en pas à pas ce qui se passe ici,
    shXL = wbXl.ActiveSheetEn faite t'a ligne 30 ne sert à rien car elle change la valeur de ton tab et après le shXL.Range(tab).Value n'existe donc pas dans ta feuille Excel.

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Par défaut
    Bonjour teo971

    Citation Envoyé par teo971 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public Class Form1
     
        Dim appXL As Excel.Application
        Dim wbXl As Excel.Workbook
        Dim shXL As Excel.Worksheet
        Dim raXL As Excel.Range
    L'erreur se produit sur la ligne 31 . Label23.Text = shXL.Range(tab).Value.

    Chose que je ne comprend pas, car lorsque je créé un programme test avec le même code sans le reste du programme je n’obtiens plus d'erreurs .

    Et si je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Dim appXL As new Excel.Application
        Dim wbXl As new Excel.Workbook
        Dim shXL As new Excel.Worksheet
        Dim raXL As Excel.Range
    Une autre erreur apparaît.


    Pouvez-vous m'aider à trouver une solution à ce problème ?

    Merci à vous,


    teo
    Rassure moi tu vois la différence entre les deux paragraphe ?

    EDIT :
    et quand tu dis
    L'erreur se produit sur la ligne 31 . Label23.Text = shXL.Range(tab).Value.
    dans la fenêtre d'espion
    shXL est différent de Nothinget
    shXL.Range(tab) aussi ?

  9. #9
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Tu pourrais aussi jeter un œil sur cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      i = Excel_chiffre(ListBox1.SelectedItem)
    et t'assurer que i n'est pas égal à zéro ou à Nothing. Parce que si ton i est à zéro, c'est certain qu'Excel va rugir.

    Pour plus de sûreté, sélectionne vraiment ta valeur du ListBox avec un clic de souris, même si elle semble déjà sélectionnée. Cela m'a déjà joué des tours de ne pas le faire.

    Également, je pense qu'il serait préférable que tu gardes application.displayalerts à true tant et aussi longtemps que ton programme ne sera pas fonctionnel. Tout d'un coup qu'Excel t'enverrait LE message qui te donnerait la solution

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

Discussions similaires

  1. [win32com][Excel] Lecture d'un tableau excel avec plusieurs coeurs
    Par sir_nebuchadnezzar dans le forum Bibliothèques tierces
    Réponses: 7
    Dernier message: 26/07/2012, 17h01
  2. Erreur de lecture fichier Excel
    Par fpascal dans le forum C++Builder
    Réponses: 13
    Dernier message: 25/02/2008, 16h54
  3. Lecture ligne par ligne d'un tableau excel
    Par IceBibi dans le forum C++
    Réponses: 2
    Dernier message: 05/02/2008, 21h00
  4. Erreur lecture tableau WMI
    Par BATiViR dans le forum Delphi
    Réponses: 15
    Dernier message: 10/04/2007, 21h54
  5. [OLE Excel] Erreur
    Par JBrek dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 23/03/2003, 18h28

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