XL 2016 #NOM? dans cellule alors qu'en double cliquant et en validant, elle se calcule

nicodebut

XLDnaute Nouveau
Bonjour,
Je vous explique mon cas:
J'ai quelques centaines de fichier de la même forme, seule les données changent. Le but est avec une macro de mettre en PDF des onglets (les mêmes de chaque fichier) du fichier. Là, pas de souci, ça fonctionne.
En revanche, dans ma page de garde du fichier, j'ai une formule qui liste un certains nombre de numéro de contrat en se basant sur une liste présente dans une autre feuille du fichier. Le souci est que cette formule me renvoie #NOM? et quand le lance ma macro, j'ai donc cela à la place de la liste des numéros de contrats dans mon PDF.
Si je clique dans la cellule et que je fais "entrée", le résultat est bon... En revanche, cela ne fais rien avec F9
J'ai essayé plusieurs choses:
- approuvé les emplacements des fichiers excel
- approuvé l'emplacement de mon fichier excel avec lequel le lance la macro
- enlever toute sécurité liée aux macro qui pourrait mettre le fichier en mode protéger
- insérer dans la macro après ouverture du fichier un remplacement du "=" dans la cellule par un "=" pour forcer le calcul

Rien n'y fait... Je suis désespéré et n'ai pas envie d'ouvrir mes centaines de fichier un par un pour faire afficher ce résultat!
Est-ce qu'il existe une astuce avec vba?
En vous remerciant par avance, je vous joins le fichier en question.
 

Pièces jointes

  • fichier test.xlsm
    21.8 KB · Affichages: 14
Solution
Est-ce possible qu'il y ait un rapport entre le compte qui modifie le fichier??
Je ne pense pas non.
Et ça ne me choque pas outre mesure que la propriété soit différente si tu l'ouvres directement ou si c'est la macro qui l'ouvre.

Au passage, je ne pense pas que Application.ScreenUpdating = False puisse aider beaucoup dans ton cas. Autant mettre en commentaire tant que tu as le pb.
A tester, après ouverture du fichier :
VB:
    With ActiveWorkbook.Sheets("Sommaire").Columns("I")
        .Dirty
        .Calculate
    End With
    Do Until Application.CalculationState = xlDone
        DoEvents
    Loop
Tant qu'à faire, travailler hors réseau pour éliminer cette partie.

Au pire, tu pourras toujours évaluer en vba la valeur...

fanfan38

XLDnaute Barbatruc
il m'avait une erreur de nom
J'ai donc recopié la formule dans une cellule
je l'ai coupé.. (après le 1er si)
et quand j'ai enlevé l'apostrophe que j'avais mis devant il m'a dit acceptez vous cette correction...
Mais vu la longueur de la formule je n'ai pas vu de modif
A+ François
 

nicodebut

XLDnaute Nouveau
pas compris. Car oui il dit qu'il y a une erreur. Mais si je double clique dans la cellule et que je fais "entrée", la formule se calcule! mon souci est qu'il faut faire cela pour tous les fichiers et je n'arrive pas à le faire par macro! la macro n'a pas l'air de vouloir faire calculer cette cellule!
 

nicodebut

XLDnaute Nouveau
Bonjour Eric,
Quand j'ouvre le fichier, si le fait Alt+Ctrl+Shift+F9 , la formule se calcule. Maintenant j'ai essayé de mettre le code dans vba, il me donne une erreur... pour le faire sur le classeur qu'on vient d'ouvrir via la macro, on peut faire:
VB:
Workbooks(1).ForceFullCalculation
il me donne une erreur
 

eriiic

XLDnaute Barbatruc
Excuse, c'est :
VB:
 Application.CalculateFull
Comme l'objet est Application, ça s'applique à tous les classeurs.
Essaie d'en avoir le minimum d'ouverts, et de préférence sans formules trop gourmandes vu que tu parles de centaines de fichiers... Teste avec 2 déjà ;-)

Mais avais-tu essayé :
Code:
sheets("ta_feuille").Calculate
' voire même pour restreindre
[ta_plage].Calculate
' ou plus large
Workbooks("ton_classeur").calculate

Edit :
autre idée pour essayer de restreindre au minimum, nomme ta plage ou tes cellules #NOM! et :
VB:
[ta_plage].Dirty
[ta_plage].Calculate
 
Dernière édition:

nicodebut

