[Résolu][Calc] Erreur 91 généré à l'ouverture du fichier

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
NAS77
Fraîchement OOthentifié
Messages : 5
Inscription : 24 avr. 2012 12:19

[Résolu][Calc] Erreur 91 généré à l'ouverture du fichier

Message par NAS77 »

Bonjour,

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
Si quelqu'un a une idée, je le remercie de son aide.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par NAS77 le 27 août 2012 09:07, modifié 1 fois.
Syst??me d'exploitation : Windows 7
LibreOffice : 3.4
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17187
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Erreur 91 généré à l'ouverture du fichier.

Message par jeanmimi »

Bonjour,
Le fichier est-il au départ un fichier MS Excel ?
 Ajout : Et pourquoi faire compliqué avec Calc et une Macro d'incrémentation, alors que Base fait ça très bien automatiquement ? 
Dernière modification par jeanmimi le 24 août 2012 18:41, modifié 1 fois.
LibreOffice : Version : 25.2.0.3 (x64)(20 février 2025)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
NAS77
Fraîchement OOthentifié
Messages : 5
Inscription : 24 avr. 2012 12:19

Re: Erreur 91 généré à l'ouverture du fichier.

Message par NAS77 »

Effectivement au départ il s'agissait d'un fichier excel que j'ai repris. Mais j'ai supprimé tous les onglets et macros que j'avais créés à l'origine quand je me suis apercçu que ce n'était pas du tout le même langage. Toutes les macros du fichier directement été générées depuis libreoffice.
Syst??me d'exploitation : Windows 7
LibreOffice : 3.4
Avatar de l’utilisateur
gerard24
ManitOOu
ManitOOu
Messages : 3160
Inscription : 06 juil. 2008 17:08
Localisation : dans le Périgord

Re: Erreur 91 généré à l'ouverture du fichier.

Message par gerard24 »

Bonjour,

Bien que non spécialiste des macros, il me semble que en utilisant :

Code : Tout sélectionner

feuille=thisComponent.Sheets.GetByIndex(0)
à la place de :

Code : Tout sélectionner

feuille=thisComponent.currentController.activeSheet
En effet la fonction macro appelle la feuille active lors de l'ouverture du fichier et du calcul des formules, et à ce moment là il n'y a pas de feuille active.
Par contre une fois le classeur ouvert, un Ctrl+Maj+F9 sur la feuille active affiche les résultats.

Si un pro peux confirmer, je n'ai pas regardé le reste du code.

A+
OOodidacte
LibreOffice 6.4.5 sous Windows 10.
pour télécharger LibreOffice
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 948
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: Erreur 91 généré à l'ouverture du fichier.

Message par luky-luke »

Bonjour,

Dans le fichier que je viens de télécharger, les formules dans la colonne B sont incomplètes. si je corrige les formules dans le reste de la colonne, tout rentre dans l'ordre. Enfin je crois.... :wink:

Cordialement
Luke
LibO 7.4.7.2 Raspberry pi et Libo 7.6.5.2 LinuxMint 22
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
NAS77
Fraîchement OOthentifié
Messages : 5
Inscription : 24 avr. 2012 12:19

Re: Erreur 91 généré à l'ouverture du fichier.

Message par NAS77 »

Bonjour,

Effectivement vous avez raison, le problème vient bien de la déclaration de la feuille. Cependant, la solution que vous proposez ne fonctionne que dans le cas où il n'y qu'une seule feuille à renseigner. Or j'ai 3 catégories d'objets à renseigner de natures différentes : les ponctuels (arbres), les linaires (haies, fossés etc..) et les surfaciques (pelouses, berges etc...). J'ai donc 3 onglets à renseigner. Votre solution vient elle me figer le premier onglet, ma macro va donc regarder uniquement dans la base de données des ponctuels (dans mon cas). Les identifiants seront donc erronés.

Merci toute de même pour l'idée car cela va me permettre d'orienter mes recherches...
Syst??me d'exploitation : Windows 7
LibreOffice : 3.4
NAS77
Fraîchement OOthentifié
Messages : 5
Inscription : 24 avr. 2012 12:19

Re: Erreur 91 généré à l'ouverture du fichier.

Message par NAS77 »

bonjour Lucky-luke,

Non les formules ne sont pas incomplètes : moi aussi au départ je l'ai cru. En fait il suffit d'étendre la barre des formule (flèche vers le bas à droite de la barre) et l'ensemble de la formule apparaît. UN autre moyen, cliquer dans la cellule.

Merci d'essayer de m'aider.
Syst??me d'exploitation : Windows 7
LibreOffice : 3.4
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12668
Inscription : 08 nov. 2005 16:23
Localisation : Brest, France

Re: Erreur 91 généré à l'ouverture du fichier.

Message par Bidouille »

Bonjour,
NAS77 a écrit :Je débute sur les macros OOoBasic
Votre question a donc été déplacé depuis le Coin des débutants dans la section Macros.
Le titre a été modifié en conséquence (voir le bandeau rouge en haut de la page).
Avez-vous remarqué que le code devait être encadré pour être plus lisible ?

