Lettre Novembre 2004

 
N'oubliez pas

Besoin d'une assistance, d'une application
MS Office

Consultez GEMCCAP

Ecrivez-moi

Le lien du mois

Bonjour,
Après plusieurs mois d'absences, me voila de retour. Depuis l'Essonne, mon nouveau département et la Beauce, ma nouvelle région j'essaierais de poursuivre cette lettre d'astuces. Même s'il me manque le soleil (et la pluie) du Tarn (le pays que j'ai adopté et qui a adopté toute ma famille) je tâcherais de vous l'apporter dans ces lettres chaque mois.
Merci à tous ceux qui m'ont envoyé un petit mot d'encouragement et à qui je n'ai pu répondre par manque de temps et parfois de connexion à Internet

 Access

Limiter le nombre d'enregistrements à un seul

Il est parfois utile de créer une table contenant des informations de configuration, il n'y aura alors qu'1 seul enregistrement. Cet enregistrement débutera par une rubrique de type AutoNumérique dénommée IDparam (par exemple).
Sur la propriété Valide Si de ce champ : <2

 Excel

La fonction RECHERCHEV

Cette fonction permet de rechercher une valeur dans une liste de donnée. Cette recherche est effectuée dans la colonne de gauche de la liste, lorsqu'elle est trouvée, Excel se déplace vers la droite sur la même ligne et lit la valeur dans la colonne indiquée.
Les paramètres dont elle a besoin sont donc :

  • valeur_cherchée : la valeur recherchée
  • table_matrice : la plage dans laquelle la valeur est recherchée
  • no_index_col : l'index de la colonne renvoyant la donnée
  • valeur_proche: VRAI pour rechercher la valeur la plus proche dans la 1ère colonne de la plage et FAUX pour rechercher la valeur exacte.

Pour fonctionner correctement la fonction a besoin d'une certaine structure :

  • La colonne dans laquelle doit se faire la recherche doit être la 1ère colonne de la plage.
  • la plage doit contenir la colonne renvoyant la donnée.
  • la 1ère colonne de la plage a l'index 1.

Par exemple dans une liste contenant les champs Date, Produit, Prix unitaire, Taux TVA, Nombre, respectivement dans les colonnes A, B, C, D, E et la ligne 1, les données s'étendant jusqu'à la ligne 100. Pour rechercher :

  • le prix unitaire à partir du Produit, table_matrice doit être au moins B1:C100 et no_index_col est 2.
  • le nombre à partir de la date, table_matrice doit être au moins A1:E100 et no_index_col est 6.

Les fonctions INDEX et EQUIV

La fonction précédente comme vous le constatez à ces limites : la colonne de recherche doit se trouver à gauche de la colonne de résultat. Pour palier à ceci vous pouvez utilisez conjointement 2 fonctions :

  • EQUIV, qui va vous donner l'emplacement d'une valeur dans une colonne ou une ligne,
  • INDEX, qui renvoie une donnée d'une liste (en ligne ou colonne) à partir de sa position dans la liste.

Reprenons l'exemple précédent :

Date Produit Prix unitaire Taux TVA Nombre
01/10/2004
aa 10,50 5,5% 10
02/10/2004
zz 2,50 5,5% 125
05/11/2004
bb 3,00 19,6% 23
03/10/2004
dd 50,25 19,6% 5

