Faire référence à un nom de champ dans ma fonction vba
Résoluyg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
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 !! :)
- Faire référence à un nom de champ dans ma fonction vba
- Fonction si et - Guide
- Nom de l'adresse - Forum Réseaux sociaux
- Reference pto - Accueil - Box & Connexion Internet
- Annuaire portable gratuit a partir d'un nom - Forum Réseaux sociaux
- Nom d'adresse - Forum Jeux vidéo
2 réponses
bonjour,
Il me semble qu'il y a plusieurs anomalies dans ton code.
Pour commencer:
- Ma_table me semble parcourir la mauvaise table
- Au lieu de faire appel à une requête update, il est préférable d'utiliser les fonctions edit et update de VBA.
- Pourquoi ne pas utiliser NomChampC comme second paramètre de la fonction CharEspacesD?
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!! :)