XLDnaute Nouveau
Bonjour
@fanfan38 : en fait c'est ici un exemple. Je peux avoir des fichier avec plusieurs numéros de contrats. En I11 un numéro, un autre en I12, etc... Et dans ma cellule qui pose problème, j'écris: le numéro I11 - le numéro I12 - ... jusqu'à I16 et après le mets des ... s'il y a plus de 6 valeurs. Dans ce cas d'exemple, on a bien une valeur. Ce que je n'explique pas c'est que j'ai beau mettre des calculate, des forcefullcalculation, j'ai l'impression que la macro ne le fait pas! Après je place peut être mal mes codes...
@eriiiic : j'ai essayé mais rien n'y fait.
Je poste mon code de transformation de excel vers pdf. En fait j'ai un invite pour choisir mon dossier. Ensuite la macro parcourt tous les sous dossiers et ouvre chaque fichier de chaque sous dossier pour la passer en PDF. Mes lignes de codes pour forcer le calcul avant la mise en pdf sont peut être mal positionnées?
VB:
Sub CT_prevdosetssdoss()
    Dim objShell As Object, objFolder As Object, oFolderItem As Object
    Dim Chemin As String
    racine = ChoixDossier()     ' ou un répertoire C:\xxx e.g.
    If racine = "" Then Exit Sub
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set dossier_racine = fs.getfolder(racine)
     For Each d In dossier_racine.SubFolders
     Dim i
   ' Set objShell = CreateObject("Shell.Application")
   ' Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&)
     Fichier = Dir(d & "\" & "*.xlsm")
     i = 2
   ' On Error Resume Next
   ' Set oFolderItem = objFolder.Items.Item
   ' Chemin = oFolderItem.Path
 
   ' MsgBox Chemin
   ' ChDir Chemin
   ' Dim Fichier As String

    'Boucle sur tous les fichiers xlsx du répertoire.
   ' Fichier = Dir("*.xlsm")
    'Utilisez la syntaxe suivante pour boucler sur tous les types de fichiers:
    'Fichier = Dir(Chemin & "*.*")
 
    Do While Fichier <> ""
        'écrit le résultat dans la fenêtre d'exécution (Ctrl+G).
          If Fichier <> ThisWorkbook.Name Then
            Workbooks.Open d & "\" & Fichier
            Workbooks.Application.CalculateFullRebuild
            Application.CalculateFull
            Sheets("Page de garde").Application.CalculateFull
            Sheets("Page de garde").Select
            Range("E9:K17").Dirty
            Range("E9:K17").Calculate
        Dim nfichier As String, nfichier2 As String, intpos As Byte

            nfichier = ActiveWorkbook.Name
            intpos = InStrRev(nfichier, ".")
            nfichier = Left(nfichier, intpos - 1)
            nfichier2 = nfichier & ".pdf"
           'MsgBox Fichier
            Application.ScreenUpdating = False
               Sheets(Array("Page de Garde", "Résultat AT", "Liste PM INCAP", "Liste PM INVAL", "Résultat Deces", "Liste PM RENTE", "Résultat Global", "Etude prestations", "Etude Nombre de jour et d'arrêt", "Lexique")).Select
      

            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=d & "\" & nfichier2, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
            
        ActiveWorkbook.Close True
        i = i + 1
            End If

        Fichier = Dir()
    Loop
    Next
    MsgBox "transformation terminée"
End Sub

Merci d'avance,
Nicolas
 

eriiic

XLDnaute Barbatruc
Bonjour,

si tes formules font référence au fichier que tu ouvres, il faut sans doute lui laisser un peu de temps pour faire la mise à jour.
Teste en insérant une tempo après l'ouverture, ici 1 s :
VB:
Application.Wait DateAdd("s", 1, Now())
eric
 

nicodebut

XLDnaute Nouveau
Bonjour
@eriiiic , merci pour ton retour, j'ai donc testé cela juste avant la déclaration des fichier, nfichier2.
J'ai mis 2s pour assurer et rien de mieux.
J'ai fait un test sur 2 fichiers. C'est vraiment étrange: j'ai un fichier qui quand je l'ouvre à la valeur #NOM? directement et un autre qui a la valeur de la formule quand je l'ouvre.
J'ai lancé la macro, mes 2 fichiers générés en PDF ont la valeur #NOM? où je devrais avoir le numéro de contrat.
Cela signifie que la macro, lorsqu'elle ouvre le fichier qui avait la valeur de la formule transforme cette valeur en #NOM? et ensuite l'enregistre en PDF!
N'y aurait-il pas un problème avec VBA? (version, sécurité de macro, autre?)
Merci encore pour votre aide
Nicolas
 

nicodebut

XLDnaute Nouveau
la formule qui pose souci est dans le classeur que j'ouvre avec la macro (donc pas dans celui de la macro qui ne me sert qu'à lancer la macro via un bouton).
Je ne pense pas avoir beaucoup de formules lourdes, celle qui pose souci est longue et intègre des formules "index" qui peuvent être plus longue je pense.
Encore merci à toi, je creuse en parallèle mais rien qui vaille. Je vais faire le test sur mon pc perso pour voir si j'ai une différence et qui sera hors réseau.
 

nicodebut

XLDnaute Nouveau
Résultat du test: sur mon pc perso, même combat!
Par contre, j'ai remarqué un truc:
j'ai donc 2 fichiers excel qui ont été généré sur le même serveur avec une méthode identique (Excel 2013).
Si je rapatrie le fichier en local sur mon pc (ou sur un autre serveur) (Excel 2016), le dernier enregistrement enregistré dans les propriétés du fichier est bien "ST": celui qui a généré le fichier. Si j'ouvre ces fichiers en local sur mon pc, alors le fichier s'ouvre correctement avec le numéro du contrat.
Par contre, si je lance la macro, alors le pdf n'est pas bon et le fichier excel n'est plus bon, la valeur #NOM? remplace le numéro du contrat!! le dernier enregistrement est alors attribué à moi et plus à "ST". le point commun est que tous les fichiers avec le dernier enregistrement à ST s'ouvre bien, par contre, tous ceux avec le dernier enregistrement à mon nom (ou un autre nom car une autre personne à testé) ne s'ouvre plus correctement et il faut double cliquer et valider pour avoir la bonne valeur.

Est-ce possible qu'il y ait un rapport entre le compte qui modifie le fichier??
Je sais pas si c'est ça mais les coïncidences comme ça...
Merci,
Nicolas Falcoz
 

Discussions similaires

Réponses
10
Affichages
367

Statistiques des forums

Discussions
311 723
Messages
2 081 932
Membres
101 844
dernier inscrit
pktla