XL 2016 Shape qui ne s'affiche pas

ya_v_ka

XLDnaute Impliqué
Bonjour le monde,

Mon souci du jour :

J'ai créé une macro qui met un certain temps. Afin de faire savoir que tout va bien, au début de l'exécution j'affiche un shape (.visible = true), existant mais masqué sur la feuille au départ, et le re-masque juste à la fin du traitement.
En pas par pas tout fonctionne à merveille, mais lorsque la macro tourne normalement ça ne marche pas !
J'ai rajouté un .screenupdating = true pour être sûr, j'ai essayé avec un wait, un sleep, des beep, rien n'y fait !

Si quelqu'un a une idée ?

Merci d'avance

Ya'v
 

ya_v_ka

XLDnaute Impliqué
C'est très couteux en tout cas. Au point qu'on peut partir en pratique du principe que 10000 modifications de valeurs d'une seule cellule chaque fois, et bien c'est 10000 fois plus long que de décharger un tableau dynamique de 10000 postes dans une plage de 10000 cellules !

Je me suis mal exprimé… C'est pas le pire dans mon fichier ! À part pour l'inventaire unique, je ne traite au max qu'environ 20 à 50 lignes sur 10 colonnes...
 

Dranreb

XLDnaute Barbatruc
… dans des tableaux dynamiques, j'espère, pas dans des plages de cellules n'est ce pas ? Ça vous le faites seulement tout à la fin, quand le tableau est constitué, vous versez en une seule instruction tout le tableau dans la plage ?
 

Dranreb

XLDnaute Barbatruc
Rien ne va alors ?
Pour le créer, déjà il est souhaitable de le déclarer avec deux parenthèses, ouvrante et fermante, derrière son nom. Mais surtout, s'il ne peut être obtenu d'Excel, de lui attribuer des dimensions par une instruction Redim
Pour le remplir, on accède à chacun de ses éléments par son nom suivi des indices entre parenthèses. L'accès à un élément de tableau est des dizaines voire des centaines de milliers de fois plus rapide que l'accès à une cellule.
Quand au chargement et déchargement c'est facile: la propriété Value d'un Range de plusieurs cellules est précisément directement un tableau à 2 dimensions partant de 1. De simples affectations du tableau tout entier suffisent donc.
Après chargement depuis une plage, Ubound(Tablo, 1) donne son nombre de lignes et Ubound(Tablo, 2) son nombre de colonnes.
 

Dranreb

XLDnaute Barbatruc
Le déclarer avec deux parenthèses: Dim Tablo()
L'obtenir d'Excel: voir plus bas: son chargement par affectation de la propriété Value d'un Range représentant une plage de plusieurs cellules (ça redimensionne le tableau au nombre de lignes et de colonne de la plage, alors dans ce cas pas besoin de s'occuper du Redim).
Lui attribuer des dimensions (pour un tableau résultant à produire, donc): Redim Tablo(1 To 10000, 1 To 50)
 
Dernière édition:

ya_v_ka

XLDnaute Impliqué
Hello,

Effectivement c'est rapide… 3 minutes --> mémoire insuffisante --> plantage machine… j'ai rarement fait aussi vite !!! Et ça après avoir essayer de trouver des exemples pendant passé 1 heure !

VB:
Sub MaSubEssai()
Dim i As Integer, j As Integer
Dim EssaiTablo()
ReDim EssaiTablo(127, 8)
    For i = 0 To UBound(EssaiTablo, 1)
        For j = 0 To UBound(EssaiTablo, 2)
            EssaiTablo(i, j) = Range(j + 1 & ":" & i + 1)
        Next j
    Next i
    MsgBox EssaiTablo(24, 3).Value
End Sub

Et ça juste pour le charger, alors quand faudra le suralimenter, travailler, trier, grouper, filtrer, et déverser dans un ordre différent ?!?!?!?

Ya'v
 

Dranreb

XLDnaute Barbatruc
N'importe quoi. Ne plus utiliser du tout ni Range ni Cells ni Evaluate à l'intérieur des boucles, seulement à l'extérieur. Au début, pour charger les tableaux à prendre en entrée, et à la fin pour décharger les tableaux résultants. Dans les boucles uniquement travailler avec les éléments des tableaux.
Pour charger le EssaisTablo, pas besoin de Redim, ni de boucle, simplement faire une seule instruction, par exemple EssaiTablo = Cells(1, "A").Resize(128, 9).Value
Remarque: Excel ne le redimensionnera pas 0 To 127, 0 To 8 mais 1 To 128, 1 To 9.
 
Dernière édition:

ya_v_ka

XLDnaute Impliqué
N'importe quoi. Ne plus utiliser du tout ni Range ni Cells ni Evaluate à l'intérieur des boucles, seulement à l'éxtérieur. Au début, pour charger les tableaux à prendre en entrée, et à la fin pour décharger les tableaux résultants. Dans les boucles uniquement travailler avec les éléments des tableaux.

Si je ne dis pas au tableau quelles infos il doit stocker, comment il va le savoir ? EssaiTablo(i, j) = Range(j + 1 & ":" & i + 1)
 

ya_v_ka

XLDnaute Impliqué
Pas bon non plus :

EssaiTablo = Range("A1:H127").Value

EssaiTablo(127,8) = Range("A1:H127").Value

Range("A1:H127").Copy
EssaiTablo.Paste
...

Et sinon la plupart des tutos traitent info par info

essaitablo(1,1)= range("A1")
essaitablo(1,2)= range("B1")
….

Autant ressortir le crayon, la gomme et dactylographier le tout !

Si quelqu'un connaît un tuto qui parle le français débutant… je suis preneur ?

OK, réussi à charger et afficher ma msgbox… pour la suite… demain.

Merci et
Bonne nuit

Ya'v
 
Dernière édition:

ya_v_ka

XLDnaute Impliqué
Bonjour,

En effet, c'est mon .value pour récupérer qui était faux...

Par contre je m'égare et la discussion n'a plus rien à voir avec la question de départ et le titre… alors je vais commencer, si nécessaire, un nouveau poste...

Merci à tous

Ya'v
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 947
Membres
101 849
dernier inscrit
florentMIG