Si vous voulez savoir quel est le produit vendu à 3,00 € (attention cela ne me donnera que le 1er produit à ce prix s'il y en a plusieurs tout comme RECHERCHEV), procédez ainsi :

  • Dans une cellule, par exemple F1, tapez 3 (c'est à dire la valeur à rechercher)
  • Dans une autre cellule, par exemple G1, tapez la formule suivante en considérant que le tableau ci-dessus se trouve en A1:E5 :
    =EQUIV(F1;C1:C5;0)
    F1 est la valeur que vous recherchez
    C2:C5 est le tableau dans lequel vous recherchez la valeur, ici je n'inclue pas les titres
    0 doit être mis pour rechercher une valeur exacte (pour les autres valeurs voir l'aide)
  • Cette formule vous renverra 3 car la valeur 3 se trouve en 3ème position dans la plage C2:C5
  • Dans une cellule, par exemple H1, tapez la formule suivante :
    =INDEX(B2:B5;G1)
    B2:B5 est le tableau dans lequel je veux lire le résultat (tout comme pour la recherche je n'inclue pas les titres). Ce tableau doit avoir la même dimension que celui dans lequel on a effectué la recherche.
    G1 représente la position où je dois lire la donnée dans ce tableau, ici la 3ème position. Ce qui vous donne bien bb

Vous pouvez combiner ces 2 fonctions en utilisant la formule suivante :
=INDEX(B2:B5;EQUIV(F1;C1:C5;0))

 VBA

Un formulaire avec photo

Soit une liste de données dans Excel, celle-ci comprenant un champ (colonne) contenant l'adresse d'une photo sur votre disque PC (exemple : liste des produits avec code (A1), intitulé (B1), photo (C1), Nb en stock (D1) sur la feuille BD). Vous pouvez dans une autre feuille établir un formulaire qui affiche les données du produit lorsque vous indiquer un code. Je rappelle que dans la liste de données le champ Photo doit contenir l'adresse (chemin) de la photo et non la photo elle-même.
Votre formulaire pourrait alors ressembler à ceci :

A
B
C
1
Code AFG  
2
    Photo
3
Intitulé =RECHERCHEV(B1;BD!A:D;2;VRAI) =RECHERCHEV(B1;BD!A:D;3;VRAI)
4
     
5
Nb en stock =RECHERCHEV(B1;BD!A:D;4;VRAI)  
6
     

Ensuite ajouter un bouton sur cette feuille depuis la barre d'outils Formulaires, affectez-lui la procédure suivante et renommez le MAJ

Sub InsertPhoto()
      Dim strChem As String, strPhoto As String

     
'si une image a déjà été ajoutée alors on la supprime
      If ActiveSheet.OLEObjects.Count > 0 Then
            ActiveSheet.OLEObjects(1).Delete
      End If
     
' la cellule "C3" doit contenir le nom du fichier image
      strPhoto = Range("C3")
      Range("C3").Select
'permet à l'insertion de l'image de se mettre dans la cellule (coin supérieur gauche)
     
'insère l'image avec liaison
      ActiveSheet.OLEObjects.Add Filename:=strPhoto, Link:=True, DisplayAsIcon:=False
End Sub

Sauvegarder une base de données Access dans la base elle-même

Private Type SHFILEOPSTRUCT
      hwnd As Long
      wFunc As Long
      pFrom As String
      pTo As String
      fFlags As Integer
      fAnyOperationsAborted As Boolean
      hNameMappings As Long
      lpszProgressTitle As String
End Type

Private Const FO_MOVE As Long = &H1 'deplacement
Private Const FO_COPY As Long = &H2 'copie
Private Const FO_DELETE As Long = &H3 'suppression
Private Const FO_RENAME As Long = &H4 'renommer

Private Const FOF_MULTIDESTFILES As Long = &H1
Private Const FOF_CONFIRMMOUSE As Long = &H2
Private Const FOF_SILENT As Long = &H4
Private Const FOF_RENAMEONCOLLISION As Long = &H8 'renomme en cas de collision
Private Const FOF_NOCONFIRMATION As Long = &H10 'sans confirmation
Private Const FOF_WANTMAPPINGHANDLE As Long = &H20
Private Const FOF_CREATEPROGRESSDLG As Long = &H0
Private Const FOF_ALLOWUNDO As Long = &H40
Private Const FOF_FILESONLY As Long = &H80
Private Const FOF_SIMPLEPROGRESS As Long = &H100
Private Const FOF_NOCONFIRMMKDIR As Long = &H200

Private Declare Function apiSHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

Function fMakeBackup(strSaveChem As String, strDonnees As String) As Boolean
      Dim strMsg As String
      Dim tshFileOp As SHFILEOPSTRUCT
      Dim lngRet As Long
      Dim lngFlags As Long
      Const cERR_USER_CANCEL = vbObjectError + 1
      Const cERR_DB_EXCLUSIVE = vbObjectError + 2

On Local Error GoTo fMakeBackup_Err

If fDBExclusive = True Then Err.Raise cERR_DB_EXCLUSIVE

      strMsg = "Confirmation de sauvegarde de la base de données?"
      If MsgBox(strMsg, vbQuestion + vbYesNo, "SAUVEGARDE") = vbNo Then Err.Raise cERR_USER_CANCEL

      lngFlags = FOF_SIMPLEPROGRESS Or FOF_FILESONLY Or FOF_NOCONFIRMATION 'Or FOF_RENAMEONCOLLISION
      strSaveChem = "C:\sauvegarde" 'remplacer ici par l'adresse de votre dossier de sauvegarde
      'sauvegarde
      With tshFileOp
            .wFunc = FO_COPY 'on fait une copie
            .hwnd = hWndAccessApp
            .pFrom = CurrentDb.Name & vbNullChar 'depuis le fichier actuel
            .pTo = strSaveChem & CurrentProject.Name & vbNullChar 'vers le dossier de sauvegarde en gardant le même nom de fichier
            .fFlags = lngFlags
      End With
      lngRet = apiSHFileOperation(tshFileOp)
      fMakeBackup = (lngRet = 0) 'permet de renvoyer vrai si l'opération de sauvegarde s'est bien effectuée
      End If
      Exit Function
'gestion des erreurs
fMakeBackup_Err:
      fMakeBackup = False
      Select Case Err.Number
            Case cERR_USER_CANCEL 'abandon par l'utilisateur
                  'on ne fait rien
            Case cERR_DB_EXCLUSIVE
                  MsgBox "La base de données " & vbCrLf & CurrentDb.Name & vbCrLf & vbCrLf & "est ouverte en exclusif. Merci de la réouvrir en mode normal" & " puis de réessayer.", vbCritical + vbOKOnly, "SAUVEGARDE ABANDONNÉE"
            Case Else
                  strMsg = "Information d'Erreur ..." & vbCrLf & vbCrLf
                  strMsg = strMsg & "FOnction: fMakeBackup" & vbCrLf
                  strMsg = strMsg & "Description: " & Err.Description & vbCrLf
                  strMsg = strMsg & "Erreur #: " & Format$(Err.Number) & vbCrLf
                  MsgBox strMsg, vbInformation, "SAUVEGARDE ABANDONNÉE"
      End Select
 End Function

le numéro de la semaine selon la norme Européenne

Public Function NoSem(UneDate As Date) As Integer
' donne le numéro de la semaine selon la norme Européenne (1ère semaine = 1ère semaine de 4 jours)
On Error Resume Next
      NoSem = CInt(Format(UneDate, "ww", vbMonday, vbFirstFourDays))
End Function

 Word

Un formulaire avec des sections libres

Lorsque vous établissez un formulaire dans Word, vous ajoutez des contrôles zones de texte, liste, case à cocher, ... afin de permettre à l'utilisation d'entrer des données uniquement sur ces contrôles.
Une zone de texte permet d'entrer un texte illimité mais ne permet pas de modifier la mise en forme de cette zone lorsque le document est protégé comme un formulaire. Pour pallier à ceci, vous pouvez ne pas protéger une partie de votre document, dans cette dernière l'utilisateur pourra faire ce qu'il veut comme si le document n'était pas protégé (pratique par exemple pour un modèle de lettre ou de rapport avec des données fixes à ne pas modifier). Dans ce cas procédez ainsi :

  • Placez vous en début de zone à laisser libre
  • Insertion/saut/de section continue
  • Insérez au moins un paragraphe vide (Appuyez sur Entrée)
  • Insertion/saut/de section continue

Puis lorsque vous protégez votre document :

  • Outils/Protéger le document
  • Sélectionnez Formulaires
  • Cliquez sur le bouton Sections (s'il est grisé, c'est que vous avez oublié de faire les étapes indiquées ci-dessus)
  • Décochez la section correspondant à celle devant rester libre (dans notre cas, la section 2)
  • Ok
  • Ok

 Outlook

Utiliser les couleurs pour l'organisation de son emploi du temps (à partir version XP)

Depuis la version XP (2002), on peut colorer nos différents RDV ou évènements. Pour cela :

  • Sélectionnez votre RDV
  • clic-droit
  • Sélectionnez Catégorie du calendrier
  • Choisissez votre couleur

Vous pouvez renseigner directement cette couleur lorsque vous créez votre RDV en renseignant Catégorie du calendrier.

Les différentes catégories proposées ne vous correspondent peut-être pas. Pour les adapter :

  • Sélectionnez un RDV
  • clic-droit
  • Sélectionnez Catégorie du calendrier
  • Modifier les catégories...

Vous ne pouvez modifier les couleurs mais changer l'intitulé des catégories (c'est déjà cela).

AccueilDébut de la page