La methode range.select - VB/VBA/VBS - Programmation
Marsh Posté le 07-06-2006 à 09:44:14
euh voila mon code peut etre que ca vous aidera:
'Définition de la plage d'insertion
For i = 0 To (nombre_de_depot - 1) 'nombre dep -1 = 23
ligAlpha = CStr(lig_insertion + (nb_item_de_base * i))
If i = nombre_de_depot - 1 Then
plage = "A" + ligAlpha + ":" + "H" + ligAlpha + plage
Else
plage = "," + "A" + ligAlpha + ":" + "H" + ligAlpha + plage
End If
Next
Range("A1" ).Activate
Range(plage).Select 'ici ca plante
Selection.Insert Shift:=xlDown
en gros le range(plage) se retrouve avec "A1:H1,.....,"
en sachant qu'il y a 24 ligne ou se produisent l'insertion.
N'est on pas limité par le nombre de plage a utilisé avec la methosde range?
merci
lden
Marsh Posté le 12-06-2006 à 18:20:30
bonsoir,
Non, quoique VBA utilise dans ce cas Union, pas de limitation de principe.
Difficile de dire quoi que ce soit avec des bribes de codes : Une macro se compose en général d'un en-tête, de déclarations, d'un corps et se termine avec End Sub
De plus elle est sensible au contexte. Dans quel module est-elle implantée ? Quelle feuille a été activée ?
Il faut donc chercher les réponses dans ton environnement de travail, ou nous communiquer toute la macro.
De plus sur le fond ta macro semble un peu alambiquée : Pourquoi faire une sélection multiple pour insérer des lignes ?
A+
Marsh Posté le 14-06-2006 à 18:26:05
ok, le travail qu elon me demande est assez alambiqué je l'avoue mais bon!
je vais copier toute la macro::
Function plage_selection_region(lig_insertion As Integer, nombre_de_depot As Integer, nb_item_de_base As Integer _
, cas As Integer)
Dim plage As String
Dim plage_dest As String
'Ajout d'item
If cas = 1 Then
'Pour les régions
'Définition de la plage d'insertion
For i = 0 To (nombre_de_depot - 1)
ligAlpha = CStr(lig_insertion + (nb_item_de_base * i))
If i = nombre_de_depot - 1 Then
plage = "A" + ligAlpha + ":" + "H" + ligAlpha + plage
Else
plage = "," + "A" + ligAlpha + ":" + "H" + ligAlpha + plage
End If
Next
Range("A1" ).Activate
Range(plage).Select
Selection.Insert Shift:=xlDown
'Extension des formules
For i = 0 To (nombre_de_depot - 1)
If lig_insertion >= 2 And lig_insertion <= nb_item_de_base + 1 Then
ligAlpha = CStr(lig_insertion + (i + 1) + (nb_item_de_base * i))
ligAlphaDest = CStr(lig_insertion + i + (nb_item_de_base * i))
plage = "A" + ligAlpha + ":" + "H" + ligAlpha
plage_dest = "A" + ligAlphaDest + ":" + "H" + ligAlpha
iret = extension_formule(plage, plage_dest)
ElseIf lig_insertion >= 2 And lig_insertion = nb_item_de_base + 2 Then
ligAlpha = CStr(lig_insertion + (i - 1) + (nb_item_de_base * i))
ligAlphaDest = CStr(lig_insertion + i + (nb_item_de_base * i))
plage = "A" + ligAlpha + ":" + "H" + ligAlpha
plage_dest = "A" + ligAlphaDest + ":" + "H" + ligAlpha
iret = extension_formule(plage, plage_dest)
End If
Next i
'Retrait d'un item
ElseIf cas = 2 Then
For i = 0 To (nombre_de_depot - 1)
ligAlpha = CStr(lig_insertion + (nb_item_de_base * i))
If i = nombre_de_depot - 1 Then
plage = "A" + ligAlpha + ":" + "H" + ligAlpha + plage
Else
plage = "," + "A" + ligAlpha + ":" + "H" + ligAlpha + plage
End If
Next
Range(plage).Select
Selection.Delete Shift:=xlUp
End If
End Function
Function extension_formule(plage1 As String, plage2 As String)
Range(plage1).Activate
Range(plage1).Select
Selection.AutoFill Destination:=Range(plage2), Type:=xlFillDefault
'selection de la nouvelle plage crée et remplacement du nom qui a servi a la générer par le nom du nouveau dépôt
'Selection.Replace What:="X", Replacement:="cournon", LookAt:=xlPart, _
' SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
' ReplaceFormat:=False
End Function
et en gros quand le type veut rajouter un item il faut que ca aille s'implanter au bon endroit. en inserant les criteres de son item via un userform. le probleme ce qu'ici la plage est composée de 24 lignes donc ca bug!
merci
Marsh Posté le 14-06-2006 à 19:23:07
bonsoir,
Ton code est assez imbuvable et je ne crois pas que je pourrais m'y retrouver sans le classeur d'origine.
Toutefois j'ai essayé de tester de manière élémentaire des plages multi-zone et il n'est pas certain que tu puisses y arriver avec ce procédé.
Après de multiples expériences, il me semble que tu vas devoir revoir ta copie :
revois l'aide de Range, Collection (que tu peux retrouver dans ton VBA paragraphe union -méthode- (il faut fouiner un peu dans l'aide intuitive, mots clés range collection; sélectionner une rubrique collection range...)
ou en cherchant directement sur le mot union (méthode) dans Voir aussi : Référence à plusieurs plages...
A+
Marsh Posté le 14-06-2006 à 19:50:17
Sans même utiliser des macros, on a un message d'erreur si on essais de faire plus de 24 inserts en meme temps donc par macro ça donne la meme chose.
Ce que je ne comprends pas c'est pourquoi tu fais pas les insertion de ligne au fur et à messure au lieu de selectionner toutes les ligne concernées avant de faire l'insert ?
Marsh Posté le 14-06-2006 à 21:20:13
bonsoir,
Je viens de faire une insertion sur une sélection de 30 plages non contigues de 60 lignes au total et ça à bien fonctionné donc je ne vois pas de problème de ce coté là.
Il n'empêche que je suis quand même un peu de l'avis de fifiz sur la logique du truc, mais bon...
Je te propose de m'envoyer ton fichier (si c'est possible) pour que je l'analyse de plus près.
A+
Marsh Posté le 15-06-2006 à 09:29:28
salut les mecs ca fait plaisir de voir que mon pb est solvable!
Galopin je t'envoie ca de suite!
par ailleurs pour repondre a ta remarque fifiz je ne le fait pas d'un seul coup car apres j'etend des formules sur la ligne nouvellement crée.
or ca ne marche pas si tu selectionnes plusieurs plages discontinues...
Marsh Posté le 06-06-2006 à 16:40:37
salut
il y a il un nombre limité de plage de cellule que l'on peut selectionner grace a range(".....,..." ).select
car moi avec 24 plage ca m'affihce methode range of object Global has failed...
merci pr votre aide
++