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 ...

15exempleoutils.xlsm (18.26 Ko)

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 Je prends donc note de toute remarque

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 !

Rechercher des sujets similaires à "range declaration variable"