[VB] Lancer excel à partir d'un programme VB [Résolu]

Lancer excel à partir d'un programme VB [Résolu] [VB] - VB/VBA/VBS - Programmation

Marsh Posté le 03-04-2007 à 16:21:13    

Bon le problème doit vraiment être tout con, mais aucun des bouts de code que j'ai trouvé sur internet ne marchent pas.
donc, mon problème est que je veux créer un tableau excel à partir de données récupérées par mon programme VB développé sous visual studio 2005.
En cherchant j'ai trouvé :  
 

Code :
  1. Dim appExcel As Excel.Application
  2. Dim wbExcel As Excel.Workbook
  3. Dim wsExcel As Excel.Worksheet
  4. Set appExcel = CreateObject("Excel.Application" )
  5. appExcel.Workbooks.Add
  6. Set wbExcel = appExcel.ActiveWorkbook
  7. Set wsExcel = wbExcel.ActiveSheet


 
Qui devrait marcher normalement, mais lors de l'execution, VS2005 me dit  :
"Ancien format ou bibliothèque de types non valide. (Exception de HRESULT : 0x80028018 (TYPE_E_INVDATAREAD))"
 
C'est le code qui est mauvais? ou bien c'est moi qui ai oublié de configurer certains points de mon projet? Merci d'avance pour votre aide!


Message édité par Aquineas2 le 04-04-2007 à 17:56:38
Reply

Marsh Posté le 03-04-2007 à 16:21:13   

Reply

Marsh Posté le 03-04-2007 à 16:37:07    

Est-ce que dans ton éditeur, dans 'Outils/Références, "Microsoft Excel ... Object Library" est cochée ?

Reply

Marsh Posté le 03-04-2007 à 16:46:11    

j'ai rajouté la librairie object excel 10.0
et dans imported namespace, "excel" est coché.


---------------
Le marketing aussi peut être solidaire. | La passion des p'tites images
Reply

Marsh Posté le 03-04-2007 à 16:56:40    

Dites, pour les vieux comme moi, vous pourriez préciser en titre qu'il s'agit de VB.NET, histoire que je ne cherche pas :)

Reply

Marsh Posté le 03-04-2007 à 16:58:44    

heu nan, j'pense pas... j'suis en visual basic simple... ou alors ya une notion qui m'a échappé :(


---------------
Le marketing aussi peut être solidaire. | La passion des p'tites images
Reply

Marsh Posté le 03-04-2007 à 17:00:25    

C'est moi qui ai mal lu, désolé.
(carrément gâteux là :) )

 

edit: attend si je vois ton commentaire « imported namespace », c'est quoi en VS2005 ? l'équivalent de Outils/Référence en VB6 pê ?


Message édité par tegu le 03-04-2007 à 17:06:02
Reply

Marsh Posté le 03-04-2007 à 17:08:08    

C'est ce que j'ai entouré en rouge en bas  :
 
http://www.aquineascollection.com/vhdwebpack/vhd/aquineas/excel.jpg


---------------
Le marketing aussi peut être solidaire. | La passion des p'tites images
Reply

Marsh Posté le 03-04-2007 à 17:34:32    

Et pourquoi, tu ne coderais pas directement dans l'editeur vb d'Excel ?

Reply

Marsh Posté le 03-04-2007 à 17:39:43    

Et ca, ca marche ?
 
sub test()
 
Dim Wbk As Workbook, Wsht As Worksheet
Dim Exc As New Excel.Application
Workbooks.Add
Set Wbk = ActiveWorkbook
Set Wsht = Wbk.Worksheets(1)
 
end sub

Reply

Marsh Posté le 03-04-2007 à 17:51:36    

Vu que ça me lourdait un max, après avoir galéré quelques jours avec ce problème, j'ai opté pour la bonne grosse méthode bien bidon :
 

Code :
  1. public static void ExcelExport(DataSet ds)
  2.         {
  3.             object winStyle = IWshRuntimeLibrary.WshWindowStyle.WshHide;
  4.             object wait = (object)true;
  5.             ds.WriteXml(string.Format(@"{0}\export.xml", Application.StartupPath), XmlWriteMode.WriteSchema);
  6.             IWshRuntimeLibrary.WshShellClass shell = new IWshRuntimeLibrary.WshShellClass();
  7.             shell.Run(string.Format("wscript \"{0}\\ds2xls.vbs\" \"{0}\\export.xml\"", Application.StartupPath), ref winStyle, ref wait);
  8.             File.Delete(string.Format(@"{0}\export.xml", Application.StartupPath));
  9.         }


 


