une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craque >_<

insosama

XLDnaute Nouveau
bonjour

je seche depuis plusieurs jours sans trouver de bonne solution.
mon code bloque sur une broutille sans nom :

sh.Cells(RowCall, cl).value = MaVariable

Sh contenant un worksheet, rowcall et cl un integer désignant une ligne et une colonne. ma variable etant un variant (chaine de texte, nombre, on ne sait pas exactement ce que l'utilisateur utilisera)

en mode pas a pas, avec un espion, TOUTE ces variables sont bonnes / retourne ce qu'elles doivent retourner.

pourtant le code, arrivé sur cette ligne, cesse de s'executer et ne va jamais a la suivante, sans le moindre message d'erreur.
ce n'est pas non plus un soucis de boucle sans fin ou autre. je suis dans un simple for / next, et le code plante dès la premiere occurence.
j'ai un "option explicit", donc toute mes variables sont propre.
aucune gestion d'erreure, donc encore moins de "on error resume next".
aucun "goto".

comme a aucun moment j'utilise de "focus" différent (pas de select, pas d'activate, pas de copy paste, je désigne toujours les cellules, y compris d'autres pages, par leur références variable complete), le soucis a priori ne vient pas non plus d'ici. j'ai donc meme tenté de virer la référence a SH, puisque normalement ma page de calcul reste "la prioritaire". meme bilan.
j'ai isolé le code dans une nouvelle fonction (ne sachant plus quoi inventer)
meme bilan

je ne sais plus quoi inventer.



je vais détailler un peu plus le contenu du programme :
ce que je vous montre ici est la version condensé : elle présente l'ensemble des bouts de codes ou des structure appellante des fichiers excel, des range, etc ... existe. en gros, tout ce qui pourrait comporter des "select" caché ou autre qui posent soucis.
tout le reste du code est un traitement d'array qui n'a rien a voir avec excel. l'ensemble, a part la ligne incriminé, fonctionne PARFAITEMENT.
chaque variable contient à la fin (car la ligne de code est à la fin) ce qu'elle est sencé contenir.
l'ensemble du code se comporte scrupulesement comme je l'avais prévus.


j'initie mon code (qui est une fonction dans un module), par la sauvegarde de la source de la demande : ligne de la cellule ou la formule appellante est executé, worksheet (donc nom de la feuille et nom du fichier)

Code:
Dim sh As Worksheet
Dim RowCall As Integer

Set sh = Workbooks(Application.Caller.Worksheet.Parent.Name).Worksheets(Application.Caller.Worksheet.Name)
    RowCall = Application.Caller.Row

Application.Caller.Worksheet.Parent.Name => renvois le nom du fichier (nom seul)
Application.Caller.Worksheet.Name => renvois le nom de la page
Application.Caller.Row => renvois la ligne appellante (cellule ou se trouve la formule)

j'ai aussi tenté a un moment de ne pas sauvegarder un "worksheet", mais uniquement les noms.

Code:
Dim sh As string
dim Xl as string
Dim RowCall As Integer

    Xl = Application.Caller.Worksheet.Parent.Name
    sh = Application.Caller.Worksheet.Name
    RowCall = Application.Caller.Row

dans ce cas, plus tard, je tappais un workbooks(Xl).Worksheets(sh).cells(RowCall, cl).value = mavariable.
meme résultat.

s'ensuite ensuite un code ou je déclare un "adresse()". c'est un array, et c'est lui, mon "mavariable".
cet array est rempli a un certain moment en ouvrant nombre de fichier excel externe (qui ne sont a ce moment la pas ouvert).
chaque fichier est ouvert un a un, des données sont ajoutées dans des cellules. puis le calcul est lancé, et les résultat (contenu dans certaines cellules bien déterminé) est récupéré.

le adresse est un "array" de variable de type personnalisé. il contient notament un adresse().resultat() as variant qui comporte le résultat.
elle comporte aussi les référence des cellules et des fichiers qui doivent etre ouvert, qu'est ce qui doit etre ecrit, et ou, et ou doit etre récupéré le ou les résultat.
le premier array (adresse()) correspond a chaque fichier excel ouvert
le second (resultat()) correspond a chaque cellule extraite dans ce fichier (il peut donc y en avoir plusieurs)
d'autres arguments permettent de récuperer les adresse et le contenu des cellules a remplir, et les adresse des cellules a récuperer.
l'ensemble de ce scann est réalisé dans une fonction séparé, appelé donc par la fonction principale.
l'ensemble marche "au poil".

Code:
Public Function ImportData(adresse() As cellule)
    
    'ouvre chaque fichier excel, modifie dans chacune le contenue de toute les cellule consigne, puis sauve le résultat donné dans des cellule résultat.
    
    Dim oFSO As Scripting.FileSystemObject
    Dim i, j, lg, cl As Integer
    Dim NomFichier, NomTable As String
    Dim XlApp As Object
    Dim Feuille As Worksheet

    Set oFSO = New Scripting.FileSystemObject
    Set XlApp = CreateObject("excel.application")    
    
    For i = 1 To UBound(adresse)
        XlApp.Workbooks.Open adresse(i).DirFile 'l'adresse du fichier a ouvrir
        'on écrit les valeurs

            NomFichier = oFSO.GetFileName(adresse(i).DirFile) 'le nom du fichier seul. de type "monfichier.xls"
            NomTable = adresse(i).IndexTable(j) 'le nom de la table seule "feuill1" par exemple

        For j = 1 To adresse(i).nbin
            lg = adresse(i).ligne(j) 'la premiere cellule ou doit etre écrite une donnée
            cl = adresse(i).Colonne(j)
            XlApp.Workbooks(NomFichier).Worksheets(NomTable).Cells(lg, cl).value = adresse(i).valeur(j) 'on l'ecrit.
        Next

        'on lance le calcul sur chaque feuille. les fichiers excel cible devront en tenir compte.
        For Each Feuille In XlApp.Workbooks(oFSO.GetFileName(adresse(i).DirFile)).Worksheets
            Feuille.Calculate
        Next Feuille

        For j = 1 To adresse(i).nbout 'et maintenant on scann les cellules de résultat
            adresse(i).resultat(j) = XlApp.Workbooks(oFSO.GetFileName(adresse(i).DirFile)).Worksheets(adresse(i).IndexTable(j)).Cells(adresse(i).LigneResult(j), adresse(i).ColonneResult(j)).value
        Next

        XlApp.Workbooks(oFSO.GetFileName(adresse(i).DirFile)).Close False 'ferme sans demander d'enregistrer, et sans enregistrer.

    Next
    
    Set XlApp = Nothing 'on vide la variable
    
End Function


à ce stade, donc, adresse() contient plusieurs résultat.

ces résultat devraient ensuite normalement etre copié dans des cellules sur la meme ligne que la cellule contenant la formule (notez donc bien que la formule ne retourne pas ces résultat, puisqu'il y en a PLUSIEURS, mais les écrit dans d'autres cellule)

chaque resultat dispose aussi d'un "nom".
ce nom est cherché dans une plage de titre de colonne, pour trouver l'adresse complete (ligne de la formule, colonne portant le nom du résultat), puis le résultat est noté.

plage sortie est donc un range qui contient tout les titres des colonnes ou l'ont veu faire apparaitre les résultats.

je vous fait grace de certains calculs intermédiaire; ils sont normalement entre l'appel de la fonction "importdata", visible ci dessous, et entre les deux boucles suivantes.
cette partie du code fonctionne, mais je ne peu la montrer pour des raisons de confidentialité.
pour résumer rapidement, il s'agit tout simplement de grouper les résultats de plusieurs fichiers différents dans un résultat commun si ils portent le meme nom, en appliquant une regle mathématique selon une consigne (adition, max, moyenne, etc ...)



Code:
    ImportData adresse  

    'il y a ici des codes pour réorganiser les résultats normalement

    For i = 1 To UBound(adresse)
        'et ici aussi.
        For j = 1 To adresse(i).nbout

            Nom = adresse(i).NomResult(j)
            
            
            For Each cel In PlageSortie
                
                If cel.value = Nom Then
                    cl = cel.Column
                    sh.Cells(RowCall, cl).value = adresse(i).resultat(j)
                    Exit For
                End If
                
            Next
        Next
        
    Next
    
    
    Set sh = Nothing
    
End Function


c'est donc ici que ca coince :

sh.Cells(RowCall, cl).value = adresse(i).resultat(j)

toute la variable sont pourtant bonne
mais le code ne va pas plus loin.

voila, je vois pas quoi faire, ni ce qui pourrait en etre la cause. c'est l'angoisse.
planter sur un vulgaire cells(r,c). la base, quoi.


toute aide, idée, sacrifice de poulet un soir de pleine lune est bon a prendre.


cordialement.
 
Dernière édition:

Misange

XLDnaute Barbatruc
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

Bonjour
Je ne sais pas quand est la pleine lune mais je préfère le canard au poulet :)
Difficile de faire des tests sans avoir le classeur...
Essaie de nous le transmettre anonymisé histoire de savoir déjà si ça plante seulement chez toi ou ailleurs aussi.
Sinon : essaie d'abord de supprimer la déclaration de variable... c'est une bonne façon de vérifier si le problème vient de là ou pas lignes déclarées en integer alors qu'il faut déclarer en long par exemple.
Mais c'est curieux que ça se produise dès le premier passage dans la boucle et sans message d'erreur.
 

