Excuse moi si je m'y prends mal avec le forum pour poser ma question, mais c'est la première fois que je fais appel à un forum. J'espère que le titre sera suffisamment éloquent sur mon problème.
Je débute sur les macros OOoBasic et donc mon problème vous paraîtra peut-être idiot. Avant de vous l'exposer, j'ai effectué quelques recherches sur le net sans succès.
Petite présentation rapide du fichier que je vais joindre : Il s'agit d'une base de données servant aux communes à gérer leurs espaces verts (exemple ici des arbres isolés ou alignés). Afin d'identifier chaque arbre de manière unique, je leur attribue un numéro unique généré à partir : de la commune (cellule B1), de sa catégorie (aligné ou isolé, en colonne D) et de son gestionnaire (commune ou non, en colonne Q), et avec un chiffre qui s'incrémente. Ce code est généré dans la colonne B "Identifiant". Pour générer ce code, j'utilise une macro appelée IDENTIFIANT. Celle-ci est enregistrée dans le module Standard du fichier.
Fichier ouvert, la macro fonctionne parfaitement. Or Si je génère plusieurs objets, puis que j'enregistre le fichier et que je le ferme, à la réouverture du fichier, chaque ligne sur laquelle un identifiant a été créée génère un message d'erreur pendant l'ouverture du fichier :
"Erreur d'exécution BASIC '91' - Variable d'objet non définie."
En acquittant chaque message d'erreurs, le fichier finit par s'ouvrir mais les cellules des identifiants sont vides. IL suffit alors de modifier une des 3 variables citées ci-dessus pour que les identifiants soient régénérés normalement. J'ai beau cherché je ne trouve pas l'erreur.
Ci-dessous le code de la macro :
Code : Tout sélectionner
Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
REM ***** BASIC *****
public function identifiant(Caract As String, Premiere As Integer, Ligne As Integer, Colonne As Integer)as string
dim feuille as object
Dim i As Integer
Dim Numero As Integer
feuille=thisComponent.currentController.activeSheet
i=Ligne 'ici il s'agit de la ligne précédente de celle où l'on veut générer l'identifiant.
'Ici l'objectif est de remonter le tableau afin de trouver la ligne où se trouve le caractère que l'on recherche jusqu'à la première ligne de
'donnée du tableau.
While Mid(feuille.getcellbyposition(Colonne,i).string,1,8) <> Caract And i > Premiere
'Description de Mid :
'Renvoie une valeur de type Variant (String) contenant un nombre indiqué de _
'caractères extraits d'une chaîne de caractères.
'syntaxe : Mid(string, start[, length])
'La syntaxe de la fonction Mid comprend les arguments nommés suivants :
'string : Expression de chaîne dont sont extraits les caractères à renvoyer.
'Si l'argument string contient une valeur de type Null, Null
'est renvoyé.
'start : Donnée de type Long. Position du caractère dans l'argument string qui _
'marque le début de la partie à extraire. Si la valeur de l'argument
'start est supérieure au nombre de caractères contenus dans l'argument
'string, la fonction Mid renvoie une chaîne de longueur nulle ("").
'length : Facultatif. Donnée de type Variant (Long). Nombre de caractères à _
'renvoyer. Si l'argument length est omis ou si le nombre de caractères
'du texte(y compris le caractère qui occupe la position start),
'est inférieur à la valeur de cet argument, tous les caractères à
'compter de la position start et jusqu'à la fin de la chaîne sont
'renvoyés.
i = i - 1
Wend
'Si la ligne recherchée n'est pas la première, alors on extrait son indicatif (chiffre qui s'incrémente, se trouvant à partir de la 9ème
'position auquel on ajoute 1. Ensuite il suffit de concaténer ce chiffre avec le caractère que l'on recherchait.
If i <> Premiere Then
Numero = CDec(Mid(feuille.getcellbyposition(Colonne,i).string, 9)) + 1
Identifiant = Caract & CStr(Numero)
'Sinon, c'est que l'on est à la première ligne et alors 2 choix sont possibles : soit la première ligne contient le caractère que l'on
'recherche alors on a affaire à la 2ème occurrence de l'objet, soit ce n'est pas le cas, alors il s'agit de la 1ère occurrence.
Else
If Mid(feuille.getcellbyposition(Colonne,i).string, 1, 9) = Caract Then
Identifiant = Caract & CStr(2)
Else
Identifiant = Caract & CStr(1)
End If
End If
end function