Option Explicit
 
' Titre : DS2XLS
' Auteur : MagicBuzz
' Version : 1.0
' Date : 10-05-2006
'
' Script VBS qui génère un document Excel à partir d'un extract "ToXml()" d'un Objet DataSet de .NET
' Ce script est censé fonctionner sur n'importe quelle version de Windows, et n'importe quelle version d'Excel
' Bon, rien n'est garanti non plus hein...
 
' Constantes
' Ces GUID génériques ont l'avantage d'être identiques pour toutes les versions
' Il faut alors faire confiance à Microsoft pour ne pas changer la structure des objets d'une version à l'autre
Const EXCEL_GUID = "Excel.Application"
Const MSXML_GUID = "MSXML.DOMDocument"
 
' Méthodes
Sub Main()
    ' Excel objects
    Dim xls
    Dim wkb
    Dim sht
     
    ' DOM objects
    Dim dom
    Dim declaration
    Dim table
    Dim colonne
    Dim ligne
     
    ' Common variables
    Dim args
    Dim filename
    Dim tabName
    Dim arrColonnes()
     
    ' Compteurs
    Dim i
    Dim j
     
    ' On récupère le nom du fichier XML à traîter
    Set args = WScript.Arguments
     
    If args.Count <> 1 Then
        MsgBox("Nombre d'arguments incorrects : 1 attendu" )
        Exit Sub
    End If
    filename = args(0)
     
    ' Création d'une instance d'Excel
    Set xls = CreateObject(EXCEL_GUID)
 
    ' On ne l'affiche pas
    'xls.Visible = True
     
    ' Ajout d'un espace de travail (par défaut, Excel s'ouvre vide)
    Set wkb = xls.Workbooks.Add()
     
    ' L'espace de travail contient de base 3 sheets. On en vire deux et on renomme la dernière
    ' En effet, un espace de travail doit au moins toujours contenir une feuille...
    For i = wkb.WorkSheets.Count To 2 Step -1
        wkb.WorkSheets(i).Delete
    Next
    wkb.WorkSheets(1).Name = "tmpSheet"
     
    ' Ouverture du document XML contenant les données du dataset à sauvegarder
    Set dom = CreateObject(MSXML_GUID)
    dom.Load filename
     
    ' Recherche du tag de description des DataTables
    Set declaration = dom.DocumentElement.SelectNodes("xs:schema/xs:element/xs:complexType/xs:choice/xs:element" )
     
    ' C'est parti !
    For Each table In declaration
        tabName = GetAttributeByName(table, "name" )
        Set sht = wkb.WorkSheets.Add()
        sht.Name = tabName
 
        ReDim arrColonnes(1)
        i = 0
        For Each colonne In table.SelectNodes("xs:complexType/xs:sequence/xs:element" )
            i = i + 1
            ReDim Preserve arrColonnes(i)
            ' En-tête
            arrColonnes(i) = GetAttributeByName(colonne, "name" )
            sht.Cells(1, i).Value = GetAttributeByName(colonne, "name" )
            sht.Cells(1, i).Interior.ColorIndex = 36
            sht.Cells(1, i).Font.Bold = True
            ' Formattage du type de la colonne
            Select Case GetAttributeByName(colonne, "type" )
                Case "xs:string"
                    sht.Columns(i).NumberFormat = "@"
                Case "xs:decimal"
                    sht.Columns(i).NumberFormat = "0.00"
                Case Else
                    ' Ouais, ben désolé, moi je me sert que de string et decimal...
                    sht.Columns(i).Interior.ColorIndex = 3
                    MsgBox("Type inconnu : " & GetAttributeByName(colonne, "type" ))
            End Select
        Next
         
        ' Maintenant, on parcours l'ensemble des éléments correspondant au datatable en cours de lecture
        j = 1
        For Each ligne In dom.DocumentElement.SelectNodes(tabName)
            j = j + 1
            For i = 1 To UBound(arrColonnes)
                ' On recopie bêtement le contenu du tag portant le nom de la colonne désirée
                sht.Cells(j, i).Value = ligne.SelectSingleNode(arrColonnes(i)).Text
            Next
        Next
         
        ' Ca c'est pour faire joli (si faire se peut)
        sht.Columns.EntireColumn.AutoFit
    Next
     
    ' Vous vous rappelez de la sheet renommée ? Ben on la zigouille maintenant
    wkb.WorkSheets("tmpSheet" ).Delete
     
    ' On indique qu'on ferme l'espace de travail en enregistrant le document (une popup d'enregistrement apparaît)