insosama

XLDnaute Nouveau
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

j'ai tenté toute les combinaisons possible pour les variables.
jusqu'a virer les boucles
meme faire un cells(r,c).value sans sh, et meme pire, un cells(r,c).value = 18. et meme un cells(cint(r),cint(c)).value = "18" et encore un cells(4,2).value = 15
bah meme ca, ca ne marche pas.

ca ressemble vraiment un probleme de "select". sauf que mon code en comporte AUCUN. je comprend pas. et qu'avec un SH devant cela devrait fonctionner.

un ami par contre m'a donné une piste de reflextion : application.sh.cells
ca ne marche pas non plus. mais peut etre dois je m'inspirer d'une selection comme pour la fonction importdata, en déclarrant un objet excel pointant sur le calsseur courrant.
sauf que si je sais ouvrir un nouveau classeur ainsi, je ne sais pas comment creer un objet lié au classeur courrant.
n'empeche que le code avec l'objet excel application dans "importdata" marche, et le code sans ce "cesam" qui s'execute juste apres, lui, ne marche pas du tout.
je pigerais pas pourquoi, et je ne sais pas faire, mais "pourquoi pas" ?

pour transmettre le fichier, c'est plus compliqué que simplement les valeurs, c'est le code lui meme qui est "protégé". je vais voir comment je peu faire.
je craque completement, c'est a devenir marteau.
tout le code marche
mais je ne peu "écrire" visuellement le résultat.

