Résolu Erreur 400

  • Auteur de la discussion Guil019
  • Date de début

Guil019

Nouveau membre
Bonjour,

Me lançant dans vba, j'aurai besoin de vos lumière pour m'aider sur une erreur que je rencontre.

Je travaille sur une extraction de données, il y a quelques cellules fusionner, j'ai donc une formule pour les défusionner, puis je voudrais coller la première ligne des colonnes 11 jusqu'à la fin sur la deuxième ligne.

Mais lorque ma formule sélectionne les colonne 11 jusqu'à la fin, j'ai l'erreur 400 qui apparait pendant l'exécution de la macro.

Quelqu'un peut-il m'aider ?

Code:
Sub test2()
ActiveSheet.Range("B1000").CurrentRegion.Select
Selection.UnMerge
ActiveSheet.Range("B1000").CurrentRegion.Columns("11:" & ActiveSheet.Range("B1000").CurrentRegion.Columns.Count).Select


End Sub

Merci
 

zeb

Modérateur
Bonjour et bienvenue.

Conformément au règlement particulier de la cat' programmation, voudrais-tu présenter ton bout de code entre balise
Code:
. Modifie donc ton message. Merci d'avance.

Ton code est suffisamment court pour que sa lecture ne soit pas impossible sans balise code. Mais n'en prends pas l'habitude. Evite d'utiliser la moindre commande ActiveTruc par principe. Si il peut y avoir un doute dans ce qui est actif, définit une variable qui pointe dessus une bonne fois au début de ton code. De la même façon, remplace tous les Truc.Select / Selection.Machin par directement des Truc.Machin. Ton code en sera plusclair mais aussi beaucoup plus rapide et efficace.

Quand tu as un problème avec une zone dont tu construis l'adresse, affiche-la juste avant. Pour ce faire, utilise debug.Print, MsgBox, ou un point d'arrêt pour explorer le résultat avant de l'exécuter. J'explique tout ça [url=http://www.presence-pc.com/forum/ppc/Programmation/tutoriel-excel-macro-debogage-sujet-5869-1.htm]ici[/url].

Alors, quelle adresse construis-tu quand ça plante ?
 

Guil019

Nouveau membre
Bonjour Zeb,

Voici ma macro


Code:
Sub test2() 
ActiveSheet.Range("B1000" ).CurrentRegion.Select 
Selection.UnMerge 
ActiveSheet.Range("B1000" ).CurrentRegion.Columns("11:" & ActiveSheet.Range("B1000" ).CurrentRegion.Columns.Count).Select 


End Sub

Je suis désolé mais étant novice, je n'ai pas compris comment afficher l'adresse qui pose problème.

Merci
 

zeb

Modérateur
MODO: Etre novice ne justifie en rien de ne pas avoir lu le règlement d'une part (merci de le faire et de modifier ton message)

HELPER: Etre novice ne justifie en rien de ne pas avoir lu l'article sur le débogage. Ajoute cette ligne à ton code pour "voir" ce que va faire ton programme :
Code:
MsgBox "11:" & ActiveSheet.Range("B1000" ).CurrentRegion.Columns.Count
 

Storos

Modérateur cochon
Staff
:lol:

Il suffisait d'éditer le message précédent... ;)

Et pour que la balise fonctionne, il faut que dans la deuxième balise, le mot "code" soit précédé de "/". La deuxième balise donc être [/code]. Tu vas voir: ton code aura tout de suite plus de classe... [:storos:6]

EDIT: grillé! (ce qui est le comble pour un cochon... :p)
 

Guil019

Nouveau membre
Zeb,

J'ai toujours l'erreur 400 qui s'affiche malgré cette ligne.

Comment puis-je modifier mon message d'origine pour que le code s'affiche correctement ?

Ps : Pourquoi dis tu que je n'ai pas lu l'article sur le debogage ?
 

Storos

Modérateur cochon
Staff

Il suffit de cliquer sur un des deux icônes d'édition de message (en bas à droite de ton message: les petites icônes qui représentent une petite pâge barrée d'un éclair).
 

zeb

Modérateur
Parce que je veux que tu me fiches une ligne de débogage à la ligne je-te-dirais-bien-où-mais-dans-la-mesure-où-ton-code-est-mal-présenté-(relire le règlement+mon message+celui de Storos)-je-ne-peux-point.

remplace tous les Truc.Select / Selection.Machin par directement des Truc.Machin
En plus tu ne fais pas ce qu'on te demande.

(en fait, tu fais ce que tu veux, hein, t'es libre quoi :o Moi, je ne t'impose rien.)

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

Dis, ne veux-tu pas faire, ne serait-ce que par politesse, ce que le règlement exige pour qu'on parle de ton problème de programmation plutôt que d'autres choses.

Je suis chiant parce que je suis modo :spamafote: [:zeb:6]
Mais j'aurais pour toi une solution quand le modérateur n'aura plus rien à dire ;)
 

Guil019

Nouveau membre
Voici donc la macro un peu raccourci :

Code:
Sub test2()
ActiveSheet.Range("B1000").CurrentRegion.UnMerge
ActiveSheet.Range("B1000").CurrentRegion.Columns("11:" & ActiveSheet.Range("B1000").CurrentRegion.Columns.Count).Select

End Sub
 

zeb

Modérateur
Meilleure réponse
Ahhhh ! :) :)

