web-dev-qa-db-ja.com

Excel 2010で行を非表示にするマクロ

私はVBAでプログラミングするのが初めてです。私はインターネットでいくつかのものを読みましたが、私は必要なものを見つけることができなかったか、それを機能させることができませんでした。私の問題:

セルB6のワークシート「シート1」では、プロジェクトが何年利用されるかについての値が示されています。

ワークシート「シート2」と「シート3」で、50年間(1年目から50年目、7行目から56行目)スプレッドシートを作成しました。

「シート1」のセルb6に1〜50の値を入力します。値が49の場合、「シート2」と「シート3」の行56を非表示にします。値が48の場合、「sheet2」と「sheet 3」の55:56行を非表示にします。これは私がこれまでに得たものですが、セル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

私は誰かが私の問題を助けてくれることを願っています。

ありがとうございました

8
Benno Houben

もうすぐだ。アクティブシート内の行を非表示にします。大丈夫です。しかし、より良い方法はそれがどこにあるかを追加することです。

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

なる

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

私はそれなしで奇妙なことが起こりました。自動化することも。 VBAエディターのシートのマクロ内でworksheet_changeイベントを使用する必要があります(モジュールではなく、エディターの左端にあるsheet1をダブルクリックします)。そのシート内で、エディター自体のすぐ上にあるドロップダウンメニューを使用します( 2つのリストボックス)。左側のリストボックスには、探しているイベントがあります。その後、マクロを投入します。以下のコードのようになります。

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

それでおしまい。何かを変更すると、マクロtest1が実行されます。

9
lionz

さて、あなたは正しい道を進んでいます、Benno!

VBAプログラミングに関して役立ついくつかのヒントがあります。

  1. 操作するシートへの明示的な参照を常に使用します。そうしないと、Excelがアクティブシートにコードが適用されていると想定し、最終的にスプレッドシートがねじ込まれているのがわかります。

  2. Lionzが述べたように、Excelが提供するネイティブメソッドに連絡してください。あなたはほとんどのトリックでそれらを使うかもしれません。

  3. 変数を明示的に宣言します。VBAで各オブジェクトが提供するメソッドのリストが表示されます。それはあなたのインターネットを掘る時間を節約するかもしれません。

それでは、ドラフトコードを作成しましょう...

Lionzで説明されているように、このコードはExcel Sheetオブジェクト内にある必要があります。これはシート2にのみ適用され、シート2とシート3の両方に好きなように適合させることができます。

それが役に立てば幸い!

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