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

VBA Access Discussion :

importation feuille excel avec doublons


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 8
    Points : 3
    Points
    3
    Par défaut importation feuille excel avec doublons
    Bonjour à tous,

    Je reviens vers vous pour une question qui me pose problème depuis lpusieurs jours maintenant.

    Je cherche à importer depuis excel des données dans ma BDD ACCESS.
    Configuration BDD:
    Table1(Repère cable, Type circuit, secttion)
    Table2(Repère cable, Type circuit, Numero tablette, Tenant géo, Tenant fonctionnel)
    relation 1...* entre les deux tables avec Repère cable et type cable

    Ma feuille excel comporte pour chaque lignes les colonnes suivante:
    Nb, Type circuit, Tenant géo, tenant fonctionnel, repère cable, aboutissant géo, aboutissant fonctionnel)

    Pour être capable de faire mon importation de donnée de la table 1, je me suis servis du code suivant
    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
    Private Sub Commande47_Click()
    'importer table 1
    Dim xlPath As String
    Dim wsName As String
    Dim startRow As Integer
    Dim pKeyCol As String
    Dim acTable As String
    Dim pKey As String
     
    xlPath = "C:\Users\SCoudurier\Desktop\Cable routing T1_20120525.xlsx"
    wsName = "Scope"
    startRow = 3
    pKeyCol = "A"
    acTable = "Table1"
    pKey = "N°"
     
    '-> La fonction renvoie vrai si l'import réussit et faux dans le cas contraire
    'xlPath : chemin du fichier Excel
    'wsName : nom de la feuille Excel qui contient les données à importer
    'startRow : ligne du fichier Excel où commence l'import
    'pKeyCol : colonne du fichier Excel qui est la clé primaire de la table Access
    'acTable : table Access qui reçoit les données
    'pKey : nom du champ "identifiant"
    ImportXL1 xlPath, wsName, startRow, pKeyCol, acTable, pKey
    End Sub
     
    Function ImportXL1(xlPath As String, wsName As String, startRow As Integer, pKeyCol As String, acTable As String, pKey As String) As Boolean
    '-> La fonction renvoie vrai si l'import réussit et faux dans le cas contraire
    'xlPath : chemin du fichier Excel
    'wsName : nom de la feuille Excel qui contient les données à importer
    'startRow : ligne du fichier Excel où commence l'import
    'pKeyCol : colonne du fichier Excel qui est la clé primaire de la table Access
    'acTable : table Access qui reçoit les données
    'pKey : nom du champ "identifiant"
     
        'active la routine de gestion d'erreur.
        On Error GoTo erreur
     
        'déclaration des variables
        Dim app As Excel.Application
        Dim wkb As Excel.Workbook
        Dim wks As Excel.Worksheet
     
        'initialisation des variables
        Set app = New Excel.Application
        Set wkb = app.Workbooks.Open(xlPath)
        Set wks = wkb.Worksheets(wsName)
     
        Dim i As Integer, cSQL As String
        i = startRow
     
        'pour éviter les messages lors de l'ajout des enregistrements
        DoCmd.SetWarnings False
     
        With wks
            'arrêter l'importation lorsque l'on rencontre une case vide
            While .Range(pKeyCol & i).Value <> "" '(où pKeyCol représente la colonne et i la ligne)
     
                'condition de remplissage de la table => eviter les doublons
                'si l'enregistrement existe déjà dans la table destination,
                'on passe à la ligne suivante sans l'importer
                If DCount("*", acTable, pKey & " LIKE '" & .Range(pKeyCol & i).Value & "'") = 0 Then
     
                    'requête SQL (ajouter autant de champs que nécessaire)
                    cSQL = "INSERT INTO " & acTable & " ( [Type circuit], [Repère câble]) VALUES (" & Chr(34) & .Range("B" & i) & Chr(34) & ", " & Chr(34) & .Range("F" & i) & Chr(34) & ");"
                    'exemple avec les colonnes E et G
     
                    'exécute la requète
                    DoCmd.RunSQL cSQL
     
                End If
     
                'on incrémente la variable i pour passer à la ligne suivante
                i = i + 1
            Wend
     
        End With
     
        'on réactive les messages d'erreurs
        DoCmd.SetWarnings True
     
        'libération variables
        Set wks = Nothing
        Set wkb = Nothing
        Set app = Nothing
     
        MsgBox "Import du fichier Excel réussi.", vbInformation + vbOKOnly, "Opération terminée..."
     
        ImportXL = True
        Exit Function
     
    erreur:    ' Routine de gestion d'erreur.
        MsgBox "Erreur: " & Err.Number & vbCrLf & Err.Description, vbOKOnly + vbInformation
        ImportXL = False
    End Function
    Mon soucis, c'est pour remplir ma deuxième table.
    j'ai mon numéro de tablette qui doit varier de 1 à 40 suivant si j'ai plusieurs ligne avec le même repère de câble et le même type de circuit sur ma feuille excel.
    C'est la où je bloque.
    je n'arrive pas à trouver une façon de faire qui puisse me permettre de détecter si une tablette existe déjà dans ma table 2 et de là,
    si tablette n'existe pas, alors numéro tablette =1
    sinon, numéro tablette est égale max(numéro tablette)+1.

    Quelqu'un pourrait il m'aider, svp??

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    J'ai un peu de misère à suivre ton code mais voici comment je procéderai 'hors contexte'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dim numTablette as long
    dim critere as string:critere="Ici ton critere"
     
    if isnull(DFirst("NomTonChamp","NomTaTable",critere)) then
        'La tablette n'existe pas
        numTablette=1
      else
        'La tablette existe
        numTablette=DMax("NomTonChamp","NomTaTable",critere)+1
    end if
    A+

Discussions similaires

  1. Sélection d'une feuille excel avec une listbox
    Par felibelle dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/07/2022, 17h27
  2. [POI] Importer fichier Excel avec plusieurs feuilles
    Par ninoch07 dans le forum Documents
    Réponses: 9
    Dernier message: 10/02/2015, 09h59
  3. [XL-2010] Import de feuilles excel avec chaine de connexion
    Par Audric06 dans le forum Excel
    Réponses: 0
    Dernier message: 09/04/2014, 16h57
  4. importer feuille excel avec une requête sql
    Par rochna dans le forum VB.NET
    Réponses: 2
    Dernier message: 01/09/2010, 13h10
  5. comment importer une feuille excel avec delphi
    Par Mucho85 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 21/01/2009, 12h10

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