nawak.

je vais par contre tenter sur un autre PC, je vais aussi rebooter mon PC une enieme fois, on ne sait jamais. et acheter un ou deux canard.

cdlmt.
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

Bonsour®
peut-être en qualifiant le Workbook qui doit recevoir la valeur ???
Wb.sh.Cells(RowCall, cl).value = MaVariable

(set Wb = ThisWorkBook, ActiveWorkBook, MyWorkBook... )
 

insosama

XLDnaute Nouveau
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

PC rebooté : toujours le soucis.

j'ai tenté ce que tu viens de dire (bonne idée !)

Application.Workbooks(XlName).Worksheets(ShName).Cells(RowCall, cl).value = adresse(i).resultat(j)
Workbooks(XlName).Worksheets(ShName).Cells(RowCall, cl).value = adresse(i).resultat(j)
wb.sh.Cells(RowCall, cl).value = adresse(i).resultat(j)
application.wb.sh.Cells(RowCall, cl).value = adresse(i).resultat(j)

avec en déclaration de variable :


Dim sh As Worksheet
Dim wb As Workbook
Dim adresse() As cellule
Dim RowCall, ColCall As Integer
Dim i, j, lg, cl, rw As Integer
Dim Temp As Variant
Dim cel As Range
Dim Nom As String
Dim ShName As String
Dim XlName As String

ShName = Application.Caller.Worksheet.Name
XlName = Application.Caller.Worksheet.Parent.Name

Set sh = Workbooks(XlName).Worksheets(ShName)
RowCall = Application.Caller.Row
ColCall = Application.Caller.Column
Set wb = ThisWorkbook


les 4 solutions différentes => meme résultat.
 

insosama

XLDnaute Nouveau
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

j'avais essayé toute les combinaisons "select" et "activate" possible
c'est a se demander si une fonction ne peux tout simplement pas ecrire quoi que ce soit ou que ce soit ailleur que la formule.

