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 6 et antérieur Discussion :

[VB6] (Pilote Isam) Tester si un fichier excel est ouvert


Sujet :

VB 6 et antérieur

  1. #1
    Débutant
    Inscrit en
    Juin 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 108
    Points : 52
    Points
    52
    Par défaut [VB6] (Pilote Isam) Tester si un fichier excel est ouvert
    Bonjour,

    Via un module VB, j'essais de vider les enregistrements d'une feuille excel :

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    strSQL = "select `FACILITY_TYPES$`.* "
        strSQL = strSQL & "From `FACILITY_TYPES$`;"
     
        Set mRS2 = New ADODB.Recordset
        mRS2.Open strSQL, MCnn2, adOpenKeyset, adLockOptimistic
     
        mRS2.MoveFirst
        mRS2.Delete
        mRS2.Close
     
        Set mRS2 = Nothing
        MCnn2.Close
        Set MCnn2 = Nothing
    Mais j'obtiens l'erreur suivante :
    La suppression de données dans une table attachée n'est pas gérée par le pilote ISAM. (Erreur 3617)
    Existe t'il une solution qui permet de vider cette feuille excel, et cela sans faire workbook.open ... etc etc ... ?

    Merci

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Je n'ai pas la réponse mais peut-être la trouveras-tu à cette adresse :
    http://www.developpez.net/forums/vie...el+vb6&start=0

    Bonne chance

    A+

    NB - Comme le sujet est l'import, j'ai pensé que si on pouvait importer des données, on pouvait les supprimer (?)

  3. #3
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Hello!
    Je ne connais pas du tout le fonctionnement, mais tu ne peux pas directement envoyer une requête SQL "DELETE", au lieu de faire un SELECT et de travailler sur le RecordSet?

  4. #4
    Débutant
    Inscrit en
    Juin 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 108
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Megaxel
    Hello!
    Je ne connais pas du tout le fonctionnement, mais tu ne peux pas directement envoyer une requête SQL "DELETE", au lieu de faire un SELECT et de travailler sur le RecordSet?
    Non cela me renvoit le même message d'erreur hélas.

    Voici une aide microsoft :

    Modification des données Excel : Editer, Ajouter et Supprimer
    Editer

    Vous pouvez modifier des données Excel à l'aide des méthodes ADO courantes. Les champs de jeux d'enregistrements qui correspondent aux cellules dans la feuille de calcul Excel contenant des formules Excel (commençant par "=") sont en lecture seule et ne peuvent pas être modifiés. N'oubliez pas que par défaut, la connexion ODBC à Excel est en lecture seule, sauf spécification contraire dans vos paramètres de connexion. Pour plus d'informations, reportez-vous à la section "Utilisation du fournisseur Microsoft OLE DB pour pilotes ODBC" plus haut dans cet article.

    Ajouter

    Vous pouvez ajouter des enregistrements à votre source d'enregistrements Excel, selon l'espace existant. Toutefois, si vous ajoutez de nouveaux enregistrements en dehors de la plage spécifiée à l'origine, ils ne seront pas visibles si vous effectuez une nouvelle requête sur la plage d'origine. Pour plus d'informations, reportez-vous à la section "Avertissement concernant la spécification des plages".

    Dans certaines circonstances, lorsque vous utilisez les méthodes AddNew et Update de l'objet ADO Recordset pour insérer de nouvelles lignes de données dans une table Excel, ADO peut insérer les valeurs de données dans les colonnes incorrectes dans Excel. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft.
    314763 (http://support.microsoft.com/kb/314763/) CORRECTIF : ADO insère les données dans des colonnes incorrectes dans Excel
    Supprimer

    La suppression de données Excel est soumise à plus de restrictions que celle de données d'une source de données relationnelle. Dans une base de données relationnelle, "ligne" n'a pas de sens en dehors d'"enregistrement" ; dans une feuille de calcul Excel, ceci n'est pas vrai. Vous pouvez supprimer des valeurs dans des champs (cellules). Toutefois, vous ne pouvez pas :
    1. Supprimer un enregistrement complet d'un coup ; sinon le message d'erreur suivant s'affiche :
    La suppression de données dans une table attachée n'est pas gérée par le pilote ISAM.
    Vous ne pouvez supprimer un enregistrement qu'en effaçant le contenu de chaque champ individuel.
    2. Supprimer la valeur d'une cellule contenant une formule Excel ; sinon, le message d'erreur suivant s'affiche :
    L'opération demandée n'est pas autorisée dans ce contexte.
    3. Vous ne pouvez pas supprimer les lignes vides de la feuille de calcul qui contenaient les données supprimées et votre jeu d'enregistrements continuera à afficher des enregistrements vides correspondant à ces lignes vides.
    Avertissement concernant la modification de données Excel à l'aide d'ADO : Lorsque vous insérez des données texte dans Excel à l'aide d'ADO, la valeur de texte est précédée d'une apostrophe. Ceci peut provoquer des problèmes par la suite lors du travail avec les nouvelles données.
    Mais cela ne m'aide pas beaucoup en fait.

    Sinon, j'ai une auutre solution qui consiste à remplacer chaque enregistrement par un vide :



    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
        strSQL = "select `FACILITY_TYPES$`.* "
        strSQL = strSQL & " From `FACILITY_TYPES$`;"
     
     
        Set mRS2 = New ADODB.Recordset
        mRS2.Open strSQL, MCnn2, adOpenDynamic, adLockOptimistic
     
       'mRS2.MoveNext
     
       While Not mRS2.EOF = True
     
            mRS2!Code = ""
            mRS2!English = ""
            mRS2!French = ""
     
            'mRS2.Delete
            mRS2.Update
            mRS2.MoveNext
     
       Wend
     
        'mRS2.Delete
        mRS2.Close
        Set mRS2 = Nothing
        MCnn2.Close
        Set MCnn2 = Nothing
    Mais le nouveau problème qui se pose est que lorsque je veux remplir à nouveau la feuille excel, il commence là où était le dernier enregistrement effacé!

    exemple :
    Avt le lancement, voici l'état de ma feuille excel :
    champ rempli
    champ rempli

    Je lance mon programme VB
    champ vide (mis à blanc par le code ci-dessus)
    champ vide (mis à blanc par le code ci-dessus)
    champ rempli (et là, il commence à remplir la feuille excel, comme s'il ne comprenait pas qu'il faut la remplir dès la ligne 1)

    Si quelqu'un a des idées ?

  5. #5
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Pfiouuuuh...
    Ouais, j'ai une idée: gère ta base de données toi même, comme un grand, sans ADO.
    Tu supprimes tes lignes, tu modifies tes cellules...
    Ça ressemble à un avoeu d'échec, mais il y a des fois...

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Et si tu fais MoveFirst ou last ?

    A tout hasard

    A+

  7. #7
    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 144
    Points
    20 144
    Par défaut
    bonjour

    la solution de Megaxel est la mieux adaptée et la plus facile à gerer

    dans le point 3 de l'aide Microsoft que tu as cité :

    Vous ne pouvez pas supprimer les lignes vides de la feuille de calcul qui contenaient les données supprimées et votre jeu d'enregistrements continuera à afficher des enregistrements vides correspondant à ces lignes vides

    donc tu ne pourras pas supprimer les lignes sans ouvrir le classeur


    une solution (un peu usine à gaz) consisterait par macro :
    à extraire les enregistrements non Null vers un nouveau classeur temporaire , par la methode ADO
    supprimer l'ancienne base
    renommer le nouveau classeur avec le nom de la base



    bon apres midi
    michel

  8. #8
    Débutant
    Inscrit en
    Juin 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 108
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par ouskel'n'or
    Et si tu fais MoveFirst ou last ?

    A tout hasard

    A+
    Hélas non

  9. #9
    Débutant
    Inscrit en
    Juin 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 108
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par SilkyRoad
    bonjour

    la solution de Megaxel est la mieux adaptée et la plus facile à gerer

    dans le point 3 de l'aide Microsoft que tu as cité :

    Vous ne pouvez pas supprimer les lignes vides de la feuille de calcul qui contenaient les données supprimées et votre jeu d'enregistrements continuera à afficher des enregistrements vides correspondant à ces lignes vides

    donc tu ne pourras pas supprimer les lignes sans ouvrir le classeur


    une solution (un peu usine à gaz) consisterait par macro :
    à extraire les enregistrements non Null vers un nouveau classeur temporaire , par la methode ADO
    supprimer l'ancienne base
    renommer le nouveau classeur avec le nom de la base



    bon apres midi
    michel

    OK, merci pr ton aide
    C'est vrai que je bloque un peu là... je sens que je vais laisser l'utilisateur faire cela... c'était pourtant plus pratique un bouton qui permet de mettre à jour un fichier excel automatiquement... mais là ça parait impossible de cette façon.

    Merci pr votre aide à tous.

  10. #10
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Ha oui, mais là, tu deviens extremiste...
    Je te proposais de gérer ta fichier Excel comme un grand, mais automatiquement, en l'ouvrant, par des macros.

  11. #11
    Débutant
    Inscrit en
    Juin 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 108
    Points : 52
    Points
    52
    Par défaut


    C'est à dire "en l'ouvrant par des macros ?"

  12. #12
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Ben, ton code en ADO, il était lancé en cliquant sur un bouton, non?
    Et bien au lieu d'ouvrir une connexion ADO, tu crées un objet "Excel.Application", et tu ouvres ton fichier avec Open, et tu te mets dans le bon onglet, et tu supprimes les lignes que tu veux supprimer, puis tu enregistres le fichier modifié, et tu le refermes.
    Tout ça en VB(A).
    En gros, tu ne le considères plus comme une base de données, mais tu le rabaisses au (vil) rang de fichier Excel...

  13. #13
    Débutant
    Inscrit en
    Juin 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 108
    Points : 52
    Points
    52
    Par défaut
    ok! C'est bien ce qu'il me semblait... et ce que je voulais éviter à tout prix!

    Je vais tout de même faire qqs tests pour voir si cela peut convenir.

    Merci pour ton aide en tout cas.

  14. #14
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Au moins, je peux (presque) t'assurer que c'est possible, sans être très compliqué.

  15. #15
    Débutant
    Inscrit en
    Juin 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 108
    Points : 52
    Points
    52
    Par défaut
    En effet, cela fonctionne très bien!

    Je mettrai mon code pour ceux que ça intéresseraient.

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Je mettrai mon code pour ceux que ça intéresseraient.
    Alors tu peux le mettre...

    Merci

    A+

    NB - La question a été posée hier ou avant hier et je ne sais pas si le pb a été résolu

  17. #17
    Débutant
    Inscrit en
    Juin 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 108
    Points : 52
    Points
    52
    Par défaut
    Bon, ce n'est pas propre du tout ms le voici :

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    If chkOptionTbl_FT.Value = True Then
     
        'On ouvre le fichier excel en écriture afin de compter le nbre d'enregistrements
     
        strSQL = "select `FACILITY_TYPES$`.* "
        strSQL = strSQL & "From `FACILITY_TYPES$`;"
     
        Set mRS = New ADODB.Recordset
        mRS.Open strSQL, MCnn, adOpenKeyset, adLockReadOnly
     
            'mRS.MoveLast
            nbExcel = mRS.RecordCount
            'mRS.MoveFirst
     
        mRS.Close
        Set mRS = Nothing
     
        MCnn.Close
        Set MCnn = Nothing
     
        nbExcel = nbExcel + 1
     
        'On ouvre le fichier excel en écriture afin de vider tout ce qu'il contient
     
        'Ouverture de l'application
        Dim excelFile As String
        excelFile = aecDefaultSettings.ExcelPath
     
        Set appExcel = GetObject(excelFile, "Excel.Application")
        If appExcel Is Nothing Then
          Set appExcel = CreateObject("Excel.Application")
          Set wbExcel = appExcel.Workbooks.Open(aecDefaultSettings.ExcelPath)
        End If
     
     
     
        'If EstOuvert(aecDefaultSettings.ExcelPath) = True Then
        'MsgBox "The Excel file is already open. Please close it before continue !", vbExclamation, "Excel file is open"
        'End If
     
     
     
        'Récupération du classeur par défaut
        Set wbExcel = appExcel.ActiveWorkbook
     
        'Récupération de la feuille par défaut
        Set wsExcel = wbExcel.Sheets("FACILITY_TYPES")
     
        If nbExcel <> 1 Then
        wsExcel.Rows("2:" & nbExcel).Select
        wsExcel.Rows("2:" & nbExcel).Delete
        End If
     
            DoCmd.SetWarnings False
            'wbExcel.SaveAs (aecDefaultSettings.ExcelPath)
            wbExcel.Close True
            Set appExcel = Nothing
            Set wbExcel = Nothing
            Set wsExcel = Nothing
     
     
        'Ouverture Excel pour écriture
        OpenExcelConnection MCnn
        strSQL = "select `FACILITY_TYPES$`.* "
        strSQL = strSQL & "From `FACILITY_TYPES$`;"
     
        Set mRS = New ADODB.Recordset
        mRS.Open strSQL, MCnn, adOpenKeyset, adLockOptimistic
     
        'on ouvre la bate access en lecture
        strSQL2 = "SELECT [FACILITY TYPES].* From [FACILITY TYPES];"
     
        Set sRS = New ADODB.Recordset
        sRS.Open strSQL2, SCnn, adOpenKeyset, adLockReadOnly
     
        'on remplit la base access avec tous les champs du fichier excel
        While Not sRS.EOF = True
            mRS.AddNew
     
            mRS!Code = Nz(sRS!Code)
            mRS!English = Nz(sRS!English)
            mRS!French = Nz(sRS!French)
     
            mRS.Update
     
            mRS.MoveNext
            sRS.MoveNext
        Wend
     
     
        Set sRS = Nothing
        Set mRS = Nothing
        SCnn.Close
        MCnn.Close
     
     
    End If
    [/quote]

  18. #18
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Amusant, le mélange de ADO et de Workbook...

  19. #19
    Débutant
    Inscrit en
    Juin 2003
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 108
    Points : 52
    Points
    52
    Par défaut
    wé enfin c'est très laid!
    Et est ce que vous savez comment je peux savoir si le fichier excel que je veux modifier est ouvert ou non ?

    j'ai trouvé des choses, mais ça ne fonctionne pas réellement

  20. #20
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu essaie de le fermer avec une gestion d'erreur si c'est déjà fait

    Juste une idée comme ça parce que je m'en vais

    A+

    Edit
    Ou... tu essaies d'y accéder, s'il est fermé -> Erreur et si erreur -> tu l'ouvres. On erreur resume next fait ça très bien...

Discussions similaires

  1. Tester si un fichier excel est ouvert
    Par h2qutc dans le forum Général Python
    Réponses: 1
    Dernier message: 10/12/2013, 11h52
  2. Tester si un fichier excel est déjà ouvert
    Par Marsupio dans le forum VBScript
    Réponses: 6
    Dernier message: 08/01/2011, 12h24
  3. [Toutes versions] Tester si un fichier excel est ouvert
    Par vivi4561 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/08/2009, 14h36
  4. Tester si 1 fichier excel est déjà ouvert
    Par Jeanvaljean44 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/11/2008, 16h59
  5. Tester si un fichier excel est déjà ouvert
    Par richard038 dans le forum Delphi
    Réponses: 3
    Dernier message: 08/10/2006, 14h01

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