Forum Clubic

Pb dans le code VBA!

Bonjour,
Donc en fet j’ai un formulaire avec des boutons dont un correspond à une importation d’un fichier Excel en une table Access. Le probléme c’est que si la table existe alors le code supprime l’ancienne table pour importer la nouvelle mais par-contre lorsque la table n’existe po , ca ne veu pas fonctionner. Je vous met mon code en dessous cela vous aidera tête à voir pourquoi!!

Private Sub Importer_Obsolete_Click()
On Error GoTo Err_Importer_Obsolete_Click

 If Database = OBSOLETE Then
    DoCmd.RunSQL ("DROP TABLE OBSOLETE")
    MsgBox ("la table est supprimer")
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel7, _
    "OBSOLETE", _
    "X:\Base de donnée TOLAS\Fichiers pour mise à jour BdD\OBSOLETE.xls", True
    
    'Crée l'index en le nommant
    Set oInd = CurrentDb.TableDefs("OBSOLETE").CreateIndex("PrimaryKey")

    'Cree le champ dans l'index
    Set oFld = oInd.CreateField("CODE_ARTICLE")
    'Ajoute le champ à la collection Fields
    oInd.Fields.Append oFld
    'Définit la clé primaire
    oInd.Primary = True
    'Ajoute l'index à la table
    CurrentDb.TableDefs("OBSOLETE").Indexes.Append oInd
    'Rafraichit la collection
    CurrentDb.TableDefs("OBSOLETE").Indexes.Refresh
    'Libération des objets
    Set oInd = Nothing
    Set oFld = Nothing

    'MsgBox ("L'importation à été effectué")
Else
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel7, _
    "OBSOLETE", _
    "X:\Base de donnée TOLAS\Fichiers pour mise à jour BdD\OBSOLETE.xls", True
    
    'Crée l 'index en le nommant
    Set oInd = CurrentDb.TableDefs("OBSOLETE").CreateIndex("PrimaryKey")
    'Cree le champ dans l'index
    Set oFld = oInd.CreateField("CODE_ARTICLE")
    'Ajoute le champ à la collection Fields
    oInd.Fields.Append oFld
    'Définit la clé primaire
    oInd.Primary = True
    'Ajoute l'index à la table
    CurrentDb.TableDefs("OBSOLETE").Indexes.Append oInd
    'Rafraichit la collection
    CurrentDb.TableDefs("OBSOLETE").Indexes.Refresh
    'Libération des objets
    Set oInd = Nothing
    Set oFld = Nothing

    MsgBox ("L'importation à été effectué")

End If

Exit_Importer_Obsolete_Click:
Exit Sub

Err_Importer_Obsolete_Click:
MsgBox err.Description
Resume Exit_Importer_Obsolete_Click

End Sub

MERCI D’avance!!
Edité le 06/06/2007 à 13:31

Là tu as deux variables Database et OBSOLETE que je ne vois initialisées nulle part.
Comme tu n’as pas mis option Explicit en haut de ton programme, VBA fait automatiquement Database =0 et OBSOLETE=0
Donc ta condition est toujours vraie, comme si la table existait toujours

Salut, peux-tu mettre un titre plus explicite, et surtout retirer ces vilaines majuscules, ça agresse les yeux.

Merci :jap:

merci gcc de m’avoir répondu, j’ai mit OBSOLETE entre parenthèse mais j’ai tjs le même problème, comment faire, si ta une nvle idée, fé moi signe!!
merci!!


pr guymage : dsl mé je sé po comment on fé pr changer de titre, dc ça restera comme ca!!lol.

Non, ça ne restera pas comme ça, tu peux changer le titre en éditant le 1er message(en haut à gauche) :slight_smile:

1- OBSOLETE, c’est une chaine de caractères (le nom de ta table) ; il faut donc la mettre entre guillemets et non entre parenthèses
2- Et la variable Database, elle est supposée représenter quoi ?
3- Tu as testé la solution qui est dans ton post de ce matin ? (le mieux serait de te limiter à un seul post, pour avoir toutes les infos au même endroit ; c’est plus facile pour ceux qui arrivent en cours de route)

C bon guymage, tu es content!!


donc tt dabord, dsl d'avoir changer mé javé envie!!LOL. Ensuite Database, je m'en servé cr je penser que ça représenter la base de donnée mais jme suis tromper, C ca?? Ensuite j'ai essayer la sol de ce matin CAD :[b] If CurrentDb.TableDefs("OBSOLETE").Name = "OBSOLETE" Then[/b] Mais j'ai un message d'erreur qui s'affiche : Microsoft Office Access Item not found in this collection

Ce message s’affiche lorsque la table n’existe pas dans la base de donnée par contre si la table es connu par la base de donnée, ya aucun souci ca s’effectue comme normal!!

voila, je crois que tu sait tout d’ou j’en suis!!lol

Bonjour,
voila j’ai trouver un site avec une fonction qui pourrait peut-être résoudre mon problème mais malheureusement je ne comprend pas trop comment je doit insérer cette fonction dans mon code … Enfin pourrez-vous m’aider SVP.
Par hasard si toi gcc, tu a compris et tu as une idée avec cette fonction, je veux bien tester!!

Le site est : officesystem.access.free.fr…

MERCI D’AVANCE!!

re-bonjour,
voila je voulais vraiment vous écrire surtout pour toi gcc car tu m’as énormément aidé jusque là donc je devais quand même te dire que j’ai à peut prêt réussir avec une otre fct :
officesystem.access.free.fr…

Par contre j’ai encore un petit souci, donc je te met mon code :

