Microsoft 365 VBA test : si la ou les colonnes à côté sont masquées, les enjamber

Viro_Major

XLDnaute Nouveau
Bonjour, suite à un event de changement de valeur, j’aimerais que le curseur se place sur la cellule de la première colonne à droite visible (affichée et non masquée)

Exemples :
* cellule C3 active, colonnes D et E masquées à détecté alors je veux sélectionner F3
* cellule C3 active, colonne D affichée (non masquée), alors sélectionner D3
* cellule C3 active, colonne D masquée et E affichée, alors sélectionner E3

Le bout de code devrait être générique pour fonctionner sur une plage de cellule, genre C3:Z20

Je n’arrive qu’à coder un embryon de ce dont j’ai besoin. Merci d’avance pour toute aide
 

soan

XLDnaute Barbatruc
Inactif
@Viro_Major

ton post #15 :
« hum ok pour le Else, donc je le décolle : d’un espace pour lui redonner son sens originel ?
edit: non, ça se recolle, donc je supprime au lieu de ça »

exact, ça sert à rien de « décoller » le signe « : » car il se remet contre le « Else » ;
donc il faut supprimer le signe « : », mais revoir aussi la logique de l'ensemble !

j'ai réécrit toute la fin de ta sub ainsi :

VB:
    If col > 3 And col < 64 Then
      If col = 17 Then .Offset(1, -4).Select Else .Offset(, 1).Select
      GoTo 1 'pas Exit Sub !! car il faut réactiver les événements !!
    End If
    Application.ScreenUpdating = 0: Application.EnableEvents = 0
    If col = 56 And lig > 4 And lig < 172 Then
      .Value = .Value - .Offset(, -1)
      If lig = 171 Then .Offset(-166, 1).Select Else .Offset(, 1).Select
    End If
1   Application.EnableEvents = -1
  End With
End Sub
c'est seulement une réécriture syntaxiquement correcte et plus optimisée,
mais pour l'exécution, j'peux pas t'garantir que ça te donnera le résultat
que tu attends ! au besoin, tu devras apporter des corrections !


soan
 

soan

XLDnaute Barbatruc
Inactif
@Staple1600, @Viro_Major

tu as écrit : « je vois souvent des Dim DerLig As Integer »

c'est une TRÈS GROSSE erreur !!!

comme le nombre maxi d'un Integer est 32 767, il y aura un
plantage GARANTI sur ce code VBA :


DerLig = Cells(Rows.Count, 1).End(xlUp).Row

si n° dernière ligne utilisée >= 32 768

---------------------------------------------------------------------

si tu vois : « Dim lig As Integer » puis : lig = ActiveCell.Row

c'est aussi un plantage GARANTI si ligne active >= 32768

---------------------------------------------------------------------

si lig est utilisé dans une boucle « limitée », là oui,
tu peux mettre Integer ; ou même Byte ; exemple :

VB:
Sub Essai()
  Dim lig As Byte
  For lig = 2 To 20
    '...
  Next lig
End Sub
rappel : pour la plage Byte, maxi = 255, donc l'indice de
fin de boucle ne doit pas dépasser 255, sinon plantage !


---------------------------------------------------------------------

tu pourrais dire : « la plupart des fichiers ont moins de 5 000
lignes, donc ça n'atteindra jamais 32 768 ! »

tu as raison, mais comment savoir la quantité de données
réelle du vrai fichier de l'utilisateur ? quels sont ses vrais
besoins ? même s'il a moins de 32 768 lignes aujourd'hui,
peut-être que dans un mois ou deux ça dépassera cette
limite fatidique ? et si oui, plantage alors que tout avait
bien marché jusque là !


---------------------------------------------------------------------

enfin, même si l'utilisateur n'utilise jamais plus de 5 000
lignes, le cas de ActiveCell.Row mentionné plus haut
fera quand même un plantage si la cellule active est
sous la ligne 32 767 !


soan
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re,

soan
précisions
Quand je dis: je vois
C'est sur le forum ou les forums (mais pas dans mes codes VBA)
(Ce n'est pas ce que je fais puisque comme écrit précédemment
Quand il s'agit de ligne et colonne, je dimensionne en Long
Ce qui m'évite d'éventuels déboires.

Mais tes explications du message#22, si elles ne m'apprennent rien, serviront aux futurs lecteurs du fil.
;)
 

Discussions similaires