'    wkb.Close(true)
     
    ' On quitte Excel
'    xls.Quit
    xls.Visible = True
End Sub
 
Function GetAttributeByName(node, attributeName)
    ' Impossible d'utiliser les collections nommées en VBS. Du coup on fait avec les moyens du bords...
    Dim tmpRet
    Dim att
 
    tmpRet = ""
 
    For Each att in node.attributes
        If att.Name = attributeName Then
            tmpRet = att.Value
            Exit For
        End If
    Next
     
    GetAttributeByName = tmpRet
End Function
 
' Démarrage du programme
Call Main()

Reply

Marsh Posté le 03-04-2007 à 17:51:36   

Reply

Marsh Posté le 03-04-2007 à 18:29:28    

aprilthe5ith a écrit :

Et ca, ca marche ?


 
Nan, ça ne marche pas, il comprends pas Workbooks.Add()
Quant à faire du VB directement dans excel je pense pas que ça marchera, car j'ai besoin de traiter sous excel les données obtenues par un programme complexe en VB.
 
 


Pour l'instant ça ne marche pas non plus, j'vais essayer de traffiquer dans tous les sens pour voir...
 
Merci pour votre aide en tous cas!
 


---------------
Le marketing aussi peut être solidaire. | La passion des p'tites images
Reply

Marsh Posté le 04-04-2007 à 03:56:09    


Public Class Form1
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim AppExcel As Excel.Application
 
        AppExcel = New Excel.Application()
        AppExcel.Workbooks.Add()
        AppExcel.Visible = True
        ....
    End Sub
End Class

Reply

Marsh Posté le 04-04-2007 à 07:40:57    

Nan j'ai toujours le même problème, pour la commande "   AppExcel.Workbooks.Add()", il me marque
 
"Ancien format ou bibliothèque de types non valide. (Exception de HRESULT : 0x80028018 (TYPE_E_INVDATAREAD))"
 
Donc j'me demande si c'est pas mon projet que j'ai mal parametré, mais j'vois pas ce qu'il manque...


---------------
Le marketing aussi peut être solidaire. | La passion des p'tites images
Reply

Marsh Posté le 04-04-2007 à 09:23:11    

Reply

Marsh Posté le 04-04-2007 à 09:47:41    

J'ai du mal à imaginer quel genre de paramétrage pourrait amener ces symtômes.
La version d'Excel installée est-elle particulière ? installée dans un contexte particulier ? Y a-t-il eu des réinstallations de plusieurs versions successives ? Est-ce en environnement TSE/Citrix ou une plateforme non traditionnelle ? Quels autres logiciels Microsoft non Office sont installés ?
J'essaie de trouver d'autres orientations à nos recherches.

Reply

Marsh Posté le 04-04-2007 à 10:10:19    

Reply

Marsh Posté le 04-04-2007 à 17:22:23    

Merci kiki29, ça marche. Le code :  
 
 Dim oApp As New Excel.Application()
        oApp.Visible = True
        oApp.UserControl = True
        Dim oBooks As Object = oApp.Workbooks
        Dim ci As System.Globalization.CultureInfo = New System.Globalization.CultureInfo("en-US" )
        oBooks.GetType().InvokeMember("Add", Reflection.BindingFlags.InvokeMethod, Nothing, oBooks, Nothing, ci)
 
Le problème vient de la localisation windows/excel enfait.  
 
Merci à tous!  :hello:


---------------
Le marketing aussi peut être solidaire. | La passion des p'tites images
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed