Accueil Fonctions Calc Menu Basic EDI OOo 1.x EDI OOo 2.x EDI LibO - OOo 3.x Affectation touche Affectation icône Etape par étape Macro débutant Fonctions Basic Dialogues OOo1-2 Dialogues LibO-OOo3 Quelques exemples Exemples dialogue Fonctions perso Définitions Recherche sur site


FONCTIONS BASIC. Quelques exemples

Cette page est faite pour les débutants. Je suggère néanmoins au vrai débutant de se faire la main avec la macro Loto. Tous les exemples présentés ne sont qu'une évolution progressive d'une même macro. Le nombre de mots-clés augmente progressivement. Exceptées les lignes de déclarations API indispensables, je vous suggère d'essayer de comprendre le but de ces listings. Enfin, sachez que pour obtenir un résultat identique, il existe de nombreuses solutions.

Vous pouvez si vous le désirez copiez comme ci-dessous. Les exercices sont numérotés. Vous pourrez donc les inscrire les uns à la suite des autres. Pour les lancer, modifiez la ligne 4.

IMPORTANT : Les listings complets présentés ici ont des numéros de ligne, par ex : 12. Dans la pratique ces numéros n'existent pas mais aident pour les explications.

  1. REM ***** BASIC *****
  2. '
  3. Sub Main
  4.    Exemple01
  5. End Sub
  6. '
  7. '
  8. Sub Exemple01
  9.    REM Déclarations API indispensables
  10.    Dim oDocument As Object, oSheet As Object, oCell As Object
  11.    oDocument = ThisComponent
  12.    oSheet=oDocument.Sheets.getByName ("Feuille1" )
  13.    '
  14.    oCell = oSheet.getCellByPosition (0,0 )
  15.    oCell.setString( "DUPONT")
  16.    oCell = oSheet.getCellByPosition (0,1 )
  17.    oCell.setString( "DURAND")
  18. End Sub

Ce premier exemple, volontairement simple, on écrit les noms de DUPONT et DURAND dans 2 cellules à la suite. Les lignes 14 et 16 servent à sélectionner les cellules avec getCellByPosition(Colonne, Ligne) et les lignes 15 et 17 à écrire les textes avec setString.




  1. Sub Exemple02
  2.    REM Déclarations API indispensables
  3.    Dim oDocument As Object, oSheet As Object, oCell As Object
  4.    oDocument = ThisComponent
  5.    oSheet=oDocument.Sheets.getByName ("Feuille1" )
  6.    '
  7.    Dim Nom (10 ) As String ' Tableau de 10 noms maximum
  8.    '
  9.    Nom( 1)= "DUPONT"
  10.    Nom( 2)= "DURAND"
  11.    '
  12.    oCell = oSheet.getCellByPosition (0,0 )
  13.    oCell.setString (Nom (1 ))
  14.    oCell = oSheet.getCellByPosition (0,1 )
  15.    oCell.setString (Nom (2 ))
  16. End Sub

Avec l'exemple 02, le résultat est identique au précédent, mais les données sont déclarées dans un tableau Dim et les noms sont écrits dans les variables Nom() de type String. Notez le changement d'écriture des lignes 13 et 15.




  1. Sub Exemple03
  2.    REM Déclarations API indispensables
  3.    Dim oDocument As Object, oSheet As Object, oCell As Object
  4.    oDocument = ThisComponent
  5.    oSheet=oDocument.Sheets.getByName ("Feuille1" )
  6.    '
  7.    Dim Nom (10 ) As String ' Tableau de 10 noms maximum
  8.    Dim i As Integer
  9.    '
  10.    Nom( 1)= "DUPONT"
  11.    Nom( 2)= "DURAND"
  12.    '
  13.    ' Ecriture avec une boucle For.. To.. Next
  14.    For i = 1 To 10
  15.       oCell = oSheet.getCellByPosition (0, i - 1)
  16.       oCell.setString (Nom (i ))
  17.    Next i
  18. End Sub

