Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo
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 ?

precedent    sommaire    suivant   


Importer/exporter
auteur : Team Access
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.

Comment extraire une partie d'une chaîne de caractères ?
auteur : Demco
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 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 :
A partir d'Access 2000, la fonction Split tranformera une chaîne de caractères en un tableau.
Par exemple, voici comment effacer le dernier caractère d'une chaîne de caractère :
Left(Tachaine,Len(Tachaine)-1)
lien : fr Comment travailler sur une partie d'une chaîne de caractères ?
lien : fr Séparer des éléments d'un champ dans des champs distincts (exemple : adresse) ?
lien : fr Tutoriel sur les chaînes de caractères
lien : fr Tutoriel sur la classe String

Comment travailler sur une partie d'une chaîne de caractères ?
auteur : Demco
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 dernières lettres de la chaîne.
left() Pour lire les x dernières lettres de la chaîne.

lien : fr Comment extraire une partie d'une chaîne de caractères ?
lien : fr Séparer des éléments d'un champ dans des champs distincts (exemple : adresse) ?
lien : fr Tutoriel sur les chaînes de caractères
lien : fr Tutoriel sur la classe String

Comment extraire un élément d'une chaîne délimitée qui est à une position donnée ?
auteur : Jean-Marc Rabilloud
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 chaine 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

Convertir en majuscule la première lettre de chaque mot d'une phrase
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


Replace n'existe pas sous Access 97, comment faire ?
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            ' 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
    ' parceque "Right$" n'accepte pas 1 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  on voulait un nombre
        ' défini de substitutions),  s'il n'y a plus de
        ' remplacements possibles, on sort.
        Loop Until (P <= 0) Or (Count = 0)
    End If
ReplaceT = Expression        ' retour..
End Function 
lien : Arrondir un nombre sous Access 97
lien : fr Tutoriel Classe String par cafeine

Séparer des éléments d'un champ dans des champs distincts (exemple : adresse) ?
auteur : Lucifer
Exemple de contenu d'un champ :
'12 Rue MOZART 33000 BORDEAUX'

Nous voulons séparer cette chaîne en trois partie :

  1. l'adresse
  2. le Code Postal
  3. 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.
Ainsi, nous en déduisons qu'en partant de la fin de la chaîne, le premier caractère numérique de la chaîne sera le dernier chiffre du code postal.
Nous pouvons donc isoler la ville, il ne reste 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 : fr Comment extraire une partie d'une chaîne de caractères ?
lien : fr Comment travailler sur une partie d'une chaîne de caractères ?
lien : fr Tutoriel sur les chaînes de caractères
lien : fr Tutoriel sur la classe String
lien : fr Extraire et mettre en forme le nom de rue d'une adresse afin de faciliter la recherche.

Comment arrondir un chiffre après la virgule ?
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.


Comment empêcher l'affichage de toute les décimales d'un nombre ?
auteur : Maxence HUBICHE
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)

Comment simuler une tabulation (passer au contrôle suivant) ?
auteurs : Bidou, FRED.G
SendKeys "{TAB}"
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.


Comment faire pour trier les enregistrements d'une table aléatoirement ?
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 : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Arrondir un nombre sous Access 97
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 

 '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  
lien : Replace n'existe pas sous Access 97, comment faire ?

Utiliser copier/coller en VBA
auteur : Tofalu
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 

Comment mettre du texte en majuscule / minuscule ?
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

Comment gérer la mise en forme les données d'un champ ou d'un contrôle ?
auteur : FRED.G
Dans Access, les moyens "classiques" de mise en forme des données d'un champ ou d'un contrôles sont les suivants :

  • Propriété Format : elle permet de contrôler la façon dont les données sont affichées, en y ajoutant des espaces ou n'importe quel caractère littéral où vous voulez.
    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 combinaisons 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és 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, Masque de saisie et voir de nombreux exemples.


Différence entre le format d'affichage des données et les données réelles enregistrées
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.


Comment convertir un nombre décimal en binaire ?
auteur : fdraven

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)

Obtenir la partie décimale d'un nombre
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.


Utilisations des fonctions Mathématiques d'Excel dans Access
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.


Comment modifier un très grand nombre de données avec DAO ?
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 : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Comment connaître le nombre d'enregistrements qui seront modifiés par une requête Action ?
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 : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Comment synchroniser la barre de progression avec le parcours d'un recordset ?
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 
'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 : fr Définition et manipulation de données avec DAO par Tofalu
lien : faq Comment déclarer une référence dans MS-Access ?

Comment Arrondir un nombre à sa valeur supérieure ou inférieure
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

Comment faire un remplacement en chaine ?
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("",""))

Comment Copier/Coller les données d'un enregistrement dans un Formulaire ?
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 :
  1. Ouvrez en mode création le formulaire dans lequel vous aurez besoin de copier et coller des données.
  2. Créez deux boutons. Appelez ( par exemple ) le premier « Copier » et le second « Coller ».
  3. 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 !


Comment réaliser un copier vers le presse papier et coller depuis un contrôle ?
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
'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)
 'NB : ActiveControl.Text pour capter ce qui est affiché à l'écran
 'Copier dans le presse-papier
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
Public Function CollerPressePapier()
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)
 'NB : 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 : src Copier le contenu d'un contrôle vers le presse papier Windows

precedent    sommaire    suivant   

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.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com