je vais donc peut etre retourner ma veste et transferer les résultat sous forme de chaine de carra. et faire une fonction dédié pour lire ce résultat et en extraire qu'une partie donnée.
deux jours que je me prend la tete pour une broutille. je dois avancer.
 

Modeste geedee

XLDnaute Barbatruc
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

Bonsour®

msgbox Sh & chr(10) _
& rowcal & chr(10) _
& cl &chr(10) _
& mavariable
sh.Cells(RowCall, cl).value = MaVariable

:cool: si ça plante dans l'affichage du msgbox , peut etre saura-t-on via debug qui est responsable ...
 

insosama

XLDnaute Nouveau
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

bien vu ! ca plante !!!!

c'est SH qui ne retourne rien quand on l'interroge ainsi.
pour rappel, sh est renseigné dès le début de la fonction avec :

ShName = Application.Caller.Worksheet.Name
XlName = Application.Caller.Worksheet.Parent.Name

Set sh = Workbooks(XlName).Worksheets(ShName)

toutefois, ca n'est que la moitié du probleme, puisque si la msgbox affiche quelque chose, si je fais un :
ThisWorkbook.Worksheets(ShName).Cells(1, 1).Value = 15 (donc appelant bien un simple string cette fois ci)
ainsi que Cells(1, 1).Value = 15 ou encore Worksheets(ShName).Cells(1, 1).Value = 15, wb.Worksheets(ShName).Cells(1, 1).Value = 15 ... autrement dit en esquivant "sh", le probleme persiste.

a noter en outre que :
sh.activate, ou ThisWorkbook.Worksheets(ShName).Activate, eux, fonctionnent.

c'est a devenir marteau :(
 

Staple1600

XLDnaute Barbatruc
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

Bonsoir à tous


pour transmettre le fichier, c'est plus compliqué que simplement les valeurs, c'est le code lui meme qui est "protégé".
Dans ce cas, pourquoi se retrouve-t-il publié sur un forum public ?
Sa diffusion est interdite ou pas ?
 

insosama

XLDnaute Nouveau
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

bonjour

d'une part, parce que je suis moi meme le responsable des droits sur le code. j'ai donc tout a fait conscience de ce qui peu ou ne peu etre diffusé. j'ai tappé le code, seul, je m'occupe aussi de sa protection tant ici que celle, en court, juridique.
et surtout, d'autre part (mais ce point serait une vaste blague si le premier n'etait pas existant) parce que je sais exactement ce que je protege, le "noyau dure de l'inovation", et je n'en ai ni parlé, encore moins diffusé quoi que ce soit.

ce que j'ai transmit ici est une parmis les 15 000 facon de faire pour ouvrir depuis un excel un ou plusieurs autre excel, ecrire des donnée dedans, les récuperer, et les mettre ensuite dans le fichier "source" du code.
j'aurais bien du mal a proteger, ou faire passer pour inovant, quelque choe d'aussi ... répandu.

en revanche, diffuser l'ensemble du code est impossible, a moins que je fasse des coupes drastique dedans pour le rendre le plus banal possible.

toujours aucune solution. c'est vraiment a n'y rien comprendre. je commence réellement a me demander si je dois pas radicalement changer de fusil d'epaule.

cordialement.
 

insosama

XLDnaute Nouveau
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

bon, c'est vraiment inexplicable.
alors j'ai décidé d'utiliser le retour de donnée de la fonction (ce que la cellule affiche) pour mettre tout mes résultat concaténé avec des carra de séparation.
puis j'ai créé une fonction split dédié pour ensuite, via des formules dans les cellules qui étaient sencé retourner les résultats, extraire la valeur seul qui est concerné. c'est bourin, mais ca marche.
dommage de ne pas avoir su trouver d'ou venait mon probleme initial.

pour ceux que ca interresse, ma fonction "split" : https://www.excel-downloads.com/threads/injecter-un-array-dans-une-formule.220610/

je passe a résolu.

cordialement.
 

PMO2

XLDnaute Accro
Re : une instruction ultra basique ne s'excecute pas, sans message d'erreur. je craqu

Bonjour,

C'est quoi cellule dans
Code:
Public Function ImportData(adresse() As cellule)

Est-ce un Type défini par l'utilisateur ?
Si oui, quelle est sa structure ?
 

Statistiques des forums

Discussions
312 195
Messages
2 086 078
Membres
103 112
dernier inscrit
cuq-laet