1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338
| '//----#----#----#---Module header sample-#----#----#----#----#----#----#--\\
'//
'// NOTE Le code est défini pour ACCESS 2000, si vous avez ACCESS 97
'// ==== mettre les lignes avec le commentaire #ACC2K# en commentaire
'// et décommentez les lignes avec le commentaire #ACC97#
'//
'// La valeur des contrôles est stockée dans un champ Variant, ce n'est
'// pas le type de variable le plus performant. Mais dans ce cas de
'// figure il permet de s'adapter à tout type de données.
'// Ces routines peuvent être utilisées quel que soit la méthode
'// de gestion des données utilisée (DAO ou ADO). D'où la méthode un peu
'// brusque de 'vérification' des champs en N°Auto. Si je devais faire
'// plus proprement cette vérification, cela obligerait à utiliser soit
'// ADO, soit DAO. C'est justement ce que je voulais éviter.
'//
'// Le principal intérêt de ces fonctions, est de pouvoir être utilisées
'// avec n'importe quel formulaire, quel que soit sa 'composition'.
'// Bon je n'ai pas testé toutes les possibilités existantes :o)
'// faites moi part des problèmes éventuels.
'// De plus lors du 'collage' des données seuls les champs ne contenant
'// pas de valeur sont modifiés, ce qui permet par exemple à l'utilisateur
'// de saisir les valeurs qui ne sont pas identiques à l'enregistrement
'// de copier, puis de faire le 'collage'. Le collage peut-être effectué
'// à n'importe quel moment et pas forcement sur l'enregistrement qui
'// suit immédiatement l'enregistrement copié.
'//
'// Commentaires, bugs ou autres : moilneu@hotmail.com , merci.
'//
'//============================
'// UTILISATION DES ROUTINES :
'//
'// gsu_CopieEnrg
'// -------------
'// Sur un bouton de commande, un événement, ou toute autre
'// posibilité de votre choix. Exemple avec un bouton de commande :
'//
'// Private Sub cmdCopie_Click()
'// gsu_EmptyAll() ' vide tous les presse-papiers
'// gsu_CopieEnrg Me, 1 ' copie dans presse-papier 1
'// End Sub
'//
'// Exemple de copie des champs d'un sous formulaire :
'//
'// Private Sub cmdCopie_Click()
'// gsu_CopieEnrg Me!SF.Form, 2 ' copie dans presse-papier 2
'// End Sub
'//
'// gsu_ColleEnrg
'// -------------
'// Sur un bouton de commande, un événement,... Vérifiez quand
'// même que vous êtes bien sur un nouvel enregistrement, à
'// moins que vous vouliez écraser les données en cours :
'//
'// Private Sub cmdColle_Click()
'// If (Me.NewRecord = FALSE) Then Exit Sub
'// gsu_ColleEnrg Me, 1 ' colle depuis presse-papier 1
'// End Sub
'//
'// Exemple du collage dans un SF en mode feuille de données :
'//
'// Private Sub cmdColle_Click()
'// Me!SF.SetFocus
'// DoCmd.GoToRecord , , acNewRec
'// gsu_ColleEnrg Me!SF.Form, 2 ' colle depuis presse-papier 2
'// End Sub
'//
'//============================
'//----#----#----#----#----#----#----#----#----#----#----#----#----#----#--\\
'//----()---()---()- DECLARATION DES VARIABLES -()---()---()---()---()---()-\\
'//
Private Const ERR_MODULE As String = "MD_UTILE"
Private Type UnChamp '// Déclaration du type..
Nom As String
Valeur As Variant
End Type
Type UnEnrg
UnChampCopie() As UnChamp ' Tableau de UnChamp(s)
End Type
Private marCopie() As UnEnrg '// Tableau (stocke le type CopieEnrg).
Private mflgCopie As Byte '// Indique une copie en cours(1=oui).
Public Sub gsu_EmptyAll()
ReDim marCopie(0) '// #ACC2K#
End Sub
Public Sub gsu_CopieEnrg(frm As Form, NumCopie As Integer)
'//----o----o----o---Procedure header sample---o----o----o----o----o----o--\\
'//
'// Procedure gsu_CopieEnrg
'// Par : Laurent Moilneu
'// Date : 05/06/2001 13:04:39
'// Modif :
'//
'// Objet : Faire une copie des valeurs des contrôles d'un formulaire.
'// Cela quel que soit le formulaire, le nombre de contrôles et
'// leur type. Cette routine sauvegarde dans un tableau le
'// nom et la valeur des contrôles.
'//
'// ENTRE <-
'// frm : Formulaire à utiliser.
'//
'// -----------------------
'// -----------------------
'// NOTES :
'//
'// - mflgCopie : indique qu'une copie a bien été effectuée.
'// - La copie est conservée jusqu'à la copie suivante.
'// - La copie précédente est détruite.
'//
'//----o----o----o----o----o----o----o----o----o----o----o----o----o----o--\\
On Error GoTo ERR_Copie
Const ERR_ROUTINE As String = "gsu_CopieEnrg"
Dim ctr As Control '// Pour la boucle For Each.
Dim iInd As Integer '// Index du tableau.
mflgCopie = 0
'// Efface le contenu du tableau.
ReDim Preserve marCopie(NumCopie) '// #ACC2K#
ReDim Preserve marCopie(NumCopie).UnChampCopie(0)
' ReDim marCopie(1, 0) '// #ACC97#
'// Parcourir les contrôles du formulaire en cours.
With frm
For Each ctr In .Controls
'// Vérifier la validité du contrôle.
If fn_VerifControl(ctr) Then '|--->
'// Sauvegarde du contenu du contrôle.
ReDim Preserve marCopie(NumCopie).UnChampCopie(iInd) '// #ACC2K#
marCopie(NumCopie).UnChampCopie(iInd).Nom = ctr.Name '// #ACC2K#
marCopie(NumCopie).UnChampCopie(iInd).Valeur = Nz(ctr.Value) '// #ACC2K#
' ReDim Preserve marCopie(1, iInd) '// #ACC97#
' marCopie(0, iInd) = ctr.Name '// #ACC97#
' marCopie(1, iInd) = Nz(ctr.Value) '// #ACC97#
iInd = iInd + 1
End If
Next ctr
End With
'// Indique que le tableau contient une copie.
mflgCopie = 1
Set ctr = Nothing
SORTIE_Copie:
Exit Sub
ERR_Copie:
Dim sMsg As String
sMsg = "Un problème est survenu lors de la copie :" & vbCrLf & _
"Erreur : " & Err.Number & vbCrLf & Err.Description
MsgBox sMsg, vbCritical, ERR_MODULE & "-" & ERR_ROUTINE
Resume SORTIE_Copie
End Sub
Public Sub gsu_ColleEnrg(frm As Form, NumCopie As Integer)
'//----o----o----o---Procedure header sample---o----o----o----o----o----o--\\
'//
'// Procedure gsu_ColleEnrg
'// Par : moilneu
'// Date : 05/06/2001 13:04:39
'//
'// Objet : Même chose que pour la fonction su_CopieEnrg, mais
'// dans le sens inverse bien sûr :o)
'//
'// ENTRE <-
'// frm : Formulaire à utiliser.
'//
'// -----------------------
'// -----------------------
'// NOTES :
'//
'// - Ne vérifie PAS si l'on est sur un nouvel enregistrement, cela
'// doit être fait dans le code avant l'appel de cette fonction.
'// - Vérifie qu'une copie existe dans le tableau (mflgCopie à 1).
'// - Ignore les champs vides.
'// - Ignore les TexteBox contenant déjà une valeur.
'// - Les champs N°Auto sont ignorés (gestion des erreurs).
'//
'// - IMPORTANT le 'collage' dans un contrôle ne déclenche pas
'// d'événement, donc si vous avez un événement quelconque lors
'// de la modification du contrôle, n'utilisez pas cette fonction
'// ou prévoyez le code approprié pour gérer celui-ci.
'//
'//----o----o----o----o----o----o----o----o----o----o----o----o----o----o--\\
On Error GoTo ERR_Colle
Const ERR_ROUTINE As String = "gsu_CopieEnrg"
If (mflgCopie = 0) Then Exit Sub '// pas de copie en cours, sortir.
Const ERR_ATIMP As Long = 2448 '// Attribution de valeur impossible.
Dim iCpt As Integer '// Compteur de la boucle.
Dim iNbCtr As Integer '// Nombre d'éléments du tableau.
Dim sNom As String '// Nom du champs en cours.
iNbCtr = UBound(marCopie(NumCopie).UnChampCopie()) '// #ACC2K#
' iNbCtr = UBound(marCopie, 2) '// #ACC97#
'// Colle la sauvegarde.
For iCpt = 0 To iNbCtr
'// Passe les valeurs non définies.
If (marCopie(NumCopie).UnChampCopie(iCpt).Valeur <> "") Then '// #ACC2K#
sNom = marCopie(NumCopie).UnChampCopie(iCpt).Nom '// #ACC2K#
' If (marCopie(1, iCpt) <> "") Then '// #ACC97#
' sNom = marCopie(0, iCpt) '// #ACC97#
'// Passe les contrôles texte contenant déjà une valeur.
With frm(sNom)
If (.ControlType = acTextBox) And (.Value <> "") Then
Else
.Value = marCopie(NumCopie).UnChampCopie(iCpt).Valeur '// #ACC2K#
' .Value = marCopie(1, iCpt) '// #ACC97#
End If
End With
End If
Next iCpt
SORTIE_Colle:
Exit Sub
ERR_Colle:
'// Champs en N° auto, passer au suivant.(Voir note dans la déclartion)
If Err.Number = ERR_ATIMP Then
Resume Next
End If
Dim sMsg As String
sMsg = "Un problème est survenu lors du 'collage' :" & vbCrLf & _
"Erreur : " & Err.Number & vbCrLf & Err.Description
MsgBox sMsg, vbCritical, ERR_MODULE & "-" & ERR_ROUTINE
Resume SORTIE_Colle
End Sub
Private Function fn_VerifControl(ctr As Control) As Boolean
'//----o----o----o---Procedure header sample---o----o----o----o----o----o--\\
'//
'// Procedure fn_RechTableau
'// Par : Laurent Moilneu
'// Date : 05/06/2001 13:04:39
'// Modif :
'//
'// Objet : Accorder la copie de la valeur du contrôle, si celui-ci
'// fait partie des types de contrôles autorisés, s'il est
'// actif, visible et non verrouillé.
'// On peut rajouter des conditions : vérifier si la propriété
'// 'Tag' du contrôle, contient une certaine valeur, et accepter
'// ou non le collage.
'//
'// ENTRE <-
'// ctr : Contrôle à vérifier.
'//
'// SORT ->
'// TRUE si le contrôle correspond aux types autorisés,
'// s'il est actif et visible.
'//
'// -----------------------------------
'// -----------------------------------
'// Types de contrôles (ils n'y sont peut-être pas tous) :
'//
'// 100 acLabel Étiquette
'// 101 acRectangle Rectangle
'// 102 acLine Trait
'// 103 acImage Image
'// 104 acCommandButton Bouton de commande
'// 105 acOptionButton Bouton d'options
'// 106 acCheckBox Case à cocher
'// 107 acOptionGroup Groupe d'options
'// 108 acBoundObjectFrame Cadre d'objet dépendant
'// 109 acTextBox Zone de texte
'// 110 acListBox Zone de liste
'// 111 acComboBox Zone de liste modifiable
'// 112 acSubform Sous formulaire / Sous état
'// 114 acObjectFrame Cadre d'objet indépendant ou graphique
'// 118 acPageBreak Saut de page
'// 119 acCustomControl Contrôle ActiveX (personnalisé)
'// 122 acToggleButton Bouton bascule
'// 123 acTabCtl Onglet
'// 124 acPage Page
'//
'//----o----o----o----o----o----o----o----o----o----o----o----o----o----o--\\
'// Voir si le type du contrôle convient.
'// NOTE : Pour ignorer un type de contôle, mettre sa ligne :
'// Case (TypeDeControle) en commentaire.
Select Case ctr.ControlType
Case acOptionButton, acCheckBox, acToggleButton
Dim iTMP As Integer
'// Vérifie que la case à cocher/option ou le bouton bascule
'// ne fait pas partie d'un groupe d'options.
On Error Resume Next
iTMP = ctr.Value
If Err <> 0 Then
Err.Clear
Exit Function
End If
Case acOptionGroup
Case acTextBox
Case acListBox, acComboBox
Case acTabCtl
Case Else
Exit Function
End Select
'// Si le type convient, accepte que les contrôles
'// actifs(Enabled), visibles et non vérouillés(Locked).
If (ctr.Enabled And ctr.Visible And (Not (ctr.Locked))) Then
'// Renvoie la valeur
fn_VerifControl = True
End If
End Function
Sub debugPPs()
Dim pp As Integer, intfnum As Integer
For pp = 1 To UBound(marCopie())
Debug.Print "presse papier " & pp
Debug.Print "---------------------------"
For intfnum = 0 To UBound(marCopie(pp).UnChampCopie())
Debug.Print marCopie(pp).UnChampCopie(intfnum).Nom; " "; marCopie(pp).UnChampCopie(intfnum).Valeur
Next
Debug.Print
Next
End Sub |
Partager