Faire référence à un nom de champ dans ma fonction vba
Résoluyg_be Messages postés 23437 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 !! :)
2 réponses
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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 = NothingFonction 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 FunctionEncore une fois, merci énormément!! :)