Création d'une application relevant des valeurs dans un fichier Excel

binedz Messages postés 11 Date d'inscription mercredi 6 juillet 2011 Statut Membre Dernière intervention 11 avril 2012 - 27 janv. 2009 à 16:47
Supra3000 Messages postés 159 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 8 janvier 2010 - 27 janv. 2009 à 20:57
Bonjour,

Je désire améliorer l'application qui me permet de relever des valeurs au sein d'un sein d'un fichier Execl. Voici le code en place:

_____________________________

Option Explicit


Public Function lire()


Dim objexcel As Object
Dim lecture As String
Dim Appli As Excel.Application


Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim Ligne As Integer
Dim Colonne As Integer


Dim Fin As Boolean
Dim Cellule As Boolean


Dim Valeur As Double
Dim Mat() As String
   
   
Set Appli = CreateObject("Excel.application")


Set objexcel = GetObject(, "excel.Application")             'On ouvre le fichier Excel
objexcel.Workbooks.Open FileName:=App.Path & "/points.xls"


objexcel.Sheets(1).Activate 'On active la feuille #1


Colonne = 3
k = 1


Do


    If objexcel.Worksheets(1).Cells(k, 1).Value = 0 Then
        Fin = True
        Ligne = k - 1
        Exit Do
   
    Else
    k = k + 1
   
    End If
   
Loop


ReDim Mat(Ligne, Colonne)


For i = 1 To Ligne
    For j = 1 To Colonne
   
    Mat(i, j) = objexcel.Worksheets(1).Cells(i, j).Value
 
    If j = 1 Then Form1.List1.AddItem (Mat(i, j))
    If j = 2 Then Form1.List2.AddItem (Mat(i, j))
    If j = 3 Then Form1.List3.AddItem (Mat(i, j))
       
    Next j
Next i
   


End Function

__________________

Bon, en fait, cet algorythme n'est pas parfait du tout, je l'admet. En fait, je désire pouvoir ouvrir un fichier à partir d'une boîte de dialogue. Je crois que je dois changer cette ligne:
objexcel.Workbooks.Open FileName:=App.Path & "/points.xls"objexcel.Workbooks.Open FileName:=App.Path & "/points.xls"

De plus, je veux que mon algorytme soit autonome, c'est-à-dire qu'il vérifie lui-même jusqu'à quelle ligne et quelle colonne il y a des valeurs et par le fait même, qu'il les enregistre dans sa matrice. J'ai pensé créer une variable ligne et colonne que j'aurai préalablement établi leur valeur en scanner la feuille Excel. J'obtiendrais donc une matrice du genre "mat(ligne, colonne)".

Finalement, il y a un petit problème lorsque je ferme VB et que je désire réouvrir ce même fichier Excel dans lequel j'ai effectué mon relevé. Il ne veut plus s'ouvrir comme si l'application était demeurée ouverte. Cela est probablement au manque d'une ligne de code qui m'assure que l'application Execel est belle et bien fermée lorsque je quitte VB.

Est-ce que quelqu'un veut m'aider à construire mon algorythme?

Je vous dit un gros merci à l'avance!

P.S.: Pour ceux qui ont lu mes messages précédents, j'ai dû travaillé sur une autre partie de mon projet que celle qui concerne la programmation et j'espère que vous dénoterez un certain effort de ma part .

Jasmin

3 réponses

Supra3000 Messages postés 159 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 8 janvier 2010 2
27 janv. 2009 à 17:34
1 - "En fait, je désire pouvoir ouvrir un fichier à partir d'une boîte de dialogue..."
Copie ce code dans un module et utilise la Fonction "OuvrirUnFichier" pour recevoir ton path de fichier. (Ex:monpath =  OuvrirUnFichier(Me.hWnd, "Parcourir", 1, "Tous", "*.*") )

Option Compare Database



'Déclaration de l'API
Private Declare Sub PathStripPath Lib "shlwapi.dll" Alias "PathStripPathA" (ByVal pszPath As String)
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                   "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long



 'Structure du fichier
Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type



 'Constantes
Private Const OFN_READONLY = &H1
Private Const OFN_OVERWRITEPROMPT = &H2
Private Const OFN_HIDEREADONLY = &H4
Private Const OFN_NOCHANGEDIR = &H8
Private Const OFN_SHOWHELP = &H10
Private Const OFN_ENABLEHOOK = &H20
Private Const OFN_ENABLETEMPLATE = &H40
Private Const OFN_ENABLETEMPLATEHANDLE = &H80
Private Const OFN_NOVALIDATE = &H100
Private Const OFN_ALLOWMULTISELECT = &H200
Private Const OFN_EXTENSIONDIFFERENT = &H400
Private Const OFN_PATHMUSTEXIST = &H800
Private Const OFN_FILEMUSTEXIST = &H1000
Private Const OFN_CREATEPROMPT = &H2000
Private Const OFN_SHAREAWARE = &H4000
Private Const OFN_NOREADONLYRETURN = &H8000
Private Const OFN_NOTESTFILECREATE = &H10000



