FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Sommaire→VBA→Manipulation des données- Comment importer ou exporter ?
- Comment extraire une partie d'une chaîne de caractères ?
- Comment travailler sur une partie d'une chaîne de caractères ?
- Comment extraire un élément d'une chaîne délimitée qui est à une position donnée ?
- Comment convertir en majuscule la première lettre de chaque mot d'une phrase ?
- Replace n'existe pas sous Access 97, comment faire ?
- Comment séparer des éléments d'un champ dans des champs distincts (exemple : adresse) ?
- Comment arrondir un nombre après le séparateur décimal ?
- Comment empêcher l'affichage de toutes les décimales d'un nombre ?
- Comment simuler une tabulation (passer au contrôle suivant) ?
- Comment faire pour trier les enregistrements d'une table aléatoirement ?
- Comment arrondir un nombre sous Access 97 ?
- Comment utiliser copier/coller en VBA ?
- Comment mettre du texte en majuscules/minuscules ?
- Comment gérer la mise en forme des données d'un champ ou d'un contrôle ?
- Y a-t-il une différence entre le format d'affichage des données et les données réelles enregistrées ?
- Comment convertir un nombre décimal en binaire ?
- Comment obtenir la partie décimale d'un nombre ?
- Comment utiliser les fonctions mathématiques d'Excel dans Access ?
- Comment modifier un très grand nombre de données avec DAO ?
- Comment connaître le nombre d'enregistrements qui seront modifiés par une requête Action ?
- Comment synchroniser la barre de progression avec le parcours d'un Recordset ?
- Comment arrondir un nombre à sa valeur supérieure ou inférieure ?
- Comment faire un remplacement en chaîne ?
- Comment copier/coller les données d'un enregistrement dans un formulaire ?
- Comment réaliser un copier vers le presse-papiers ?
- Comment coller le contenu du presse-papiers dans un contrôle ?
11.2.1. Dates et Heures
(25)
11.2.2. Manipulation des données Trucs et Astuces
(10)
Utiliser les méthodes Transfer de l'objet DoCmd.
DoCmd.TransferText ' Import/export/attache vers du texteDoCmd.TransferSpreadSheet ' Import/export/attache vers une feuille de calculDoCmd.TransferDatabase ' Import/export/attache vers une autre base de données.Premier type d'extraction
Vous avez un identifiant (par exemple) composé de x lettres, d'un "-" puis de y chiffres.
Exemple : DRFS-135412
On veut incrémenter la partie numérique de l'identifiant.
On utilisera donc la fonction InStr() pour récupérer la position du caractère recherché (ici le tiret "-").
Puis, grâce aux fonctions mid() et right() nous pourrons isoler la partie numérique afin de l'incrémenter.
Voir aussi la fonction left() dans le même registre.
Autre type d'extraction
Par exemple, voici comment effacer le dernier caractère d'une chaîne de caractères :
Left(Tachaine,Len(Tachaine)-1)
À partir d'Access 2000, la fonction Split tranformera une chaîne de caractères en un tableau.
Lien : Comment travailler sur une partie d'une chaîne de caractères ?
Lien : Comment séparer des éléments d'un champ dans des champs distincts (exemple : adresse) ?
Lien : Tutoriel sur les chaînes de caractères
Lien : Tutoriel sur la classe String
Il existe différentes fonctions permettant de sélectionner une partie d'une chaîne de caractères comme les trois premières lettres ou bien les cinq dernières lettres :
len() pour connaître la longueur d'une chaîne ;
right() pour lire les x derniers caractères de la chaîne ;
left() pour lire les x derniers caractères de la chaîne.
Lien : Comment extraire une partie d'une chaîne de caractères ?
Lien : Comment séparer des éléments d'un champ dans des champs distincts (exemple : adresse) ?
Lien : Tutoriel sur les chaînes de caractères
Lien : Tutoriel sur la classe String
On utilise la fonction ci-dessous qui attend en paramètres la chaîne, la position de l'élément à extraire
et le délimiteur. Cette fonction renvoie une chaîne vide lorsqu'elle ne peut pas procéder à l'extraction.
Dans le cas d'une extraction partielle, cette fonction est beaucoup plus rapide qu'un Split.
Function ExtraitElement(ChaineRecherche As String, Position As Long, Delim As String) As String
' Renvoie une chaîne vide si l'extraction n'est pas possible
On Error GoTo Err_Function
Dim compteur As Long, LastPos As Long, CurPos As Long
If InStr(ChaineRecherche, Delim) = 0 Or Len(ChaineRecherche) = 0 Then Exit Function
LastPos = 1
Do
CurPos = InStr(LastPos, ChaineRecherche, Delim)
If CurPos = 0 Then
If compteur = Position - 1 Then ExtraitElement = Mid(ChaineRecherche, LastPos)
Exit Do
Else
compteur = compteur + 1
If compteur = Position Then
ExtraitElement = Mid(ChaineRecherche, LastPos, CurPos - LastPos)
Exit Do
End If
End If
LastPos = CurPos + 1
Loop While CurPos > 0
Exit Function
Err_Function:
MsgBox "Error " & Err.Number & " : " & Err.Description
Resume Next
End FunctionLien : FAQ VB
La fonction VBA StrConv permet de convertir des chaînes de caractères.
StrConv(String,Conversion)
Le premier paramètre correspond à la chaîne de caractères à convertir, le deuxième est le masque de conversion.
Utilisez la constante VbLowerCase pour convertir en minuscules, VbUpperCase pour convertir en majuscules,
VbProperCase pour convertir en noms propres : la première lettre de chaque mot est alors en majuscule, le reste en minuscules.
MsgBox StrConv("Ceci est un essai", vbProperCase)
Affiche : Ceci Est Un Essai
Public Function ReplaceT(ByVal Expression As String, _
ByVal Find As String, _
ByVal Replace As String, _
Optional ByVal Start As Long = 1, _
Optional ByVal Count As Long = -1, _
Optional ByVal Compare As Integer = vbTextCompare) _
As String
Dim P As Long ' Position 1er caractère à tester
Dim L As Long ' Longueur de expression
Dim f As Long ' Longueur de la chaîne à remplacer
Dim r As Long ' Longueur chaîne de remplacement
' Argument "Start" : élimination du début de chaîne
Let L = Len(Expression)
If Start > L Then
' Parce que "Right$" n'accepte pas une taille négative
Let Expression = vbNullString
ElseIf Start > 1 Then
' Troncature d'"Expression"
Let Expression = Right$(Expression, L - Start + 1)
End If
ReplaceT = Expression ' valeur retour par défaut
' Argument "Find" : si chaîne vide, on retourne "Expression".
If Find = vbNullString Then Exit Function
Let f = Len(Find)
Let r = Len(Replace) ' Taille de la chaîne de remplacement
Let P = 1 ' On commence à la première position
If Count <> 0 Then
Do
' La taille d'"Expression" peut varier lors de chaque
' remplacement (si "Find" et "Replace" sont de longueurs
' différentes), c'est pourquoi l'instruction suivante
' est située DANS la boucle.
Let L = Len(Expression)
' Position de la sous-chaîne à remplacer...
Let P = InStr(P, Expression, Find, Compare)
' ... si elle y figure bien
If P > 0 Then
Let Expression = Left$(Expression, P - 1) + _
Replace + _
Right$(Expression, (L - P - f + 1))
' Décalage 1er caractère à comparer (position trouvée
' + taille de la chaîne de remplacement)
Let P = P + r
' Un remplacement de moins à effectuer (si "Count">0)
' On continue indéfiniment si "Count" < 0
Let Count = Count - 1
End If
' Si le compteur atteint zéro (cas où on voulait un nombre
' défini de substitutions), ou s'il n'y a plus de
' remplacement possible, on sort.
Loop Until (P <= 0) Or (Count = 0)
End If
ReplaceT = Expression ' Retour..
End FunctionLien : Comment arrondir un nombre sous Access 97 ?
Lien : Tutoriel Classe String par cafeine
Exemple de contenu d'un champ :
'12 Rue MOZART 33000 BORDEAUX'
Nous voulons séparer cette chaîne en trois parties :
- l'adresse
- le code postal
- la ville
Ceci ne peut se faire automatiquement. Il faut réfléchir à l'algorithme de décomposition.
Ici, nous remarquons que les deux derniers éléments sont le CP et la ville.
Nous en déduisons qu'en partant de la fin de la chaîne, le premier caractère numérique de celle-ci sera le dernier chiffre du code postal.
Nous pouvons donc isoler la ville : il ne reste alors plus que deux éléments à décomposer.
Pour cela, nous savons qu'un CP ne possède que cinq caractères, il est donc aisé de l'isoler.
Fonctions nécessaires au travail d'une chaîne de caractères : mid(), right() et left().
Lien : Comment extraire une partie d'une chaîne de caractères ?
Lien : Comment travailler sur une partie d'une chaîne de caractères ?
Lien : Tutoriel sur les chaînes de caractères
Lien : Tutoriel sur la classe String
Lien : Extraire et mettre en forme le nom de rue d'une adresse afin de faciliter la recherche.
Access 2000+ :
round(nombre,nombre de décimales)
Avant 2000 :
Function Arrondi(ByVal Nbre As Double, ByVal Expo As Long) As Double
If Expo < 0 Then Arrondi = Arrondi(Nbre * 10 ^ Expo, Abs(Expo))
Arrondi = CLng(Nbre * 10 ^ Expo) / 10 ^ Expo
End FunctionOù Nbre est le nombre avec décimales, et Expo le nombre voulu de chiffres après le signe décimal.
Vous pouvez utiliser :
Clng(Nb*10^n)/10^nOù n est le nombre de décimales voulues, et Nb le nombre.
Vous obtiendrez le même résultat en utilisant :
Round(Nb,n)SendKeys "{TAB}"
Attention : l'instruction SendKeys est à utiliser avec parcimonie. Pour la fiabilité de votre code, préférez toujours des solutions plus directes : lorsque c'est possible, agissez directement sur les objets avec du code VBA plutôt que par l'intermédiaire d'une simulation clavier.
Par exemple, pour déplacer le focus vers un contrôle de formulaire, choisissez plutôt les méthodes MonContrôle.SetFocus ou Docmd.GotoControl si celles-ci suffisent à vos besoins.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Une solution est de créer un champ de type Long (entier Long) qui reçoive des nombres aléatoires. Il suffit alors de trier la table sur ce champ.
Vous pouvez définir la propriété Valeur par défaut du champ dans la table. Utilisez la fonction GenUniqueID() comme valeur de cette propriété.
Pour (re)définir les valeurs du champ, on peut utiliser la fonction Rnd() dans une boucle sur le Recordset de la table. Exemple en DAO :
Dim rs as Dao.Recordset
Randomize
Set rs = CurrentDb.OpenRecordset("MATABLE", DbOpenTable)
With rs
While Not .Eof
.Edit
!MonChampAléat = Clng(Int((2147483647 + 2147483648 + 1) * Rnd -2147483648))
.Update
.Movenext
Wend
.Close
End WithLien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
La fonction Round n'existe pas sous Access 97 de base.
Voici une fonction d'arrondissement (spécialement utile pour la comptabilité).
En gros certaines fonctions arrondissent 0,4450 à 0,44 au lieu de 0,45 comme c'est nécessaire parfois en comptabilité.
Avec celle-ci, il est même possible de choisir le chiffre qui induit un arrondi supérieur.
Function RoundCost(ByVal Nbr As Double, _
Optional ByVal Expo As Long = 2, Optional ByVal NextNumSup = 5) As Double
'Expo is the number of desired decimals
'NextNumSup is the min number after the Expo decimal which result in a Roundsup for Nbr
'Exemple : Roundcost(0.44X) = 0.45 if X >= NextNumSUp (5 by default)
'Correct bug for RoundSup(0.445) = 0.44
If Expo < 0 Then RoundCost = RoundCost(Nbr * 10 ^ Expo, Abs(Expo))
RoundCost = CLng(Nbr * 10 ^ Expo + (0.01 * (10 - NextNumSup))) / 10 ^ Expo
End FunctionVoici les deux commandes :
DoCmd.RunCommand acCmdCopy ' Copier
DoCmd.RunCommand acCmdPaste ' CollerPour copier le texte d'une zone de texte, il faut dans un premier temps le sélectionner, voici comment faire :
Me.Texte1.SetFocus
Me.Texte1.SelStart = 0
Me.Texte1.SelLength = Len(Texte1.Text)
' Le texte est sélectionné, il nous reste qu'à le copier.
DoCmd.RunCommand acCmdCopyIl existe plusieurs solutions qui affectent soit le format d'affichage des données, soit les données elles-mêmes.
Formatage de l'affichage seulement
Il suffit d'utiliser la propriété Format d'un champ de table ou de requête ou d'un contrôle de formulaire ou d'état.
Valeur de la propriété pour une seule lettre, en majuscule : >.
Valeur de la propriété pour une seule lettre, en minuscule : <.
Conversion des données :
Fonction Ucase$() -> Renvoie une valeur de type String contenant la chaîne indiquée, convertie en majuscules (cf. Aide Access).
Exemple :
Dim MaVariable As String
MaVariable = Ucase$("develoPPEZ123")MaVariable reçoit "DEVELOPPEZ123"
Mise en minuscules -> Lcase$()
Fonction Strconv() Renvoie une valeur de type Variant (String)
Dim MaVariable As String
MaVariable = Strconv("develoPPEZ123", vbUpperCase)MaVariable reçoit "DEVELOPPEZ123". Mise en minuscules -> vbLowerCase au lieu de vbUpperCase
Fonction Format(). Le deuxième argument prend une chaîne identique à la propriété Format. Cependant le résultat renvoyé sera une réelle conversion :
Dim MaVariable As String
MaVariable = Format("BONJOUR", "<")La variable "MaVariable" reçoit le texte "bonjour"
On peut également utiliser la propriété Masque de saisie (Inputmask) d'un champ de table ou d'un contrôle de formulaire.
Valeur de la propriété pour une seule lettre, en majuscule : >C
Valeur de la propriété pour une seule lettre, en minuscule : <C
Exemple : Pour avoir deux lettres en majuscules suivies de trois lettres en minuscules on aura : >CC<CCC
Cependant gérer la casse au moment de la saisie à l'aide cette propriété n'est pas la solution la plus souple, car il faut connaître à l'avance le nombre maximum de caractères pouvant être saisis.
Pour la saisie via un formulaire, préférez plutôt une conversion au moment de l'événement Sur touche Activée :
Private Sub Moncontrôle_KeyPress(KeyAscii As Integer)
KeyAscii = Asc(UCase$(Chr(KeyAscii)))
End SubDans Access, les moyens "classiques" de mise en forme des données d'un champ ou d'un contrôle sont les suivants :
- propriété Format : elle permet de contrôler la façon dont les données sont affichées, en y ajoutant n'importe quel caractère littéral où le souhaitez, par exemple des espaces.
Le formatage effectué ne concerne que l'affichage et n'affecte pas les données enregistrées. La propriété format est prioritaire sur la mise en forme déterminée par un masque de saisie ; - propriété Masque de saisie (InputMask) : le masque de saisie sert à faciliter/imposer la saisie des données sous une forme bien précise. Il est possible par exemple d'obliger l'utilisateur à saisir telle ou telle combinaison de chiffres et de lettres. Ou encore de prévoir l'insertion automatique d'espaces et autres caractères littéraux à des endroits de votre choix.
Vous pouvez choisir d'enregistrer ces caractères littéraux avec les données saisies elles-mêmes. Contrairement à la propriété format, le reste de la mise en forme imposée par le masque est quant à lui nécessairement et définitivement répercuté puisqu'il agit directement sur la saisie.
Ces deux propriétés permettent aussi d'agir sur la casse (majuscule/minuscule).
Consulter l'aide Access (F1) pour connaître les syntaxes et paramètres acceptés par les propriétés Format et Masque de saisie, et pour disposer de nombreux exemples.
Dans Access, les données peuvent être affichées dans des champs de tables ou de requêtes, dans des contrôles d'états ou de formulaires.
Mais il faut faire la distinction entre le format d'affichage des données et les données telles qu'elles sont enregistrées dans les tables (pour les champs) ou la propriété ControlSource (pour les contrôles).
Ainsi vous pouvez utiliser la propriété Format d'un champ ou d'un contrôle pour mettre en forme les données telles qu'elles apparaissent à l'utilisateur, mais sans affecter la version originale des données. Le format est juste une mise forme appliquée lors de l'affichage.
Par exemple, dans un champ stockant des tailles en cm, vous saisissez la valeur 183.
Définissez la propriété Format du champ comme ceci : 0\m00
Le champ affichera : 1m83
Mais la valeur qui est enregistrée dans la table sera bien 183.
Public Function DecimalToBinaire(DecVal As Double) As String
' Variable temporaire qui sert lors du traitement du nombre à convertir
Dim NbTmp As Double
' Variable/Indice de boucle
Dim IndiceP as Integer
NbTmp = DecVal
For IndiceP = 1 To Int(Log(DecVal) / Log(2)) + 1
DecimalToBinaire = CDbl(NbTmp Mod 2) & DecimalToBinaire
NbTmp = CDbl(Int(NbTmp / 2))
Next IndiceP
End FunctionIl vous suffit ensuite de l'appeler ainsi pour convertir par exemple 1324 en binaire :
DecimalToBinaire(1324)Int retourne la partie entière. La partie décimale est égale au nombre moins sa partie entière, on a donc facilement :
Dim N As Double
N = 2.322001
MsgBox N - Int(N)Ceci dit, pour que cela fonctionne aussi avec N négatif, il faut utiliser la fonction Fix à la place de Int. En effet, Int(-2.9) retourne -3 alors que Fix(-2.9) retourne -2.
Aide Access :
Différence entre les fonctions Int et Fix : si le nombre est négatif, Int renvoie le premier entier négatif inférieur ou égal à ce nombre, alors que Fix renvoie le premier entier négatif supérieur ou égal à nombre. Par exemple, Int convertit -8,4 en -9 et Fix convertit -8,4 en -8.
Ce qui donne donc :
Dim N As Double
N = -2.9
MsgBox Abs(N - Fix(N))Abs permet de retourner un résultat toujours positif.
La bibliothèque "Microsoft Excel x.x Object Library" permet d'utiliser toutes les fonctions disponibles sous Excel de la manière suivante :
WorksheetFunction.Nom de la fonctionPar exemple :
WorksheetFunction.NormSInv(0.5)
Attention cependant à l'apparente simplicité de ce code. L'objet WorksheetFunction est fourni par l'application Excel. Vous faites donc de l'automation, ce qui signifie qu'une instance Excel est lancée à chaque exécution de votre code.
L'ouverture et la fermeture de cette instance sont gérées automatiquement. Cependant du code automation sera toujours beaucoup plus lent qu'une fonction personnalisée exécutée directement par Access.
Lorsque vous tentez de modifier un très grand nombre d'enregistrements avec DAO, l'erreur 3052 (maxlocksperfile insuffisant) est levée.
La solution consiste à désactiver le verrouillage par enregistrement et utiliser ainsi le verrouillage par page.
En français, dans les options d'Access 2000 (et les versions suivantes), Onglet [Avancé] décocher la case [Ouvrir avec enregistrements verrouillés].
Puis relancer Access (dans le but de recharger Jet).
Le verrouillage par enregistrement est arrivé avec Jet 4.0 / Access 2000.
Si le moteur Jet applique un verrouillage au niveau enregistrement et si les enregistrements sont de petite taille alors on peut "économiser" des verrous en appliquant un verrouillage par page.
Le verrouillage au niveau de la page peut améliorer la situation à la condition qu'une page contienne plusieurs enregistrements.
Supposons que la taille d'un enregistrement soit de 500 octets, pour une taille de page de 4Ko: il y a 8 enregistrements/page.
Le verrouillage par page posera 8 fois moins de verrous qu'un verrouillage par enregistrement.
Attention : l'accès concurrent aux données peut s'en trouver fortement dégradé (applications multiutilisateurs)
Mais le problème du nombre limité de verrous existe toujours, sur les très grandes sources de données.
Quelques explications :
Ce problème semble bien être une limitation "by design" du moteur de bases de données Jet 4.0.
Effectivement, le paramètre MaxLocksPerFile permet de repousser la limite du nombre de verrous, mais pas à l'infini.
Alors comment faire pour gérer une telle situation ?
Lorsque le maximum de verrous est atteint, il faut "libérer" le Recordset (et donc les verrous) et puis ensuite reprendre le traitement là où on l'avait "suspendu". Il n'y a pas de contournement.
Apparemment, Jet 4.0 met en œuvre une telle démarche incrémentale dans le cadre de "grosse" requête UPDATE (transactionnée seulement ?).
Dans cette configuration, le paramètre MaxLocksPerFile est utilisé par Jet pour décider à quel moment entériner les modifications déjà faites, libérer les verrous et puis reprendre le traitement, sans jamais dépasser cette limite.
En revanche, dans le cas d'une programmation directe des Recordsets via VBA/DAO, le programmeur doit mettre en oeuvre cette démarche dans son code.
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
La propriété RecordsAffected de l'objet QueryDef retourne le nombre d'enregistrements affectés par l'ordre SQL après exécution.
Parfois, vous auriez besoin de cette information avant modification. Du genre : "Êtes-vous sûr de vouloir supprimer 10 enregistrements ?"
Pour cela vous pouvez utiliser une transaction. L'ordre SQL sera lancé dans la transaction,
et il sera alors possible d'annuler l'opération (Rollback) si l'utilisateur ne souhaite pas continuer.
Const REQUETE As String = "raaa"
Dim q As DAO.QueryDef
Dim n As Long
DBEngine.BeginTrans
Set q = CurrentDb.QueryDefs(REQUETE)
q.Execute
If MsgBox("Vous allez insérer " & q.RecordsAffected & _
" nouveaux enregistrements." & vbCrLf & _
"E
Êtes-vous sûr de vouloir continuer ?", vbYesNo + vbQuestion, "Insertion") = vbYes Then
DBEngine.CommitTrans
Else
DBEngine.Rollback
End If
La méthode CommitTrans valide les modifications apportées.
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
La propriété PercentPosition du Recordset DAO retourne la position de l'enregistrement courant en pourcentage.
Ainsi, le squelette du code permettant une telle synchronisation ressemblera à :
Dim oRst As DAO.Recordset
' Ici ouverture du Recordset
'
'
'
''''''''''''''''''''''''''
SysCmd acSysCmdInitMeter, "Traitement", 100 ' Définit la valeur maximale de la jauge.
While Not oRst.EOF
SysCmd acSysCmdUpdateMeter, Int(oRst.PercentPosition) ' Définit la valeur actuelle de la jauge.
' Ici traitement sur l'enregistrement
'
'
'
oRst.MoveNext
Wend
SysCmd acSysCmdRemoveMeter ' Supprime la jauge d'avancementLien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Contrairement à la fonction Round qui arrondit un nombre à sa valeur la plus proche en fonction des décimales choisies,
cette fonction propose la fonction myRound qui arrondit un nombre à sa valeur supérieure et inférieure en fonction des décimales choisies.
Enum myRoundEnum
myRoundup = -1
myRoundDown = 1
End Enum
Public Function myRound(vValeur As Variant, Optional byNbDec As Byte, Optional eSens As myRoundEnum = myRoundup) As Variant
myRound = eSens * Int(eSens * vValeur * 10 ^ byNbDec) / 10 ^ byNbDec
End Function
L'appel de cette fonction :
Sub test()
MsgBox myRound(4.333, 1, myRoundup)
MsgBox myRound(4.333, 1, myRoundDown)
End Sub
Une fonction qui peut être utile pour éviter d'imbriquer trop de remplacements.
Function ReplaceArray(ByVal strExp As String, _
ByVal strToFind As Variant, _
ByVal strToReplace As Variant) As String
Dim i As Long
If IsArray(strToFind) And IsArray(strToReplace) Then
If UBound(strToFind) = UBound(strToReplace) Then
For i = 0 To UBound(strToFind)
strExp = Replace(strExp, strToFind(i), strToReplace(i))
Next i
ReplaceArray = strExp
Else
ReplaceArray = vbNullString
End If
Else
ReplaceArray = Replace(strExp, strToFind, strToReplace)
End If
End Function
Qui permet de faire :
replaceArray(Champ, Array("-","/"), Array("",""))- Ouvrez en mode création le formulaire dans lequel vous aurez besoin de copier et coller des données ;
- Créez deux boutons. Appelez (par exemple) le premier « Copier » et le second « Coller » ;
- Associez pour le bouton « Copier » la procédure sur clic suivante :
Private Sub Copier_Click()
On Error GoTo GestionErreur
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdCopy
GestionErreur:
Select Case Err.Number
Case 2046 MsgBox "Action impossible pour le moment", vbExclamation + vbOKOnly, "Copier"
End Select
End SubEn clair, cela signifie qu'en cliquant sur le bouton "Copier", Access va sélectionner l'enregistrement en cours (celui qui est affiché), pour le copier. Le module de gestion des erreurs prévoit le cas où vous n'auriez pas encore de données dans l'enregistrement en cours. Attention : Access reprendra toutes les données de l'enregistrement !
4. Associez pour le bouton « Coller » la procédure sur clic suivante :
Private Sub Coller_Click()
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdPaste
End SubLorsque vous cliquerez sur le bouton "Coller", Access collera les données de l'enregistrement que vous aurez copié. Attention ! Il remplacera les données de l'enregistrement dans lequel vous êtes. Vous pouvez aussi coller les données dans un nouvel enregistrement !
Cette fonction copie le texte du contrôle actif dans le presse-papiers.
Public Function CopierPressePapiers()
On Error GoTo Erreur
' Pour copier, il faut dans un premier temps sélectionner le contenu actuel
Screen.ActiveForm.Refresh 'Pour s'assurer que le contenu actuel correspond à ce qui est affiché
Screen.ActiveForm.ActiveControl.SetFocus
Screen.ActiveForm.ActiveControl.SelStart = 0
Screen.ActiveForm.ActiveControl.SelLength = Len(Screen.ActiveForm.ActiveControl.Text)
' N.B. ActiveControl.Text pour capter ce qui est affiché à l'écran
' Copier dans le presse-papiers
DoCmd.RunCommand acCmdCopy
Exit Function
Erreur:
Select Case err.Number
Case 2465 ' Le champ à copier est vide
MsgBox "Un champ vide ne peut être copié"
Case Else
MsgBox err.Number & " " & err.Description
End Select
End FunctionLien : Copier le contenu d'un contrôle vers le presse-papiers Windows
Cette fonction colle le contenu du presse-papiers dans le contrôle actif.
Public Function CollerPressePapiers()
On Error GoTo Erreur
' Pour coller, il faut dans un premier temps sélectionner le contenu actuel
Screen.ActiveForm.ActiveControl.SetFocus
Screen.ActiveForm.ActiveControl.SelStart = 0
Screen.ActiveForm.ActiveControl.SelLength = Len(Screen.ActiveForm.ActiveControl.Text)
' N.B. ActiveControl.Text pour capter ce qui est affiché à l'écran
' Le texte est sélectionné, il ne nous reste qu'à le remplacer.
DoCmd.RunCommand acCmdPaste
Exit Function
Erreur:
MsgBox err.Number & " " & err.Description
End FunctionLien : Copier le contenu d'un contrôle vers le presse-papiers Windows