Code : Tout sélectionner

Du code plus facile à lire
La prochaine fois, merci de poster directement au bon endroit.
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

Re: [Calc] Erreur 91 généré à l'ouverture du fichier

Message par Churay »

Bonjour

Pour mémoire : Code erreur 91 -> Variable d'objet non définie

L'info est accessible via :

Code : Tout sélectionner

F1  -> 
	Contenu 
		Macro et Programmation 
			Aide-mémoire des commandes 
				Fonctions d'exécution, instructions et opérateurs 
					Fonction Error [Exécution]
et affichable par code quand le gestionnaire d'erreur (On Error) n'est pas trop déstabilisé par l'erreur, voir ci-dessus pour la syntaxe.

La liste complète en fichier ods
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 948
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Calc] Erreur 91 généré à l'ouverture du fichier

Message par luky-luke »

Bonjour,
Cette histoire me turlupinais, j'ai donc regardé tes formules et ton code un plus sérieusement.
Résultat :
gerard24 a écrit :Bien que non spécialiste des macros, il me semble que en utilisant :
feuille=thisComponent.Sheets.GetByIndex(0)
+1
Le fait de chercher une feuille active alors qu'elle ne l'ai pas encore provoque le Code erreur 91 -> Variable d'objet non définie
Mais comme tu veux utiliser le même code pour toute les feuilles, il faut contourner le problème en écrivant en début de macro :

Code : Tout sélectionner

	If thisComponent.IsLoaded = true  Then
		Feuille = thisComponent.currentController.activeSheet
	Else
		Exit Function
	End if
Ensuite j'ai modifier les formules. A la place de :

Code : Tout sélectionner

=SI(ET($B$1<>"";$Q7<>"";$D7<>"");IDENTIFIANT(SI($D7="Arbre_d_Alignement";CONCATENER(SI($Q7="SAN";"SAN";"COM");DROITE($A7;3);"AA");CONCATENER(SI($Q7="SAN";"SAN";"COM");DROITE($A7;3);"AI"));4;LIGNE($B6)-1;COLONNE($B7)-1);"")
J'ai écris plus simplement ou presque :

Code : Tout sélectionner

=SI(ET($B$1<>"";$Q7<>"";$D7<>"");IDENTIFIANT(SI($D7="Arbre_d_Alignement";CONCATENER(SI($Q7="SAN";"SAN";"COM");DROITE($A7;3);"AA");CONCATENER(SI($Q7="SAN";"SAN";"COM");DROITE($A7;3);"AI"));5;LIGNE($B6)-1;1);"")
La première ligne n'est pas la 4, mais la 5. Ensuite la colonne étant toujours la B il est inutile de faire un calcul d'index de colonne.

Après je pense que tu t'es emmêlé les pinceaux avec la fonction Mid ou alors j'ai rien compris(ce qui n'est pas impossible), mais j'avais des messages d'erreur du type : Erreur d'exécution BASIC -> Non implémenté
Ce qui donne après correction :

Code : Tout sélectionner

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

	If thisComponent.IsLoaded = true  Then
		Feuille = thisComponent.currentController.activeSheet
	Else
		Exit Function
	End if

	i = Ligne 
	While Mid(feuille.getcellbyposition(Colonne,i).string, 1, 8) <> Caract And i > Premiere
	i = i - 1
	Wend
		If i <> Premiere Then
    		Numero = Mid(feuille.getcellbyposition(Colonne,i).string, 9, 4) ' 4 pour aller jusqu'à 9999 arbres 
    		Numero = Numero +1 
    		Identifiant = Caract & CStr(Numero)
		Else
    		If  Mid(feuille.getcellbyposition(Colonne,i).string, 1, 8) = Caract Then
        		Identifiant =  Caract & CStr(2)
    		Else
        		Identifiant =  Caract & CStr(1)
    		End If
		End If
End Function
Enfin, j'ai enregistré une macro (module1) pour le rafraichissement d'affichage. Elle est liée à l'activation du document :
Outils > Personnaliser...> onglet évènements > Activer le document

Code : Tout sélectionner

sub refresh
dim document   as object
dim dispatcher as object
		document   = ThisComponent.CurrentController.Frame
		dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
		dispatcher.executeDispatch(document, ".uno:CalculateHard", "", 0, Array())
End sub
Le code fonctionne correctement à la maison, sans message d'erreur et en indexant correctement les identifiants.
Le fichier qui va bien en pièce jointe.
 Ajout : Sam.25 août 17h05
modification pour indexation de l'identifiant au delà du 10° arbres, jusqu'au 9999° et changement de fichier 
Cordialement
Luke
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibO 7.4.7.2 Raspberry pi et Libo 7.6.5.2 LinuxMint 22
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
NAS77
Fraîchement OOthentifié
Messages : 5
Inscription : 24 avr. 2012 12:19

[Résolu] Erreur 91 généré à l'ouverture du fichier

Message par NAS77 »

Un grand merci luky-luke pour ton aide ! Tout fonctionne maintenant.
Syst??me d'exploitation : Windows 7
LibreOffice : 3.4