
Sommaire
>
VBA >
Manipulation des données Importer/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 ? Convertir en majuscule la première lettre de chaque mot d'une phrase Replace n'existe pas sous Access 97, comment faire ? Séparer des éléments d'un champ dans des champs distincts (exemple : adresse) ? Comment arrondir un chiffre après la virgule ? Comment empêcher l'affichage de toute 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 ? Arrondir un nombre sous Access 97 Utiliser copier/coller en VBA Comment mettre du texte en majuscule / minuscule ? Comment gérer la mise en forme les données d'un champ ou d'un contrôle ? 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 ? Obtenir la partie décimale d'un nombre Utilisations des 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 chaine ? Comment Copier/Coller les données d'un enregistrement dans un Formulaire ? Comment réaliser un copier vers le presse papier et coller depuis un contrôle ? 11.2.1. Dates et Heures (25) Pourquoi utiliser le type date ? Comment afficher des durées supérieures à 24 heures ? Comment obtenir, pour une date donnée, la date du dernier jour du mois ? Quel format de dates utiliser pour les requêtes, les calculs VBA, les contrôles de formulaires ? Comment calculer la différence entre 2 dates ? Comment calculer l'âge d'une personne ? Comment ajouter des jours, des mois ou des années à une date ? Le format de la date ne correspond pas à ce que je demande Problème de format de date. Le jour et le mois sont parfois inversés. Comment transformer une valeur numérique en format 'heures : minutes : secondes' ? Comment récupérer les informations d'une date (quantième, trimestre ...) ? Extraire la date ou l'heure avec Int(), à partir d'un champ ou d'une variable date. Calcul de durées par soustraction. Je veux afficher la date d'aujourd'hui sans l'heure. Comment fonctionne le type Date/Heure ? Comment obtenir un mois en toutes lettres à partir d'une Date ? Comment changer le jour, mois, année d'une date ? Comment connaître le jour de la semaine à partir d'une date ? Comment savoir si un jour est ouvré ? Comment convertir une chaîne de caractères en date ? Comment déterminer la date du premier jour d'une semaine ? Comment obtenir la date tout en lettres. Comment additionner deux champs aux valeurs de type ..h..mn ? Comment transformer les heures en centièmes Comment convertir Date Julienne vers Date normale ? 11.2.2. Trucs et Astuces (10) Convertir une date au format UNIX en format français Créer un password ou un code (chiffre+lettre) en VBA Calculer le résultat d'un tarif à la seconde à partir d'un tarif et d'une heure. Calculer le nombre de jours ouvrables entre 2 dates Comment connaître le séparateur décimal ? Transformer des centièmes en minutes, secondes et centièmes Comment effectuer un calcul statistique à partir des valeurs contenues dans un tableau ? Comment optimiser l'ajout sur une grande table dans un recordset DAO Comment faire un Update d'enregistrements non directement modifiables ? Comment enlever le trait de séparation entre la zone en-tête de formulaire et la zone détail de ce meme formulaire ?
| auteur : Team Access | Utiliser les méthodes Transfer de l'objet DoCmd. DoCmd. TransferSpreadSheet
|
|
| auteur : Team Access |
La fonction VBA StrConv permet de convertir des chaines de caractères.
StrConv (String ,Conversion)
|
Le premier paramètre correspond à la chaine 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
|
| auteur : shwin | 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
Dim L As Long
Dim f As Long
Dim r As Long
Let L = Len (Expression)
If Start > L Then
Let Expression = vbNullString
ElseIf Start > 1 Then
Let Expression = Right $(Expression, L - Start + 1 )
End If
ReplaceT = Expression
If Find = vbNullString Then Exit Function
Let f = Len (Find)
Let r = Len (Replace )
Let P = 1
If Count < > 0 Then
Do
Let L = Len (Expression)
Let P = InStr (P, Expression, Find, Compare)
If P > 0 Then
Let Expression = Left $(Expression, P - 1 ) + _
Replace + _
Right $(Expression, (L - P - f + 1 ))
Let P = P + r
Let Count = Count - 1
End If
Loop Until (P < = 0 ) Or (Count = 0 )
End If
ReplaceT = Expression
End Function
|
|
lien : Arrondir un nombre sous Access 97
lien : Tutoriel Classe String par cafeine
|
| auteur : Maxence HUBICHE | Access 2000+ :
round(nombre,nombre de décimale)
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 à virgule, et Expo le nombre voulu de chiffre après la virgule.
|
| auteur : Maxence HUBICHE | Vous pouvez utiliser :
Où n est le nombre de décimales voulues, et Nb le nombre.
Vous obtiendrez le même résultat en utilisant :
|
| auteurs : Bidou, FRED.G |
Attention : l'instruction SendKeys est à utiliser avec parcimonie. Pour la fialbilité 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 peuvent suffir à vos besoins.
|
| auteur : FRED.G | 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. Utilsez 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 ?
|
| auteur : extros | La fonction Round n'existe pas sous Access 97 de base.
Voici une fonction d'arrondi (spécialement utile pour la comptabilité) :
En gros certaine fonction arrondissent 0,4450 a 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
If Expo < 0 Then RoundCost = RoundCost (Nbr * 10 ^ Expo, Abs (Expo))
RoundCost = CLng (Nbr * 10 ^ Expo + (0 . 01 * (10 - NextNumSup))) / 10 ^ Expo
End Function
|
|
lien : Replace n'existe pas sous Access 97, comment faire ?
|
| auteur : Tofalu | Voici les deux commandes :
DoCmd. RunCommand acCmdCopy
DoCmd. RunCommand acCmdPaste
|
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 )
DoCmd. RunCommand acCmdCopy
|
|
| auteur : FRED.G |
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 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 minuscule -> Lcase$()
Fonction Strconv() Renvoie une valeur de type Variant (String)
Dim MaVariable As String
MaVariable = Strconv (" develoPPEZ123 " , vbUpperCase)
|
MaVariable reçoit "DEVELOPPEZ123"
Mise en minuscule -> 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ère pouvant être saisis.
Pour la saisie via un formulaire, préférer 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
|
|
| auteur : FRED.G |
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.
|
| auteur : fdraven |
Public Function DecimalToBinaire (DecVal As Double) As String
Dim NbTmp As Double
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 :
|
| auteur : Tofalu |
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 number est négatif, Int renvoie le premier entier négatif inférieur ou égal à number, alors que Fix renvoie le premier entier négatif supérieur ou égal à number. 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.
|
| auteurs : FRED.G, LeLaid |
La librairie "Microsoft Excel x.x Object Library" permet d'utiliser toutes les fonctions disponibles sous Excel de la manière suivante :
WorksheetFunction. Nom de la fontion
|
Par exemple :
WorksheetFunction. NormSInv (0 . 5 )
|
Attention cependant à l'apparente simplicité de ce code. L'objet WorksheetFunction est fournit 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 est gérée automatiquement. Cependant du code automation sera toujours plus beaucoup plus lent qu'une fonction personnalisée exécutée directement par Access.
|
| auteur : =JBO= |
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 enregsitrement et utiliser ainsi le verrouillage par page.
En français, dans les options d'Access 2000 (et suivants ?), 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 petites tailles alors tu peux "é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 multi-utilisateurs)
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 oeuvre 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 ?
|
| auteur : Tofalu | 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 retroune 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 : "Etes-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 & _
" Etes 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 ?
|
| auteur : Tofalu | 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
SysCmd acSysCmdInitMeter, " Traitement " , 100
While Not oRst. EOF
SysCmd acSysCmdUpdateMeter, Int (oRst. PercentPosition )
oRst. MoveNext
Wend
SysCmd acSysCmdRemoveMeter
|
|
lien : Définition et manipulation de données avec DAO par Tofalu
lien : Comment déclarer une référence dans MS-Access ?
|
| auteur : Tofalu |
Contrairement à la fonction Round qui arrondi un nombre à sa valeur la plus proche en fonction des décimales choisies,
cette fonction propose la fonction myRound qui arrondi un nombre à sa valeur supérieure et inférieur 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
|
|
| auteur : Cafeine |
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 (" " ," " ))
|
|
| auteur : damkre | Si vous désirez reprendre toutes les données d'un enregistrement dans ce formulaire, et ce afin d'éviter de recopier toutes les données, voici comment faire :
- 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 copier. Attention ! Il remplacera les données de l'enregistrement dans lequel vous êtes.
Vous pouvez aussi coller les données dans un nouvel enregistrement !
|
| auteur : ClaudeLELOUP | Vous trouverez ci-joint deux fonctions, une vous permettant de réaliser le copier vers le presse-papier de
windows et l'autre pour réaliser le coller. Le principe des fonctions sont de copier l'ensemble des données contenues
dans un zone de texte ou liste modifiable et de coller l'ensemble dans les mêmes contrôles.
Sur l'évènemment double-clic appeler l'une ou l'autre fonction. Public Function CopierPressePapier ()
On Error GoTo Erreur
Screen. ActiveForm . Refresh
Screen. ActiveForm . ActiveControl . SetFocus
Screen. ActiveForm . ActiveControl . SelStart = 0
Screen. ActiveForm . ActiveControl . SelLength = Len (Screen. ActiveForm . ActiveControl . Text )
DoCmd. RunCommand acCmdCopy
Exit Function
Erreur :
Select Case err . Number
Case 2465
MsgBox " Un champ vide ne peut être copié "
Case Else
MsgBox err . Number & " " & err . Description
End Select
End Function
|
Public Function CollerPressePapier ()
On Error GoTo Erreur
Screen. ActiveForm . ActiveControl . SetFocus
Screen. ActiveForm . ActiveControl . SelStart = 0
Screen. ActiveForm . ActiveControl . SelLength = Len (Screen. ActiveForm . ActiveControl . Text )
DoCmd. RunCommand acCmdPaste
Exit Function
Erreur :
MsgBox err . Number & " " & err . Description
End Function
|
|
lien : Copier le contenu d'un contrôle vers le presse papier Windows
|
Consultez les autres F.A.Q's
Les sources présentés sur cette pages sont libre de droits,
et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs.
Copyright ©2004
Developpez LLC. Tout droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de
l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans
de prison et jusqu'à 300 000 E de dommages et intérets.
Cette page est déposée à la SACD.
|