FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- 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 texte
DoCmd.TransferSpreadSheet
' Import/export/attache vers une feuille de calcul
DoCmd.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
Function
Lien : 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
Function
Lien : 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
Function
Où 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
^
n
Où 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
With
Lien : 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
Function
Voici les deux commandes :
DoCmd.RunCommand
acCmdCopy ' Copier
DoCmd.RunCommand
acCmdPaste ' Coller
Pour 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
acCmdCopy
Il 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
Sub
Dans 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
Function
Il 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 fonction
Par 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'avancement
Lien : 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
Sub
En 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
Sub
Lorsque 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
Function
Lien : 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
Function
Lien : Copier le contenu d'un contrôle vers le presse-papiers Windows