Private Sub Importer_Obsolete_Click()
On Error GoTo Err_Importer_Obsolete_Click

 If IsTableExist("OBSOLETE") Then
    MsgBox "la table OBSOLETE existe"
    DoCmd.RunSQL ("DROP TABLE OBSOLETE")
    MsgBox ("la table est supprimer")
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel7, _
    "OBSOLETE", _
    "X:\Base de donnée TOLAS\Fichiers pour mise à jour BdD\OBSOLETE.xls", True
    'Crée l'index en le nommant
    Set oInd = CurrentDb.TableDefs("OBSOLETE").CreateIndex("PrimaryKey")
    'Cree le champ dans l'index
    Set oFld = oInd.CreateField("CODE_ARTICLE")
    'Ajoute le champ à la collection Fields
    oInd.Fields.Append oFld
    'Définit la clé primaire
    oInd.Primary = True
    'Ajoute l'index à la table
    CurrentDb.TableDefs("OBSOLETE").Indexes.Append oInd
    'Rafraichit la collection
    CurrentDb.TableDefs("OBSOLETE").Indexes.Refresh
    'Libération des objets
    Set oInd = Nothing
    Set oFld = Nothing
    MsgBox ("L'importation à été effectué")
        
Else

    MsgBox "la table OBSOLETE n'existe pas"
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel7, _
    "OBSOLETE", _
    "X:\Base de donnée TOLAS\Fichiers pour mise à jour BdD\OBSOLETE.xls", True
    'Crée l 'index en le nommant
    Set oInd = CurrentDb.TableDefs("OBSOLETE").CreateIndex("PrimaryKey")
    'Cree le champ dans l'index
    Set oFld = oInd.CreateField("CODE_ARTICLE")
    'Ajoute le champ à la collection Fields
    oInd.Fields.Append oFld
    'Définit la clé primaire
    oInd.Primary = True
    'Ajoute l'index à la table
    CurrentDb.TableDefs("OBSOLETE").Indexes.Append oInd
    'Rafraichit la collection
    CurrentDb.TableDefs("OBSOLETE").Indexes.Refresh
    'Libération des objets
    Set oInd = Nothing
    Set oFld = Nothing
    MsgBox ("L'importation à été effectué")
    
End If

Exit_Importer_Obsolete_Click:
Exit Sub

Err_Importer_Obsolete_Click:
MsgBox err.Description
Resume Exit_Importer_Obsolete_Click

End Sub

En fet mon problème c’est que lorsque je modifie ma feuille excel avant de l’importer, ben au momen de l’importer, la clé primaire ne se réalise plus et la première ligne est vide, jvois pas pourquoi, jcontinu à chercher mais si tu as une idée, tien moi au courant stp!!

Merci bcp pour tout!!


Mince j'ai oublié de te mettre le code de la fonction : IsTableExist, donc jte la met mtn

Public Function IsTableExist(NomdelaTable As String) As Boolean
On Error Resume Next
IsTableExist = (CurrentDb.TableDefs(NomdelaTable).Name = NomdelaTable)
CurrentDb.Close
End Function

voila

Effectivement c’est une bonne idée de passer par une fonction ; ca permet de traiter plus proprement le On Error Resume (que j’avais oublié de te dire d’ajouter).

D’une manière plus générale dans ton code, tu as écrit deux fois la même chose. Cela vient du fait que tu utilises un if…then…else là où un if simple aurait suffit.

Ton raisonnement :
Si la table existe
alors je l’efface puis je la recrée
sinon le la crée
fin_si

Ce qu’il faudrait faire :
Si la table existe
alors je l’efface
fin_si
Et comme maintenant dans tous les cas je n’ai plus de table, je la crée

Ca permet d’alléger le code, et surtout en cas de modif de n’avoir qu’un seul endroit où intervenir

ok, merci bcp!!pas bête du tout ça!!lol, jy avait pas penser pourtant j’ai réfléchit!
merci bcp!!


putain , jai essayer ce que tu me disait mé j'ai encore le pb ISAM qui apparait!!fé chier!!lol

je voulais savoir si tu savais si c’était possible de choisir que l’index d’une table importer soir ‘oui-avec doublon’ via du code VBA??
merci d’avance!!

bonjour tout le monde,
en fet j’ai un bouton dans un formulaire qui doit importer une feuille excel vers Access (jusque la j’ai pas de souci enfin à pars un problème d’ISAM)
Mon problème est d’indiquer par code VBA si les champs sont indexés… comment faire pour dire que les champs de la tables à importer ne sont pas indexés?? {cela correspond à Indexés : NON --> lors de l’importation manuelle}

merci d’avance pour vos aides!!

Normalement, quand on importe une table, elle n’est pas indexée. c’est à toi de l’indexer.
Au moment de crer ton index, tu mets sa propriété .Unique à false

tu as un exemple ici

ok, merci, mais unique c’est pour : “oui sans doublons”?? ou pour “oui avec doublons”??

si .unique est vrai, c’est sans doublobn, si .Unique est faux, c’est avec doublons

ok!! et comment on peut donc dire : NON??

Comment on peut dire non à quoi ?
Si ce que tu cherches c’est indexé = NON, il suffit de ne pas créer d’index

dsl, je me rapelé plu ke tu mavé di ke normalemen javé po a indexé si on voulé ke NON.Sui vrémen béte!!lol
Sinon j’ai deux autres question :
* on es obliger d’indexé chaque champ CAD on es obliger de créer un index pour chaque champ??yoré po une méthode plus simple??
* comment on fait pour dire que l’on veu que ce soi Access qui choissise la clé primaire d’une table??

merci d’avance !!

Non, il ne faut indexer que les champs où c’est vraiment utile.
La plupart du temps, la clé primaire suffit, sauf cas des regroupements, bien entendu.

Par contre pour ta deuxième question, je ne vois pas ce que tu veux dire. Tu veux un champ auto ?