Faire référence à un nom de champ dans ma fonction vba

Résolu
BiankaBo Messages postés 51 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 31 janvier 2024 - 30 janv. 2024 à 22:15
yg_be Messages postés 22890 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 juin 2024 - 31 janv. 2024 à 21:14

Bonjour à vous,

J'ai une base de données Access qui me sert à importer des données provenant d'un site externe puis à convertir les données comme il se doit pour ensuite les extraire en un fichier texte sous une forme très stricte (avec des positions et des espaces blancs à respecter) afin que mon système comptable puisse le lire adéquatement. 

J'ai quelques manipulations à faire avec mes données avant de pouvoir les extraire, dont ajouter des espaces avant ou après les données selon le nombre de caractères requis pour le champ.

Voici donc mes objets:

- Table "Donnees" : [No],[A],[B],[C],...
Cette table contient les données que j'importe directement du site à convertir.
- Table "Caracteres" : [No],[NomChampC],[Caracteres]
Cette table regroupe tous les noms des champs de la table "Donnees" avec le nombre de caractères que les données doivent combler.

Par exemple, si le champ [A] correspond au numéro de facture et que la donnée du site est "20231130" (correspondant à 8 caractères), mais que le nombre de caractères requis est 12, je dois combler avec 4 espaces blancs à droite de la donnée, ce qui donne "20231130    ".

Pour ce faire, j'utilise un bouton de formulaire qui exécute une requête UPDATE:
BOUTON: 

Private Sub Commande6_Click()
'Call ChampCaP(Caracteres)

Dim Ma_table As Recordset, strC As String
Set Ma_table = CurrentDb.OpenRecordset("Caracteres")

Do Until Ma_table.EOF
    strC = Ma_table![NomChampC]
    Call CurrentDb.Execute("UPDATE Donnees SET " & strC & " = CharEspacesD ([" & strC & "], " & strC & ")")
    Ma_table.MoveNext
Loop




End Sub

Et voici donc ma fonction à laquelle je fais référence:



Public Function CharEspacesD(ByVal s As String, c As String) As String
 
    Dim nbEsp As Variant, i As Integer, nbCaracReq As Variant, strWEspaces As String
            

    nbCaracReq = DLookup("[NbCaracteres]", "Caracteres", "[NomChampC] = '" & c & "'")


    If Len(s) <= nbCaracReq Then
            
            nbEsp = nbCaracReq - Len(s)
            
            strWEspaces = s & Space(nbEsp)
            s = strWEspaces
    End If
    
    If Len(s) > nbCaracReq Then
            
            strWEspaces = Left(s, nbCaracReq)
            s = strWEspaces

    End If
 
 CharEspacesD = s
 

 
End Function


En premier lieu, j'aimerais savoir s'il est possible d'attribuer une valeur avec seulement des espaces à un enregistrement. donc, si mon numéro de facture est vide, mettre seulement 12 espaces blancs.

En deuxième, Ma fonction ne fonctionne pas parce que la variable "c" fait référence aux données présentes dans l'enregistrement et non au nom du champ de la donnée. Est-ce possible de transférer le nom du champ dans une fonction?

Merci beaucoup, j'attends vos réponses avec impatience !! :) 

2 réponses

yg_be Messages postés 22890 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 juin 2024 1 477
31 janv. 2024 à 09:47

bonjour,

Il me semble qu'il y a plusieurs anomalies dans ton code.

Pour commencer:

  1. Ma_table me semble parcourir la mauvaise table
  2. Au lieu de faire appel à une requête update, il est préférable d'utiliser les fonctions edit et update de VBA.
  3. Pourquoi ne pas utiliser NomChampC comme second paramètre de la fonction CharEspacesD?
0
BiankaBo Messages postés 51 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 31 janvier 2024
31 janv. 2024 à 20:29

Bonjour à vous,

Grâce à votre réponse, j'ai modifié mes codes pour faire référence directement à la bonne table, ce qui simplifie beaucoup mes codes. Merci beaucoup!

Ce que je n'avais pas pensé, c'est que je tentais de faire un DLookup dans ma fonction alors que je pouvais la faire à l'extérieure et ajouter le résultat comme deuxième paramètre à ma fonction. C'est ce que j'ai fait et ça fonctionne très bien.

J'ai aussi pris le temps de regarder ce que vous me proposiez avec les fonctions edit et Update que je trouve très intéressant d'ailleurs, mais mon manque d'expérience me ramenait à mon problème de nom de champ.

Merci beaucoup d'avoir pris le temps de m'aider, c'est très apprécié! :) 

Voici donc ce qui fonction pour moi :

Bouton: 

Dim base As Database: Dim table As TableDef
Dim champ As Field
Set base = CurrentDb()
Set table = base.TableDefs("Donnees")


Dim MChamp As String, nbCaracReq As Variant

For Each champ In table.Fields
    
    If champ.Name <> "No" Then
        MChamp = champ.Name
        nbCaracReq = DLookup("[NbCaracteres]", "Caracteres", "[NomChampC] = '" & MChamp & "'")
        Call CurrentDb.Execute("UPDATE Donnees SET " & MChamp & " = CharEspacesD ([" & MChamp & "], " & nbCaracReq & ")")
    End If
    
Next champ

base.Close

Set table = Nothing
Set base = Nothing

Fonction associée : 

Public Function CharEspacesD(ByVal s As String, c As Variant) As String
 
    Dim nbEsp As Variant, strWEspaces As String
                   
   
    If Len(s) <= c Then
            
            nbEsp = c - Len(s)
            
            strWEspaces = s & Space(nbEsp)
            s = strWEspaces
    End If
    
    If Len(s) > c Then
            
            strWEspaces = Left(s, c)
            s = strWEspaces

    End If
 
 CharEspacesD = s
 
 
End Function

Encore une fois, merci énormément!! :) 

0
yg_be Messages postés 22890 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 juin 2024 1 477
31 janv. 2024 à 21:14

Je dois avouer que je n'avais pas completement compris ton approche.

Content que j'ai pu t'assister à aboutir à une bonne solution!

0