Avec l'exemple 03, le résultat est identique au précédent, mais on commence à simplifier l'écriture des données. S'il y avait plusieurs centaines de noms, le travail serait difficile. Avec une boucle For.. Next (lignes 14 et 17), il suffit de 2 lignes insérées. Notez à nouveau les changements dans les lignes 15 et 16, les valeurs sont remplacées par la variable i de type Integer.




  1. Sub Exemple04
  2.    REM Déclarations API indispensables
  3.    Dim oDocument As Object, oSheet As Object, oCell As Object
  4.    oDocument = ThisComponent
  5.    oSheet=oDocument.Sheets.getByName ("Feuille1" )
  6.    '
  7.    Dim NmbDonnees As Integer
  8.    NmbDonnees = 10
  9.    Dim Nom (10 ) As String, Prenom (10 ) As String
  10.    Dim DateNaissance (NmbDonnees ) As Date
  11.    Dim i As Integer
  12.    '
  13.    Nom( 1)= "DUPONT"
  14.    Nom( 2)= "DURAND"
  15.    Nom( 3)= "LERADIN"
  16.    Nom( 4)= "LERICHE"
  17.    Nom( 5)= "LEPAUVRE"
  18.    Prenom( 1) = "Antoine"
  19.    Prenom( 2) = "Marie"
  20.    Prenom( 3) = "Pierre"
  21.    Prenom( 4) = "Paul"
  22.    Prenom( 5) = "Henri"
  23.    DateNaissance( 1) = "07/09/1990"
  24.    DateNaissance (2) = "12/03/1945"
  25.    DateNaissance (3) = "17/11/1983"
  26.    DateNaissance (4) = "03/08/1979"
  27.    DateNaissance (5) = "29/02/2000"
  28.    '
  29.    '
  30.    ' Ecriture des données
  31.    For i = 1 To 10
  32.       oCell = oSheet.getCellByPosition (0, i - 1)
  33.       oCell.setString (Nom( i))
  34.       oCell = oSheet.getCellByPosition (1, i - 1)
  35.       oCell.setString (Prenom (i ))
  36.       oCell = oSheet.getCellByPosition (2, i - 1 )
  37.       oCell.setString ( DateNaissance(i ))
  38.    Next i
  39. End Sub

Peu d'évolution, mais on rajoute les prénoms et dates de naissances. Notez la déclaration des dates de naissances ligne 10 au format date. Au résultat, 2 choses anormales. Vous avez bien entendu vu l'affichage 00:00:00 en absence de date. Autre erreur plus difficile à détecter. Les dates sont affichées à gauche. Pourquoi ? Elles sont interprétées comme étant des textes.




  1. Sub Exemple05
  2.    REM Déclarations API indispensables
  3.    Dim oDocument As Object, oSheet As Object, oCell As Object
  4.    oDocument = ThisComponent
  5.    oSheet=oDocument.Sheets.getByName ("Feuille1" )
  6.    '
  7.    Dim NmbDonnees As Integer
  8.    NmbDonnees = 10
  9.    Dim Nom (10 ) As String, Prenom (10 ) As String
  10.    Dim DateNaissance (NmbDonnees ) As Date
  11.    Dim i As Integer
  12.    '
  13.    Nom( 1)= "DUPONT"
  14.    Nom( 2)= "DURAND"
  15.    Nom( 3)= "LERADIN"
  16.    Nom( 4)= "LERICHE"
  17.    Nom( 5)= "LEPAUVRE"
  18.    Prenom( 1) = "Antoine"
  19.    Prenom( 2) = "Marie"
  20.    Prenom( 3) = "Pierre"
  21.    Prenom( 4) = "Paul"
  22.    Prenom( 5) = "Henri"
  23.    DateNaissance( 1) = "07/09/1990"
  24.    DateNaissance (2) = "12/03/1945"
  25.    DateNaissance (3) = "17/11/1983"
  26.    DateNaissance (4) = "03/08/1979"
  27.    DateNaissance (5) = "29/02/2000"
  28.    '
  29.    ' Ecriture des données
  30.    For i = 1 To 10
  31.       oCell = oSheet.getCellByPosition (0, i - 1 )
  32.       oCell.setString (Nom (i ))
  33.       oCell = oSheet.getCellByPosition (1, i - 1 )
  34.       oCell.setString (Prenom (i ))
  35.       If Nom( i) ‹› "" Then
  36.           oCell = oSheet.getCellByPosition( 2, i - 1)
  37.           oCell.setValue(DateNaissance( i))
  38.       Endif
  39.    Next i
  40. End Sub

