Feuille variable grâce à une cellule, dans macro

Résolu
Bonjour,

Microsoft Office 2007

j'ai la macro suivante:

Sub ajouter_un_produit()

Dim MaPlage As Range, Cel As Range

Set MaPlage = Sheets("ajout_produit_composant").Range("D3:D15")
For Each Cel In MaPlage 'pour toutes les cellules de la plage
If Cel.Value = "" Then 'si elle est vide alors
'message à l'utilisateur
MsgBox "La cellule : " & Cel.Address & " n'est pas remplie."
'sortie de la procédure
Exit Sub
End If
Next

Set MaPlage = Sheets("ajout_produit_composant").Range("G3:G15")
For Each Cel In MaPlage 'pour toutes les cellules de la plage
If Cel.Value = "" Then 'si elle est vide alors
'message à l'utilisateur
MsgBox "La cellule : " & Cel.Address & " n'est pas remplie."
'sortie de la procédure
Exit Sub
End If
Next
Set MaPlage = Sheets("ajout_produit_composant").Range("I12,I13")
For Each Cel In MaPlage 'pour toutes les cellules de la plage
If Cel.Value = "" Then 'si elle est vide alors
'message à l'utilisateur
MsgBox "La cellule : " & Cel.Address & " n'est pas remplie."
'sortie de la procédure
Exit Sub
End If

Next

Application.ScreenUpdating = False
Sheets("ajout_produit_composant").Range("D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15").Copy
Set Derligne = Sheets("tableau").Range("$A$65536").End(xlUp).Offset(1, 0)
Derligne.PasteSpecial Paste:=xlAll, Operation:=xlNone, Transpose:=True
Application.ScreenUpdating = False
Sheets("ajout_produit_composant").Range("G3,G4,G5,G6,G7,G8,G9,G10,G11,G12,G13,G14,G15,G16").Copy
Set Derligne = Sheets("tableau").Range("$A$65536").End(xlUp).Offset(0, 13)
Derligne.PasteSpecial Paste:=xlAll, Operation:=xlNone, Transpose:=True
Sheets("ajout_produit_composant").Range("D6,D7,D8,D10,D11,D12,D14,D15,G3,G4,G5,G6,G7,G8,G9,G10,G11,G12,G13,G14,G15,G16,I12,I13").ClearContents
Application.CutCopyMode = False

End Sub

Elle me permet de copier des cellules de la feuille ajout_produit_composant dans la feuille tableau et cela toujours à la fin de ce tableau.

Elle vérifie aussi qu'aucune case n'est vide sinon elle envoi un message, et stop l'execution de la macro.

Je suis novice au niveau des macros, et j'ai pu la faire grâce aux réponse sur ce forum, et je sais très bien qu'elle n'est peut être pas parfaite pour des connaisseurs. :)

Mon nouveau probleme est le suivant:

J'aimerais que la macro fasse ce travail en fonction de la feuille ou je lui indique de copier. Par exemple, dans la case I18 de la feuille ajout_produit_composant, je rentre le nom: Apple . J'aimerais donc ainsi que ma macro s'execute et fasse le travail vers la feuille Apple. Si je change le nom avant pour mettre Microsoft elle copiera ensuite vers la feuille Microsoft.

J'avais pensé mettre un truc du genre: Sheets(I18)Range ou Sheet(=I18)Range, mais cela ne marche pas. Bref je ne m'y connais pas et la bidouille ne fonctionne pas.

Merci d'avance si vous avez une solution :).

Cordialement,

ALex

