макрос для скрытия строк в Excel 2010 - PullRequest
8 голосов
/ 05 июля 2011

Я немного новичок в программировании на VBA.Я прочитал кое-что в Интернете, но я не мог найти то, что мне нужно, или не мог заставить его работать.моя проблема:

на листе «лист 1» в ячейке B6 указано значение, сколько лет будет использоваться проект.

на листах «2» и «лист 3» iсоздал таблицу на 50 лет (с 1 по 50; с 7 по 56).

в ячейке b6 на «листе 1». Я хочу ввести значение от 1 до 50. Когда значение равно 49я хочу скрыть строку 56 в «sheet2» и «sheet 3».когда значение равно 48, я хочу скрыть строки 55:56 в «sheet2» и «sheet 3» и так далее.это то, что я получил до сих пор, но я не могу заставить его работать автоматически, когда я изменяю значение в ячейке 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

я надеюсь, что кто-то может помочь мне с моей проблемой.

СпасибоВы

Ответы [ 2 ]

9 голосов
/ 05 июля 2011

Ты почти понял. Вы прячете строки в активном листе. это нормально. Но лучше было бы добавить, где это.

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

становится

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

У меня были странные вещи без этого. Что касается того, чтобы сделать это автоматически. Вам нужно использовать событие worksheet_change в макросе листа в редакторе VBA (не в модулях, дважды щелкните на sheet1 слева от редактора). На этом листе используйте выпадающее меню чуть выше самого редактора (там должно быть 2 списка). В списке слева будут события, которые вы ищете. После этого просто добавьте макрос. Он должен выглядеть так, как показано ниже:

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

Вот и все. Каждый раз, когда вы что-то меняете, он запускает макрос test1.

6 голосов
/ 05 июля 2011

Ну, ты на правильном пути, Бенно!

Есть несколько советов относительно программирования на VBA, которые могут вам помочь.

  1. Используйте всегда явные ссылки на лист, с которым вы хотите взаимодействовать. В противном случае Excel может «предположить», что ваш код применяется к активному листу, и в конечном итоге вы увидите, что ваша таблица испортилась.

  2. Как уже упоминался lionz, свяжитесь с нативными методами, которые предлагает Excel. Вы можете использовать их на большинстве ваших приемов.

  3. Явно объявите ваши переменные ... они покажут список методов, которые каждый объект предлагает в VBA. Это может сэкономить ваше время, копаясь в Интернете.

Теперь давайте наберем код ...

Помните, что этот код должен находиться внутри объекта Excel Sheet, как объяснил lionz. Это относится только к Листу 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...