Pour éviter l'affichage des dates de naissances inexistantes, on considère que s'il n'y a pas de nom, il n'y a pas de date. Donc, si la variable Nom() est non vide (‹›"") en ligne 35, dans ce cas uniquement on écrit la date de naissance. De plus en ligne 37 on utilise setValue et non plus SetString. On affiche une valeur (la date est une valeur) et non plus une chaîne de caractères. En revanche les dates sont affichées sous forme de nombre qu'il faudra formater au format date.




  1. Sub Exemple06
  2.    REM Déclarations API indispensables
  3.    Dim oDocument As Object, oSheet As Object, oCell As Object
  4.    oDocument = ThisComponent
  5.    oSheet=oDocument.Sheets.getByName ("Feuille1" )
  6.    '
  7.    Dim NmbDonnees As Integer
  8.    NmbDonnees = 10
  9.    Dim Nom (10 ) As String, Prenom (10 ) As String
  10.    Dim DateNaissance (NmbDonnees ) As Date
  11.    Dim Ville( NmbDonnees) As String, CodePostal( NmbDonnees) As Long
  12.    Dim i As Integer
  13.    '
  14.    Nom( 1)= "DUPONT"
  15.    Nom( 2)= "DURAND"
  16.    Nom( 3)= "LERADIN"
  17.    Nom( 4)= "LERICHE"
  18.    Nom( 5)= "LEPAUVRE"
  19.    Prenom( 1) = "Antoine"
  20.    Prenom( 2) = "Marie"
  21.    Prenom( 3) = "Pierre"
  22.    Prenom( 4) = "Paul"
  23.    Prenom( 5) = "Henri"
  24.    DateNaissance( 1) = "07/09/1990"
  25.    DateNaissance (2) = "12/03/1945"
  26.    DateNaissance (3) = "17/11/1983"
  27.    DateNaissance (4) = "03/08/1979"
  28.    DateNaissance (5) = "29/02/2000"
  29.    Ville( 1) = "75000 Paris"
  30.    Ville( 2) = " 33000 Bordeaux "
  31.    Ville( 3) = "17000 la rochelle"
  32.    Ville( 4) = "69000 LYON"
  33.    Ville( 5) = "75000 paris"
  34.    '
  35.    ' Ecriture des données
  36.    For i = 1 To 10
  37.       oCell = oSheet.getCellByPosition (0, i - 1 )
  38.       oCell.setString (Nom (i ))
  39.       oCell = oSheet.getCellByPosition (1, i - 1 )
  40.       oCell.setString (Prenom (i ))
  41.       If Nom( i) ‹› "" Then
  42.           oCell = oSheet.getCellByPosition( 2, i - 1)
  43.           oCell.setValue(DateNaissance( i))
  44.       Endif
  45.       oCell = oSheet.getCellByPosition (3, i - 1 )
  46.       oCell.setString (Ville (i ))
  47.    Next i
  48. End Sub

