web-dev-qa-db-fra.com

macro pour Masquer les lignes dans Excel 2010

Je suis un peu nouveau dans la programmation en VBA. J'ai lu des trucs sur Internet mais je n'ai pas trouvé ce dont j'avais besoin ou je n'ai pas pu le faire fonctionner. mon problème:

dans la feuille de calcul "feuille 1" de la cellule B6, une valeur est donnée pour combien d'années un projet sera exploité.

dans les feuilles de calcul "feuille 2" et "feuille 3", j'ai fait une feuille de calcul pour 50 ans (de l'année 1 à l'année 50; ligne 7 à ligne 56).

dans la cellule b6 de la "feuille 1", je souhaite entrer une valeur comprise entre 1 et 50. lorsque la valeur est 49, je souhaite masquer la ligne 56 dans "feuille 2" et "feuille 3". lorsque la valeur est 48, je veux masquer les lignes 55:56 dans 'sheet2' et 'sheet 3', et ainsi de suite. c'est ce que j'ai obtenu jusqu'à présent, mais je ne peux pas le faire fonctionner automatiquement lorsque je change la valeur dans la cellule B6:

Sub test1()
    If Range("sheet1!B6") = 50 Then
    Rows("52:55").EntireRow.Hidden = False
    Else
    If Range("sheet1!B6") = 49 Then
    Rows("55").EntireRow.Hidden = True
    Else
    If Range("sheet1!B6") = 48 Then
    Rows("54:55").EntireRow.Hidden = True

    End If: End If: End If:

    End Sub

j'espère que quelqu'un peut m'aider avec mon problème.

Je vous remercie

8
Benno Houben

Vous l'avez presque compris. Vous masquez les lignes dans la feuille active. ce qui est bien. Mais une meilleure façon serait d'ajouter où elle se trouve.

Rows("52:55").EntireRow.Hidden = False

devient

activesheet.Rows("52:55").EntireRow.Hidden = False

j'ai eu des choses étranges sans elle. Quant à le rendre automatique. Vous devez utiliser l'événement worksheet_change dans la macro de la feuille dans l'éditeur VBA (pas les modules, double-cliquez sur la feuille sheet1 à l'extrême gauche de l'éditeur.) Dans cette feuille, utilisez le menu déroulant juste au-dessus de l'éditeur lui-même (il devrait y avoir 2 listes). La zone de liste à gauche contient les événements que vous recherchez. Après cela, lancez simplement la macro. Il devrait ressembler au code ci-dessous,

Private Sub Worksheet_Change(ByVal Target As Range)
test1
end Sub

C'est tout. Chaque fois que vous modifiez quelque chose, il exécutera la macro test1.

9
lionz

Eh bien, tu es sur la bonne voie, Benno!

Il y a quelques conseils concernant la programmation VBA qui pourraient vous aider.

  1. Utilisez des références toujours explicites à la feuille avec laquelle vous souhaitez interagir. Sinon, Excel peut `` supposer '' que votre code s'applique à la feuille active et, éventuellement, vous le verrez visser votre feuille de calcul.

  2. Comme Lionz l'a mentionné, contactez les méthodes natives qu'Excel propose. Vous pouvez les utiliser sur la plupart de vos tours.

  3. Déclarez explicitement vos variables ... elles afficheront la liste des méthodes proposées par chaque objet dans VBA. Cela pourrait vous faire gagner du temps à creuser sur Internet.

Maintenant, nous allons avoir un projet de code ...

N'oubliez pas que ce code doit se trouver dans l'objet Feuille Excel, comme expliqué par lionz. Il ne s'applique qu'à la feuille 2, à vous de l'adapter à la fois à la feuille 2 et à la feuille 3 de la manière que vous préférez.

J'espère que ça aide!

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim oSheet As Excel.Worksheet

    'We only want to do something if the changed cell is B6, right?
    If Target.Address = "$B$6" Then

        'Checks if it's a number...
        If IsNumeric(Target.Value) Then

            'Let's avoid values out of your bonds, correct?
            If Target.Value > 0 And Target.Value < 51 Then

                'Let's assign the worksheet we'll show / hide rows to one variable and then
                '   use only the reference to the variable itself instead of the sheet name.
                '   It's safer.

                'You can alternatively replace 'sheet 2' by 2 (without quotes) which will represent
                '   the sheet index within the workbook
                Set oSheet = ActiveWorkbook.Sheets("Sheet 2")

                'We'll unhide before hide, to ensure we hide the correct ones
                oSheet.Range("A7:A56").EntireRow.Hidden = False

                oSheet.Range("A" & Target.Value + 7 & ":A56").EntireRow.Hidden = True

            End If

        End If

    End If

End Sub
6
Tiago Cardoso