Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 VBA PI DataLink : Probleme Application.Screenupdating avec procédure de MAJ plage

safranien

XLDnaute Occasionnel
Bonjour à tous

je sollicite votre aide car je n'arrive pas à résoudre un problème avec un de mes codes. Dans le cadre de mon activité, j'utilise PI DataLink et ai rédigé un code qui me permet de mettre à jour les plages de données liées à PI.
Mon problème est qu'à chaque exécution du code, je vois le changement de feuille (de TDB à Datas, actualisation de splages puis retour à la feuille TDB) et ce, malgré Application.Screenupdating = False.
Je comprends que le problème vient des ".select" pour sélectionner la première cellule de la plage de données PI mais je ne sais pas comment ne pas les utiliser.

Ci-dessous mon code :

VB:
Sub Refresh()

Dim addIn As COMAddIn
Dim automationObject As Object

Dim wsDatas As Worksheet
Dim wsTDB As Worksheet

Dim MyRange1 As Range
Dim MyRange2 As Range

Set addIn = Application.COMAddIns("PI DataLink")
Set automationObject = addIn.Object

Set wsDatas = ThisWorkbook.Worksheets("DATAS")
Set wsTDB = ThisWorkbook.Worksheets("TDB")

Set MyRange1 = wsDatas.Range("R30")
Set MyRange2 = wsDatas.Range("T30")


Application.ScreenUpdating = False

    wsTDB.Range("P1").Calculate
    wsTDB.Range("P2").Calculate
    wsDatas.Range("A1:B2,C2:V2").Calculate
    wsTDB.Range("A11:B22").Calculate
    wsDatas.Range("B4:B16").Calculate
        
        If (Left(Worksheets("TDB").Range("P1"), 4) = "BT >") Then
        
        'Application.ScreenUpdating = False
        
                    
            With wsDatas
            .Select
                        
                With MyRange1
                .Select
  
                automationObject.SelectRange
                automationObject.ResizeRange
                
                End With
            
            
                With MyRange2
                .Select
  
                automationObject.SelectRange
                automationObject.ResizeRange
                
                End With
            
            End With
      
            wsTDB.Select
                  
        Else
        
        End If

        
    Application.Calculation = xlCalculationAutomatic
    Application.Calculation = xlCalculationManual
    

Application.ScreenUpdating = True

End Sub

Le problème vient donc de cette partie de code mais comme je le disais je ne sais pas comment ne pas utiliser les .Select des With MyRange1 etc

Code:
With wsDatas
            .Select
                        
                With MyRange1
                .Select
  
                automationObject.SelectRange
                automationObject.ResizeRange
                
                End With
            
            
                With MyRange2
                .Select
  
                automationObject.SelectRange
                automationObject.ResizeRange
                
                End With
            
            End With
      
            wsTDB.Select

En espérant que l'un de vous connaisse PI Data Link et puisse m'aider.

Bonne soirée
 

safranien

XLDnaute Occasionnel
Effectivement, avec ce code test, je n'ai pas d'erreurs et obtient bien les 2 messages box.
Je crois que ça va être difficile à moins de tomber sur un membre qui soit également utilisateur de cet add-in.
Je continue mes recherches.
 

Le_Sage

XLDnaute Nouveau
Salut.

Option Base 1 n'a aucun intérêt ici.
Dim allRanges(2) crée en effet un tableau à 3 index allant de 0 à 2

allRanges(1) = Sheets("DATAS").Range("R30").Address
allRanges(2) = Sheets("DATAS").Range("T30").Address

donnera donc :

allRanges(0) = Emtpy
allRanges(1) = "$R$30"
allRanges(2) = "$T$30"

Du coup, l'utilisation d'un tableau tel que celui-ci ne sert à rien...
A faire un tableau d'adresses, autant utiliser la fonction Split et le faire comme ça :

VB:
Dim varAllRange() As Variant, _
    varRange as variant
Const c_strAdresses="R30;T30"

varAllRange() = Split(c_strAdresses, ";")

For Each varRange in varAllRange()
       bla bla bla
Next

Pour ce qui est du problème initialement posé, et au-delà de toutes les tentatives malheureuses vaillamment testées, on pourra retenir que :
  • automationObject.MyRange1.ResizeRange n'a aucune chance de fonctionner car ResizeRange n'est pas une méthode de la classe Range

  • automationObject.SelectRange :
    • Il semblerait que cette méthode ne s'applique qu'à la sélection en cours, or on ne peut utiliser les méthodes Select et Activate d'un objet de classe Range que si la feuille parente est active, donc on ne peut pas éviter d'activer la feuille en question
  • automationObject.ResizeRange :
    • Il faudrait voir si on peut préciser quelle est la cellule à "redimensionner", ce qui donnerait quelque-chose du genre automationObject.ResizeRange("R30")
  • Il serait intéressant de voir si dans les méthodes proposées par cette classe on n'a pas un truc du genre automationObject.SetRange ou automationObject.Range = Sheets("DATA").Range("R30')

  • Le code ci-dessous vous montrera que ce n'est pas la méthode Select qui force le rafraîchissement de l'écran, qu'elle soit appliquée à la feuille ou à une plage, et du coup que le souci ne peut venir que du fonctionnement intrinsèque de automationObject.SelectRange ou de automationObject.ResizeRange :

    VB:
    Sub Test()    Dim sngTimer As Single
        
        sngTimer = Timer + 3
        
        Application.ScreenUpdating = False
        
        With Sheets(2)
            .Select
            .Range("D8").Activate
            While Timer < sngTimer
                DoEvents
            Wend
        End With
        
        Sheets(1).Select
        
        Application.ScreenUpdating = True
    End Sub
Du coup, et malheureusement pour toi safranien, je crains qu'il ne te faille te résoudre à la version Canal+ sans décodeur, à moins que quelqu'un de la communauté PI n'ait une solution à t'apporter...

Bonne soirée à tous.
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil,

Donc l'original à la source
Avec un lien non testé vers la KB

NB: safraninien
Ton code d'il y a deux ans, il fonctionnait ou pas ?
 

safranien

XLDnaute Occasionnel
Bonsoir à tous

merci beaucoup Le_Sage pour ton apport sur le sujet. Je comprends donc que ça va être difficile pour ne plus voir ce changement de feuille.

Stapple1600, j'avais complètement oublié ce post, tu fais bien de me rafraichir la mémoire. Effectivement, avec cette version de code utilisé dans un autre fichier, je ne vois pas le changement de feuille. Du coup, j'en arrive à me dire que c'est dans la formulation des appels des fonctionnalités de l'addin PI qu'il y a peut être des différences qui font que lors de l'exécution du code, dans un cas on voit le changement de feuille et dans un autre non, ce qui n'incriminerait pas le code en lui-même.
Il faut que je creuse. Je reviens vers vous dès que c'est fait. Ce sera la semaine prochaine car je pars en week end prolongé dans quelques heures
Bonne soirée à tous
 

Discussions similaires

Réponses
4
Affichages
678
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…