Bon. Alors je n'aime pas trop les ActiveTruc mais passons. Tant qu'on est dans les trucs désagréables, tu aurais pu nous dire à quelle ligne la macro plante :o (surtout que maintenant ton code est bien présenté, avec numéros de ligne ;) ) Comme le débogueur VB n'est pas toujours très prolixe sur ce point, penser à au moins dire :"Ca plante mais sur aucune ligne :(" - :D

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

Moi, je voudrais bien savoir ce que ce programme fait !
Alors voilà comment je m'y prends. J'ajoute des MsgBox partout, pour m'afficher chacune des valeurs qui va être utiliser :
Code:
MsgBox "ActiveSheet: " & ActiveSheet.Name
MsgBox "CurrentRegion: " & ActiveSheet.Range("B1000").CurrentRegion.Address
MsgBox "Colonnes : " & ActiveSheet.Range("B1000").CurrentRegion.Columns.Count
MsgBox "Adresse à sélectionner: " & "11:" & ActiveSheet.Range("B1000").CurrentRegion.Columns.Count
    
ActiveSheet.Range("B1000").CurrentRegion.UnMerge
ActiveSheet.Range("B1000").CurrentRegion.Columns("11:" & ActiveSheet.Range("B1000").CurrentRegion.Columns.Count).Select

Voilà, ça c'est du débogage ! (voir le topic sur le débogage pour savoir comment faire, en moins bourin ;) )

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

Comprends-tu mieux maintenant ce que je te disais ? Ligne 3, tu construis une adresse, qui commence par 11 et qui finit par un nombre de colonnes. Je ne pense pas que c'est ce que tu voulais. La preuve, regarde le résultat de Adresse à sélectionner:.

Oki. Définissons la zone que tu décris:
je voudrais coller la première ligne des colonnes 11 jusqu'à la fin sur la deuxième ligne
Colonne 11: K
Dernière colonne: IV
Source: K1:IV1 (première ligne)
Cible: K2:IV2 (seconde ligne)
Code:
Code:
Range("K1:IV1").Copy Destination:=Range("K2")
C'est tout.

Maintenant pourquoi Diable ( [:nyghost] ) mélangeais-tu le nombre de colonne d'une zone avec son adresse pour en faire un select ?
(T'es pas obligé de répondre à toutes mes questions ;) )
 

Guil019

Nouveau membre
Bonjour Zeb,

Effectivement j'ai compris mon erreur ! Et en plus ta formule "Copy Destination" est beaucoup plus courte que ce que j'allais faire !

J'ai deux questions cependant :

Comment puis-je "simpliflier" mon Active...Current... ? Puisque travaillant avec des extractions, la taille du tableau n'est jamais la même et je souhaite ne supprimer les cellules fusionnées que pour le tableau.

Deuxièmement, je n'ai pas compris un point du debogage car la ligne 3 me dit que j'ai 17 colonnes, ce qui est vrai mais la ligne 4 me dit que l'adresse à sélectionner est de 11:17 (ce sont biens les numéro de colonnes qui m'intéressent), je ne vois donc pas d'erreur avec ce msgbox.
Il comprend quand on lui dit colonne 11 alors qu'on a vu que mon erreur venait du fait que j'aurais dû mettre K

Je ne sais pas si je suis compréhensible.

Merci en tout cas.
 

zeb

Modérateur
1°) La commande ActiveSheet est toujours inutile quand on travaille avec une seule feuille, et il est prudent d'utiliser des variables pour désigner chaque feuille quand on travaille avec plusieurs feuilles. Pour le CurrentRegion, je n'en dis rien.

2°) Tu dois être dans un cas particulier, la région autour de ta cellule B1000 doit inclure la colonne A. Réfléchissons. Soit la zone D12:M18 pour CurrentRegion. Elle fait 10 colonnes de large. Je veux copier les colonnes K et suivantes (jusqu'à M, donc). Il me faut donc les colonnes 11 (K), 12 (L) et 13 (M). Avec ta logique, on se retrouve avec l'adresse 11:10 (10 étant le nombre de colonne de la zone). Ben non. Le 11 est bon, pas le 10.

Réfléchissons encore:
Code:
Dim mon_tableau As Range
Dim cell_prem As Range
Dim cell_dern As Range
Dim n As Long

Set mon_tableau = Range("B1000").CurrentRegion

' // La cellule en haut à gauche
Set cell_prem = mon_tableau.Cells(1)

' // Combien de cellules dans mon tableau ?
n = mon_tableau.Cells.Count
' // La cellule en bas à droite
Set cell_dern = mon_tableau.Cells(n)

Set cell_dern = mon_tableau.Cells(mon_tableau.Cells.Count) ' // <-- en condensé

' // Vérif
MsgBox "tableau  : " & mon_tableau.Address & vbCrLf & _
       "cellules : " & mon_tableau.Cells.Count & vbCrLf & _
       "première : " & mon_tableau.Cells(1).Address & vbCrLf & _
       "dernière : " & mon_tableau.Cells(n).Address & vbCrLf & "==================" & vbCrLf & _
       "à copier : " & Range(mon_tableau.Cells.Columns(10), mon_tableau.Cells.Columns(mon_tableau.Cells.Columns.Count)).Address
 

zeb

Modérateur
:)

------------------
Choisis la meilleure réponse pour mettre le topic au statut [résolu], si tu veux bien.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 170
Messages
6 718 795
Membres
1 586 469
Dernier membre
Minarii
Partager cette page
Haut