[vba] variable objet....Non définie

Adamaro Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Dans le cadre de mon travail, je dois remplacer, dans une liste excel, une cellule par plusieurs cellules côte à côte.
Par exemple, remplacer toutes les cellules contenant F-035 par deux cellules contant L10 et L15 et toutes les cellules contant F-036 par trois cellules contenant L1, L2 et L8.

Etant débutant en vba, j'ai réussi à glâner quelques informations sur internet qui m'ont permises d'écrire un début de programme (pour un seul type de cellule):

Sub test()

Dim LocF035 As String
Dim Cell As Range

LocF035 = "F-035"

'Selection de la plage de cellules à remplacer
ActiveSheet.UsedRange.Select
ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Offset(0, 0).Select
ligne = ActiveCell.Row: colonne = ActiveCell.Column
Range(Cells(2, 4), Cells(ligne, colonne)).Select

'Test de chaque cellules de la sélection
For Each Bloc In Selection
'Recherche du code du local type F-035
Set Cell = Range(Cells(2, 4), Cells(ligne, colonne)).Find(LocF035, lookat:=xlWhole)
Cells(Cell.Row, Cell.Column).Select
Cells(ActiveCell.Row, ActiveCell.Column) = "L10"
Cells(ActiveCell.Row, ActiveCell.Column + 1) = "L15"
Next Bloc

End Sub

Lorsque je l'exécute, il m'indique "Variable objet ou variable de bloc With non définie" à la ligne "Cells(Cell.Row, Cell.Column).Select" malgré que le résultat final est correct (toutes mes cellules contant F-035 sont remplacées).

Le problème est que si je veux ajouter une deuxième recherche de type de cellule (F-036 par exemple), l'erreur ressurgit et les cellules F-036 sont à moitié remplacées.

Sub test()

Dim LocF035 As String
Dim LocF036 As String
Dim Cell As Range

LocF035 = "F-035"
LocF036 = "F-036"

'Selection de la plage de cellules à remplacer
ActiveSheet.UsedRange.Select
ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Offset(0, 0).Select
ligne = ActiveCell.Row: colonne = ActiveCell.Column
Range(Cells(2, 4), Cells(ligne, colonne)).Select

'Test de chaque cellules de la sélection
For Each Bloc In Selection
'Recherche du code du local type F-035
Set Cell = Range(Cells(2, 4), Cells(ligne, colonne)).Find(LocF035, lookat:=xlWhole)
Cells(Cell.Row, Cell.Column).Select
Cells(ActiveCell.Row, ActiveCell.Column) = "L10"
Cells(ActiveCell.Row, ActiveCell.Column + 1) = "L15"

'Recherche du code du local type F-036
Set Cell = Range(Cells(2, 4), Cells(ligne, colonne)).Find(LocF036, lookat:=xlWhole)
Cells(Cell.Row, Cell.Column).Select
Cells(ActiveCell.Row, ActiveCell.Column) = "L1"
Cells(ActiveCell.Row, ActiveCell.Column + 1) = "L2"
Cells(ActiveCell.Row, ActiveCell.Column + 2) = "L8"
Next Bloc
End Sub

J'ai tenté de stocker la position des cellules à remplacer dans deux variables de type Integer mais le problème persiste.
Mon but étant à la fin de pouvoir remplacer d'un coup tous les types de cellules de ma feuille (plus d'une vingtaine).

Si quelqu'un à une solution ou une autre méthode à me proposer ce serait fort sympathique.

Merci d'avance

5 réponses

lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Bonjour,
Je pense que ça ira mieux avec...
Sub TestB()
Dim Cel As Range
    For Each Cel In ActiveSheet.UsedRange
        If Cel.Value = "F-035" Then
            Cel = "L10": Cel.Offset(0, 1) = "L15"
        ElseIf Cel.Value = "F-036" Then
            Cel = "L1": Cel.Offset(0, 1) = "L2": Cel.Offset(0, 2) = "L8"
        End If
    Next Cel
End Sub

A+
3
Adamaro Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
Merci à toi!

Mais maintenant, on me demande de les présenter en ligne (et non plus en colonne). Le hic c'est que je ne dois pas ecraser les informations qui se trouvent dessous. Enfin en gros faut que je les insère.

Si quelqu'un à un tuyau à me donner je suis preneur.

Merci d'avance.
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Beh ont a tout les tuyaux que tu veux, encore faudrait-il préciser le diamètre :DD,

les présenter en ligne (et non plus en colonne). ?? la macro les met en ligne !
ne dois pas ecraser les informations qui se trouvent dessous ??
Un exemple de ton classeur façiliterait la compréhension.

L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
0
Adamaro Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
XD
En effet, un petit exemple s'impose^^
Voila un petit extrait de mon classeur:
   A         B              C            D        E        F    
1  bureau    chef service   RH Z4 04     F-035    
2  bureau    secrétariat    RH Z4 03     F-036    
3  bureau    double         RH Z4 06     F-035  

Les codes à remplacer se trouvent dans la colonne D.
Actuellement, la macro remplace ces codes en ajoutant des valeurs dans les cellules D, E, F etc..
Or maintenant, je dois les présenter en ligne.
Par exemple, lorsque la macro rencontrera "F-035" en D1, il remplacera la cellule D1 par "L10" puis la cellule D2 par "L15" tout en décalant les données se trouvant en dessous.
Comme je sais que je suis pas du tout doué en explication, voici un exemple du résultat final souhaité:
   A         B                C            D        E        F
1  bureau    chef service     RH Z4 04     L10    
2  bureau    chef service     RH Z4 04     L15    
3  bureau    secrétariat      RH Z4 03     F-036    
4  bureau    double           RH Z4 06     L10    
5  bureau    double           RH Z4 06     L15  


J'espère avoir été plus ou moins^^

Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Comme ça alors ?
Sub TestC()
Dim DerLig As Long, Lig As Long, LigDeb As Integer
    DerLig = ActiveSheet.Range("D65535").End(xlUp).Row
    LigDeb = 1 'Première ligne où commence les données.
    For Lig = DerLig To LigDeb Step -1
        Select Case Cells(Lig, 4)
        Case "F-035"    'remplacer la valeur de la cellule
            Cells(Lig, 4) = "L10": Rows(Lig + 1).Insert xlUp
            Rows(Lig).Copy Rows(Lig + 1): Cells(Lig + 1, 4) = "L15"
        Case "F-036"
            Cells(Lig, 4) = "L1": Rows(Lig + 1 & ":" & Lig + 2).Insert xlUp
            Rows(Lig).Copy Rows(Lig + 1 & ":" & Lig + 2): Cells(Lig + 1, 4) = "L2":: Cells(Lig + 2, 4) = "L8"
        End Select
    Next Lig
End Sub

A+
0