Principale évolution, on ajoute les noms de villes et les codes postaux. Problème, ils sont dans une seule colonne qu'il faudra séparer (dans l'exemple suivant). Notez les déclarations ligne 11, de type Long pour le Code Postal.




  1. Sub Exemple07
  2.    REM Déclarations API indispensables
  3.    Dim oDocument As Object, oSheet As Object, oCell As Object
  4.    oDocument = ThisComponent
  5.    oSheet=oDocument.Sheets.getByName ("Feuille1" )
  6.    '
  7.    Dim NmbDonnees As Integer
  8.    NmbDonnees = 10
  9.    Dim Nom (10 ) As String, Prenom (10 ) As String
  10.    Dim DateNaissance (NmbDonnees ) As Date
  11.    Dim Ville( NmbDonnees) As String, CodePostal( NmbDonnees) As Long
  12.    Dim i As Integer
  13.    Dim Longueur As Integer
  14.    Dim PartieGauche As Variant, PartieDroite As Variant
  15.    '
  16.    Nom( 1)= "DUPONT"
  17.    Nom( 2)= "DURAND"
  18.    Nom( 3)= "LERADIN"
  19.    Nom( 4)= "LERICHE"
  20.    Nom( 5)= "LEPAUVRE"
  21.    Prenom( 1) = "Antoine"
  22.    Prenom( 2) = "Marie"
  23.    Prenom( 3) = "Pierre"
  24.    Prenom( 4) = "Paul"
  25.    Prenom( 5) = "Henri"
  26.    DateNaissance( 1) = "07/09/1990"
  27.    DateNaissance (2) = "12/03/1945"
  28.    DateNaissance (3) = "17/11/1983"
  29.    DateNaissance (4) = "03/08/1979"
  30.    DateNaissance (5) = "29/02/2000"
  31.    Ville( 1) = "75000 Paris"
  32.    Ville( 2) = " 33000 Bordeaux "
  33.    Ville( 3) = "17000 la rochelle"
  34.    Ville( 4) = "69000 LYON"
  35.    Ville( 5) = "75000 paris"
  36.    '
  37.    ' Ecriture des données
  38.    For i = 1 To 10
  39.       oCell = oSheet.getCellByPosition (0, i - 1 )
  40.       oCell.setString (Nom (i ))
  41.       oCell = oSheet.getCellByPosition (1, i - 1 )
  42.       oCell.setString (Prenom (i ))
  43.       If Nom( i) ‹› "" Then
  44.           oCell = oSheet.getCellByPosition( 2, i - 1)
  45.           oCell.setValue(DateNaissance( i))
  46.          '
  47.          Longueur = Len(Ville (i ))
  48.          PartieGauche = Left(Ville (i ),5 )
  49.          PartieDroite = Right(Ville (i ), Longueur - 6)
  50.          CodePostal (i ) = Val(PartieGauche )
  51.          Ville (i ) = PartieDroite
  52.          oCell = oSheet.getCellByPosition (3, i-1 ) : oCell.setValue (CodePostal( i))
  53.          oCell = oSheet.getCellByPosition (4, i-1 ) : oCell.setString (Ville (i ))
  54.       Endif
  55.    Next i
  56. End Sub

Les données Villes et Codes postaux sont séparées. On cherche la longueur de la chaîne de caractères avec Len, ligne 47 puis on extrait les parties gauche et droite avec les fonctions Left et Right, lignes 48 et 49. On convertit le code postal de forme chaîne de carctères en valeur numérique, ligne 51. A la lecture des résultats vous notez quelques imperfections : erreur du code postal 33000 (pourquoi ?) et affichage bizarre (majuscules / minuscules) des noms de ville. L'exemple suivant va corriger des défauts. Les variables PartieGauche et PartieDroite sont déclarées de type Variant. En fait, dans ce cas, un type String serait identique.




  1. Sub Exemple08
  2.    REM Déclarations API indispensables
  3.    Dim oDocument As Object, oSheet As Object, oCell As Object
  4.    oDocument = ThisComponent
  5.    oSheet=oDocument.Sheets.getByName ("Feuille1" )
  6.    '
  7.    Dim NmbDonnees As Integer
  8.    NmbDonnees = 10
  9.    Dim Nom (10 ) As String, Prenom (10 ) As String
  10.    Dim DateNaissance (NmbDonnees ) As Date
  11.    Dim Ville( NmbDonnees) As String, CodePostal( NmbDonnees) As Long
  12.    Dim i As Integer, a As Integer
  13.    Dim Longueur As Integer
  14.    Dim PartieGauche As Variant, PartieDroite As Variant
  15.    Dim Caractere As String, CaracterePrecedent As String
  16.    '
  17.    Nom( 1)= "DUPONT"
  18.    Nom( 2)= "DURAND"
  19.    Nom( 3)= "LERADIN"
  20.    Nom( 4)= "LERICHE"
  21.    Nom( 5)= "LEPAUVRE"
  22.    Prenom( 1) = "Antoine"
  23.    Prenom( 2) = "Marie"
  24.    Prenom( 3) = "Pierre"
  25.    Prenom( 4) = "Paul"
  26.    Prenom( 5) = "Henri"
  27.    DateNaissance( 1) = "07/09/1990"
  28.    DateNaissance (2) = "12/03/1945"
  29.    DateNaissance (3) = "17/11/1983"
  30.    DateNaissance (4) = "03/08/1979"
  31.    DateNaissance (5) = "29/02/2000"
  32.    Ville( 1) = "75000 Paris"
  33.    Ville( 2) = " 33000 Bordeaux "
  34.    Ville( 3) = "17000 la rochelle"
  35.    Ville( 4) = "69000 LYON"
  36.    Ville( 5) = "75000 paris"
  37.    '
  38.    ' Ecriture des données
  39.    For i = 1 To 10
  40.       oCell = oSheet.getCellByPosition (0, i - 1 )
  41.       oCell.setString (Nom (i ))
  42.       oCell = oSheet.getCellByPosition (1, i - 1 )
  43.       oCell.setString (Prenom (i ))
  44.       If Nom( i) ‹› "" Then
  45.           oCell = oSheet.getCellByPosition( 2, i - 1)
  46.           oCell.setValue(DateNaissance( i))
  47.          '
  48.          Ville (i )=Trim(Ville (i ))
  49.          Longueur = Len(Ville (i ))
  50.          PartieGauche = Left(Ville (i ),5 )
  51.          PartieDroite = Right(Ville (i ), Longueur - 6)
  52.          Gosub NomPropre
  53.          CodePostal (i ) = Val(PartieGauche )
  54.          Ville (i ) = PartieDroite
  55.          oCell = oSheet.getCellByPosition (3, i-1 ) : oCell.setValue (CodePostal( i))
  56.          oCell = oSheet.getCellByPosition (4, i-1 ) : oCell.setString (Ville (i ))
  57.       Endif
  58.    Next i
  59. Exit Sub
  60. '
  61. NomPropre:
  62.    CaracterePrecedent = ""
  63.    a = 0
  64.    Do
  65.        a = a + 1
  66.        Caractere = Mid(PartieDroite , a , 1 )
  67.       If a 1 Then
  68.            CaracterePrecedent = Mid(PartieDroite , a - 1 , 1 )
  69.       Endif
  70.       If CaracterePrecedent = " " Or CaracterePrecedent = "" Then
  71.            Caractere = Ucase(Caractere )
  72.       Else
  73.            Caractere = Lcase(Caractere )
  74.       Endif
  75.       Mid( PartieDroite, a, 1, Caractere)
  76.       If a = Len( PartieDroite) Then Exit Do
  77.    Loop
  78. Return
  79. '
  80. End Sub

