Range et déclaration de variable
Bonjour,
Je suis sur un problème depuis la semaine dernière et je n'arrive pas à m'en extirper.
Cela ne va pas plaire mais j'essaie de travailler avec des cellules fusionnées, et donc j'écris une macro qui va défusionner, copier coller puis refusionner pour feinter.
Là n'est pas encore mon souci, j'envoie la partie de code qui me pose problème :
Sub Pkoisamarchpo()
Dim AireFus As Integer, MaVar As Integer, MaVar2 As Integer 'L1
MaVar = Application.VLookup(Range("Saisie!A3"), Range("Organes!A3:B140"), 2, False) 'renvoie un nombre 'L2
abc = Range(["D" & MaVar]).MergeArea.Count 'L3
MaVar2 = MaVar + abc - 1 'L4
Range(["D" & MaVar & ":" & "D" & MaVar2]).Select 'sélectionne la plage de cellules auparavant fusionnées, défusionnées entre temps 'L5
End Sub
La fonction Range n'a pas l'air d'apprécier mes variables, j'ai cette erreur :
Erreur d'exécution '1004':
La méthode 'Range' de l'objet '_Global' a échoué
J'ai cette erreur pour la L3 et la L5.
A noter que pour la variable MaVar, en passant par la fonction RECHERCHEV à partir d'une cellule excel ça fonctionnait et je n'avais que le problème en L5, donc je peux passer partiellement outre mais je ne comprends pas pour autant.
Quelqu'un saurait ce qui ne va pas ?
Merci d'avoir pris la peine de me lire et à bientôt 8)
Bonjour,
déjà, oublie les celllules fusionnées, ça fout la m...
à première vue; mais un fichier exemple serait bienvenu:
si la variable "mavar" renvoi" un texte, elle doit être déclarée "string" si c'est un nombre alors déclarée en "long"
essaie sans les déclarations dim et modifie
Bonjour
la feuille sur laquelle s'applique les instructions L3 et L5 doit être sélectionnée pour que ton code fonctionne. la variable mavar doit contenir un nombre après exécution de vlookup.
les instructions msgbox te permettront de contrôler ce qu'il en est.
Sub Pkoisamarchpo()
Dim AireFus As Integer, MaVar As Integer, MaVar2 As Integer 'L1
MaVar = Application.VLookup(Range("Saisie!A3"), Range("Organes!A3:B140"), 2, False) 'renvoie un nombre 'L2
msgbox mavar
msgbox activesheet.name
abc = Range("D" & MaVar).MergeArea.Count 'L3
MaVar2 = MaVar + abc - 1 'L4
Range("D" & MaVar & ":" & "D" & MaVar2).Select 'sélectionne la plage de cellules auparavant fusionnées, défusionnées entre temps 'L5
End Sub
Hello patrick et h2so4,
J'ai cru comprendre que les cellules fusionnées ne sont pas très recommandées effectivement ... mais le problème que j'ai ici est, je pense, d'un autre ordre.
J'ai essayé en modifiant les déclarations et en les supprimant, et la MsgBox me confirme que je suis sur la bonne feuille et me renvoie un nombre ...
J'ai une colonne avec simplement le numéro de chaque ligne pour m'aider à indexer, c'est ce numéro que va chercher "MaVar"
Edit: je vais voir pour faire un fichier d'exemple
Voilou j'ai construit un petit fichier similaire au mien, j'ai un formulaire de Saisie en feuille 2 et je dois pouvoir enregistrer les données en cliquant sur mon bouton.
Certaines données sont communes à plusieurs Outils c'est pourquoi j'ai des cellules fusionnées, et dans ma macro originale je fais également des copiers coller de forme etc ... Ce qui peut défusionner mes cellules... Que je refusionne par la suite.
Et contre toute attente ce n'est pas la fusion qui bloque !
Je vous invite à tester ma macro de saisie
EDIT : Ajout du fichier avec la fonction RECHERCHEV dans une cellule appelé ligne_outil, cela fait moins d'erreurs, je conserve l'erreur quand j'essaie de sélectionner ...
bonsoir,
J'ai pas creusé du tout ni ouvert tes pièces jointes mais déjà :
Range("Saisie!A3") et...
Range("Organes!A3:B140")... me semble pas glop du tout !
la syntaxe VBA c'est :
Worksheets("Saisie").Range("A3")
Worksheets("Organes").Range("A3:B140")
A+
Au risque de me répéter et sans voir examiné le code, les cellules fusionnées sont à proscrire
Bonjour,
j'ajouterai :
Range("C" & MaVar)
et non
Range(["C" & MaVar])
Et si tu utilises la 1ère cellule de ta fusion pas besoin de défusionner/refusionner :
Range("C" & MaVar).Offset(-AireFus + 1) = Sheets("Saisie").[B8]
Et déclare tes variables pour les lignes As Long.
As Integer peut être parfois un peu court, et comme de toute façon vba n'a pas d'Integer à proprement parlé il les convertit en Long.
Au lieu d'être plus rapide du coup c'est plus lent. Pas vraiment mesurable mais bon, autant ne pas s'embêter inutilement avec des Integer.
eric
Bonjour,
Merci à tous de vous être penchés sur le problème et mention spéciale à eric parce que ... Omg c'était à cause des crochets en trop.
J'avais oublié de préciser que je commence juste le code en vba
Et j'ai été induit en erreur par le fait qu'on met des crochets lorsqu'on fait référence à une cellule !
Ensuite la méthode que tu me proposes eric est très simplificatrice, mais j'utilise le copier coller avec conservation de la mise en forme source, d'ailleurs c'est ce point précis qui défusionne mes cellules j'ai l'impression. Car je veux conserver un texte en italique, ou un remplissage de cellule ...
Si je n'avais pas besoin de conserver la mise en forme voici à quoi ressemblerait mon code pour une boucle (Il faut bien noter les bonnes choses):
If Range("C8") <> 0 Then
AireFus = Range("D" & MaVar).MergeArea.Count
Worksheets("Organes").Range("D" & MaVar).Offset(AireFus - 1) = Sheets("Saisie").[C8]
Range("C8").Select
Application.CutCopyMode = False
Selection.ClearContents
End If
Code que je ne peux donc pas utiliser
Je mets le sujet en résolu mais si quelqu'un a une idée supplémentaire ce n'est pas de refus
EDIT : Je place ici mon code pour la boucle la plus longue, ça peut toujours intéresser quelqu'un
If Range("C15").Interior.Pattern <> xlSolid Or Range("C15").Interior.ColorIndex <> xlAutomatic Or Range("C15") <> "" Then
Range("C15").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Organes").Select
If Range("H" & MonIndex).MergeArea.Count > 1 Then
MaVar = 1
AireFus = Range("H" & MonIndex).MergeArea.Count
End If
Range("H" & MonIndex).Select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Selection.Merge
If Range("H" & MonIndex).MergeArea.Count = 1 Then
MaVar2 = 1
End If
If MaVar = 1 And MaVar2 = 1 Then
Range("H" & MonIndex & ":" & "H" & (MonIndex + AireFus - 1)).Merge
End If
MaVar = 0
MaVar2 = 0
Sheets("Saisie").Select
Range("C15").Select
Selection.ClearContents
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ColorIndex = xlAutomatic
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End If
Re,
si on peut tout reprendre j'aurai bien vu un truc comme ça :
Dim pl As Range, c As Range
Set pl = Sheets("Outils").[A:A].Find([A3].Value, LookIn:=xlValues, lookat:=xlWhole)
If Not pl Is Nothing Then
Set pl = pl.Offset(, 2).MergeArea
Set c = Sheets("Saisie").[B8]
With pl
.Value = c
.Interior.Color = c.Interior.Color
With .Font
.Color = c.Font.Color
.FontStyle = c.Font.FontStyle
End With
' etc
End With
End If
eric
Salut eric,
Merci encore pour ta solution, ça commence à se complexifier !
Je me penche dessus, l'offset c'est magique !