2 réponses

  1. Bonjour,

    voici la résolution à ton problème :
    dim a as variant
    a= Sheets("ajout_produit_composant").range("I18")
    Sheets(a).select

    ==> a prendra la valeur de la cellule I18 de ta feuille
    sheets(a).select ==> sélectionnes la feuille nommée dans la variable a définie par ta feuille cellule I18
    0
    1. Merci :).

      Il faut que je le mette ou? car si je le met au début sa ne marche pas et en plein milieu non plus sa bug.
      0
      1. mets moi tout toncode vba ici ou bien ton fichier ou une copie de ton fichier dan cjoint.com
        Je te modifierais le code en fonction
        0
      2. Sub ajouter_un_produit()

        Dim MaPlage As Range, Cel As Range

        Set MaPlage = Sheets("ajout_produit_composant").Range("D3:D15")
        For Each Cel In MaPlage 'pour toutes les cellules de la plage
        If Cel.Value = "" Then 'si elle est vide alors
        'message à l'utilisateur
        MsgBox "La cellule : " & Cel.Address & " n'est pas remplie."
        'sortie de la procédure
        Exit Sub
        End If
        Next

        Set MaPlage = Sheets("ajout_produit_composant").Range("G3:G15")
        For Each Cel In MaPlage 'pour toutes les cellules de la plage
        If Cel.Value = "" Then 'si elle est vide alors
        'message à l'utilisateur
        MsgBox "La cellule : " & Cel.Address & " n'est pas remplie."
        'sortie de la procédure
        Exit Sub
        End If
        Next
        Set MaPlage = Sheets("ajout_produit_composant").Range("I12,I13")
        For Each Cel In MaPlage 'pour toutes les cellules de la plage
        If Cel.Value = "" Then 'si elle est vide alors
        'message à l'utilisateur
        MsgBox "La cellule : " & Cel.Address & " n'est pas remplie."
        'sortie de la procédure
        Exit Sub
        End If

        Next

        Application.ScreenUpdating = False
        Sheets("ajout_produit_composant").Range("D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15").Copy
        Set Derligne = Sheets("tableau").Range("$A$65536").End(xlUp).Offset(1, 0)
        Derligne.PasteSpecial Paste:=xlAll, Operation:=xlNone, Transpose:=True
        Application.ScreenUpdating = False
        Sheets("ajout_produit_composant").Range("G3,G4,G5,G6,G7,G8,G9,G10,G11,G12,G13,G14,G15,G16").Copy
        Set Derligne = Sheets("tableau").Range("$A$65536").End(xlUp).Offset(0, 13)
        Derligne.PasteSpecial Paste:=xlAll, Operation:=xlNone, Transpose:=True
        Sheets("ajout_produit_composant").Range("D6,D7,D8,D10,D11,D12,D14,D15,G3,G4,G5,G6,G7,G8,G9,G10,G11,G12,G13,G14,G15,G16,I12,I13").ClearContents
        Application.CutCopyMode = False

        End Sub

        Voila le code VBA, je sais il est un peu lourd ^^ j'ai mi en gras la partie que j'aimerais variable.
        0
      3. coucou,

        essaie ca :

        Sub ajouter_un_produit()

        Dim MaPlage As Range, Cel As Range
        dim a as variant

        Set MaPlage = Sheets("ajout_produit_composant").Range("D3:D15")
        For Each Cel In MaPlage 'pour toutes les cellules de la plage
        If Cel.Value = "" Then 'si elle est vide alors
        'message à l'utilisateur
        MsgBox "La cellule : " & Cel.Address & " n'est pas remplie."
        'sortie de la procédure
        Exit Sub
        End If
        Next

        Set MaPlage = Sheets("ajout_produit_composant").Range("G3:G15")
        For Each Cel In MaPlage 'pour toutes les cellules de la plage
        If Cel.Value = "" Then 'si elle est vide alors
        'message à l'utilisateur
        MsgBox "La cellule : " & Cel.Address & " n'est pas remplie."
        'sortie de la procédure
        Exit Sub
        End If
        Next
        Set MaPlage = Sheets("ajout_produit_composant").Range("I12,I13")
        For Each Cel In MaPlage 'pour toutes les cellules de la plage
        If Cel.Value = "" Then 'si elle est vide alors
        'message à l'utilisateur
        MsgBox "La cellule : " & Cel.Address & " n'est pas remplie."
        'sortie de la procédure
        Exit Sub
        End If

        Next

        a= Sheets("ajout_produit_composant").range("I18") 'la variable a = la valeur de la cellule I18 de la feuille ajout produit composant

        Application.ScreenUpdating = False
        Sheets("ajout_produit_composant").Range("D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15").Copy
        Set Derligne = Sheets(a).Range("$A$65536").End(xlUp).Offset(1, 0)
        Derligne.PasteSpecial Paste:=xlAll, Operation:=xlNone, Transpose:=True
        Application.ScreenUpdating = False
        Sheets("ajout_produit_composant").Range("G3,G4,G5,G6,G7,G8,G9,G10,G11,G12,G13,G14,G15,G16").Copy
        Set Derligne = Sheets(a).Range("$A$65536").End(xlUp).Offset(0, 13)
        Derligne.PasteSpecial Paste:=xlAll, Operation:=xlNone, Transpose:=True
        Sheets("ajout_produit_composant").Range("D6,D7,D8,D10,D11,D12,D14,D15,G3,G4,G5,G6,G7,G8,G9,G10,G11,G12,G13,G14,G15,G16,I12,I13").ClearContents
        Application.CutCopyMode = False

        End Sub
        0
      4. j'ai remplacé tableau par la variable a et j'ai donné la valeur à la variable a
        0
      5. Sa fonctionne :). Parfait, merci beaucoup mélanie. Cela me sera très utile ;).
        0