En ligne 48 la fonction Trim va supprimer les espaces indésirables (ligne 33) qui posent des problèmes ultérieurs. En ligne 52, le programme est aiguillé vers un sous-programme avec Gosub. Ce sous-programme NomPropre va transformer le 1er caractère ou tout caractère suivant un espace d'une chaîne en majuscule avec UCase, ligne 71. Tous les autres caractères seront transformés en minuscules avec LCase, ligne 73.

Les lignes 62 et 63 initialisent les variables. Un oubli (ligne 62) risque de provoquer des erreurs. L'oubli de a = 0, ligne 63 est beaucoup plus grave (voir suite).

La ligne 65 est un compteur. En 66, on extrait les caractères un par un avec Mid. En 68, on extrait le caractère précédent. C'est la raison de sa position dans un If.. Endif (lignes 67 et 69). En effet on ne peux chercher le caractère précédent qu'à partir du second, sinon, erreur.

Analysez bien la ligne 70. On cherche un espace avec " " ou (avec Or) rien avec "". Notez bien un espace entre guillemets dans le premier cas et aucun dans le second. Ces 2 cas correspondent bien aux cas, après un espace ou en début de chaîne de caractères.

La ligne 75 va transformer la chaîne avec Mid. Notez la différence importante de Mid en lecture 66 et 68 et en écriture ligne 75.

La ligne 76 est importante. Elle permet de sortir d'une boucle Do.. Loop avec Exit Do. Si cette ligne est absente, le programme boucle sans fin sur lui même. Ceci explique également l'importance de la ligne 63 qui réinitialise la variable compteur.





Et maintenant, à vos claviers.

 

 

Ce site n'est plus mis à jour. Merci aux nombreux visiteurs depuis 2003. Consultez le Wiki LibreOffice.
   

Le tableur Calc par l'exemple : christianwtd@free.fr
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France License.

  .

Site optimisé pour Firefox


Dernière modification : 29/08/2010 à 18h47


Déjà plusieurs visites sur ce site depuis quelque temps (au moins vous et moi)

Compteur non certifié