message bloquant "le déplacement de cellules ... n'est pas autorisé"

Joël P

XLDnaute Nouveau
Bonjour à tous,

Nouveau membre, je vous sollicite car j'ai un problème bloquant et à caractère urgent.
Contexte : Suite à une réinstallation d'un système Windows 2008 R2 server et d'un office 2007,.
Problème : A l'ouverture d'un fichier Excel, utilisant des macros VBA en lien avec une base de données Oracle 11g en utilisant le pilote Oracle ODBC Driver, il y a systématiquement le message suivant "Le déplacement de cellules dans un tableau de votre feuille de calcul n'est pas autorisé". Ce OK message apparait x fois puis plante systématiquement Excel lorsque les données tentent de s'actualiser.
Avant la réinstallation du système, ce fichier fonctionnait sans pb.
J'ai cherché sur Internet, à quoi correspond ce message. Je n'ai pas trouver beaucoup de lien. J'ai tenté de convertir ne plage mais cela ne solutionne pas.
Auriez vous des idées ou des pistes?
Sauriez vous m'indiquer quel pourrait être le message d'erreur en anglais correspondant.

Merci à tous par avance pour vos réponses ou idées.
Joël.
 

Dranreb

XLDnaute Barbatruc
Bonsoir
Faites la chasse aux méthodes Insert et Delete des objets Range dans votre code. Elles sont interdites en plein milieu des plages mises sous forme de tableaux.
Il faut utiliser à la place les méthodes Add et Delete de la propriété ListRows de l'objet ListObject. Ou de la propriété ListColumns si c'est un problème d'insertion de colonne.
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir Joël P, Bernard,

Insert ne pose pas de problème sur un tableau Excel.

Une ligne entière du tableau est toujours insérée avec :
Code:
Private Sub CommandButton1_Click()
If Not Intersect(ActiveCell, ListObjects(1).DataBodyRange) Is Nothing Then ActiveCell.Insert
End Sub
Fichier joint.

Edit : mais si après Insert on précise le type d'insertion (1 ou 2) en effet il y a bug.

A+
 

Pièces jointes

  • Insertion(1).xlsm
    24.7 KB · Affichages: 34
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ahah!… Et la précision de xlShiftDown ou xlShiftToRight perturberait aussi seulement le processus de mise à jour du ListRows ?
Mais de toute façon pour insérer ou supprimer des lignes dans un tableau j'utilise directement les méthodes du ListRows. Ça me parait plus simple.
Par contre pour ajouter derrière la fin, selon ce qui est le plus pratique dans le contexte, je garnis parfois simplement de données les cellules qui suivent le tableau.
Mais j'ai en tout cas déjà rencontré des problèmes, notamment pour Copier/Insérer cellules copiées dans un tableau. Parce que sans les tableaux c'est comme ça que je faisais pour agrandir une plage nommée: je dupliquais la dernière ligne puis remplaçais le contenu de la dernière ainsi chassée par mes nouvelle donnée. Ça rectifiais toutes les références de nom ou de formules et même dans les variables Range d'un code, plus efficacement donc que les tableaux. Parce que sur le coup ça m'avais mis en rogne de constater que c'était interdit sur les tableaux, d'autant plus que si on avait fait un Set de la DataBodyRange dans une variable ou une propriété, celle si n'est pas rectifiée quand le tableau est agrandi par renseignement de la ligne qui suit. J'ai été obligé de programmer des instructions supplémentaires pour rectifier, lors de l'actualisation, la propriété Range PlgTablo de mon objet ComboBoxLiées quand il y a un tableau.
J'ai même toujours encore des commentaires traces de ce souci :
VB:
Public Sub Actualiser(Optional ByVal NouvellePlage As Object, Optional ByVal NbCol As Variant = 0, Optional ByVal Net As Boolean = False)
Rem. —— Prend en compte les données de la plage PlgTablo.
'       Elle doit être appelée au moins 1 fois après les Add, puis ensuite
'       à chaque fois que les colonnes spécifiées aux Add changent.
'   NouvellePlage: Optionnel: la nouvelle plage au cas où elle aurait changé de taille sans qu'il n'ait été
'       possible que celà soit noté dans sa référence (ajout après, au lieu de Copy/Insert de la dernière).
'       À ne pas préciser si c'est un tableau. Assumé auto, vu que c'est nécessaire (VBA Excel ne corrigeant plus la plage de lui même)
'   Net : Optionnel: demande à nettoyer les ComboBox de tout choix précédent.
Dim CBM As ComboBoxMmbr, i As Long
If Not NouvellePlage Is Nothing Then ' Pas besoin si dernière ligne copiée puis insérée devant elle même: PlgTablo corrigé automatiquement.
   Plage NouvellePlage, NbCol        ' Et avec les tableaux ? Ô stupeur, c'est interdit ! Et ils n'ont pas prévu le coup !
ElseIf Not ObjTablo Is Nothing Then  ' Mais ComboBoxLiées veille au grain :
   Set PlgTablo = Intersect(PlgTablo.EntireColumn, ObjTablo.DataBodyRange): End If
 
Dernière édition:

Statistiques des forums

Discussions
315 052
Messages
2 115 748
Membres
112 527
dernier inscrit
Chaperlipopette