Private Const OFN_SHAREFALLTHROUGH = 2
Private Const OFN_SHARENOWARN = 1
Private Const OFN_SHAREWARN = 0





Public Function OuvrirUnFichier(Handle As Long, _
                                Titre As String, _
                                TypeRetour As Byte, _
                                Optional TitreFiltre As String, _
                                Optional TypeFichier As String, _
                                Optional RepParDefaut As String) As String
 'OuvrirUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
 'la boîte de dialogue de sélection d'un fichier.
 'Explication des paramètres
    'Handle = le handle de la fenêtre (Me.Hwnd)
    'Titre = Titre de la boîte de dialogue
    'TypeRetour (Définit la valeur, de type String, renvoyée par la fonction)
        '1 = Chemin complet + Nom du fichier
        '2 = Nom fichier seulement
    'TitreFiltre = Titre du filtre
        'Exemple: Fichier Access
        'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
    'TypeFichier = Extention du fichier (Sans le .)
        'Exemple: MDB
        'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
    'RepParDefaut = Répertoire d'ouverture par defaut
        'Exemple: C:\windows\system32
        'Si vous laissé l'argument vide, par defaut il se place dans le répertoire de votre application



Dim StructFile As OPENFILENAME
Dim sFiltre As String



 'Construction du filtre en fonction des arguments spécifiés
If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
  sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
End If
sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)





 'Configuration de la boîte de dialogue
  With StructFile
    .lStructSize = Len(StructFile) 'Initialisation de la grosseur de la structure
    .hwndOwner = Handle 'Identification du handle de la fenêtre
    .lpstrFilter = sFiltre 'Application du filtre
    .lpstrFile = String$(254, vbNullChar) 'Initialisation du fichier '0' x 254
    .nMaxFile = 254 'Taille maximale du fichier
    .lpstrFileTitle = String$(254, vbNullChar) 'Initialisation du nom du fichier '0' x 254
    .nMaxFileTitle = 254  'Taille maximale du nom du fichier
    .lpstrTitle = Titre 'Titre de la boîte de dialogue
    .flags = OFN_HIDEREADONLY  'Option de la boite de dialogue
    If ((IsNull(RepParDefaut)) Or (RepParDefaut = "")) Then
        RepParDefaut = CurrentDb.Name
        PathStripPath (RepParDefaut)
        .lpstrInitialDir = Left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Mid$(RepParDefaut, 1, _
InStr(1, RepParDefaut, vbNullChar) - 1)))
        Else: .lpstrInitialDir = RepParDefaut
    End If
  End With
   
If (GetOpenFileName(StructFile)) Then 'Si un fichier est sélectionné
    Select Case TypeRetour
      Case 1: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFile, InStr(1, StructFile.lpstrFile, vbNullChar) - 1))
      Case 2: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFileTitle, InStr(1, StructFile.lpstrFileTitle, vbNullChar) - 1))
    End Select
  End If



End Function



2 - "De plus, je veux que mon algorytme soit autonome, c'est-à-dire ..."
      Personne ne peux t'aider pour cette partie, c'est à toi d'effectuer l'analyse du travail et de te monter un algo. Si tu rencontre une erreur d'exécution, etc. là on peux faire quelque chose pour toi.

3 -"Finalement, il y a un petit problème lorsque je ferme VB et ..."
   Insère le code suivant à la fin de ta macro
      objexcel.ActiveWorkbook.Close SaveChanges:=True      
      Set objexcel =Nothing
0
binedz Messages postés 11 Date d'inscription mercredi 6 juillet 2011 Statut Membre Dernière intervention 11 avril 2012
27 janv. 2009 à 20:49
Écoute, je te remercie de ta réponse aussi rapide!

J'ai copié ton code mais cela m'amène quelques petits problèmes...
Pour tout dire, je travaille èa l'intérieur du VBA du logiciel Solidworks.

1- Lorsque je déclare Option Compare Database, il me provoque un erreur de syntaxe en rouge.
2- Est-ce que je déclare une variable genre "Dim monpath as string pour pouvoir utiliser le fichier sélectionné par l'utilisateur ?
3- Il y a un problème à cette ligne:
' J'ai déclaré monpath as string comme mentionné plus tôt...
monpath = OuvrirUnFichier(Me.HWnd, "Parcourir", 1, "Tous", "*.*")

Erreur de compilation:
Utilisation incorrecte du mot Me

Peux-tu me donner un coup de main supplémentaire?
0
Supra3000 Messages postés 159 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 8 janvier 2010 2
27 janv. 2009 à 20:57
Vas jeter un coup d'oeil ici pour le code du module :



http://access.developpez.com/faq/?page=CheminsRep



Vrm désolé ça marche très bien sur mon poste et je n'ai pas le temps de reformuler un autre algorythme pour Solidworks si son vba diffère.

Bonne continuation
0
Rejoignez-nous