2011-07-04 8 views
5

나는 VBA에서 프로그래밍하는 것에 다소 익숙하다. 나는 인터넷에서 약간의 물건을 읽었다. 그러나 couldnt는 내가 필요로하거나 cannt가 그것을 일하게하는 것을 발견한다. 내 문제 :엑셀 2010의 행 숨기기를위한 매크로

셀 B6의 워크 시트 '시트 1'에 값은 프로젝트가 악용 될 몇 년 동안 주어집니다.

워크 시트 '시트 2'및 '시트 3'에서 50 년 동안 스프레드 시트를 만들었습니다 (1 년에서 50 년, 7 번에서 56 번 행).

'시트 1'의 셀 b6에 1과 50 사이의 값을 입력하고 싶습니다. 값이 49 일 때 '시트 2'와 '시트 3'의 행 56을 숨기려고합니다. 값이 48 일 때 'sheet2'와 'sheet 3'에 행 55:56을 숨기고 싶습니다. 이 내가 지금까지 무엇을 가지고 있습니다하지만 난 B6 셀의 값을 변경할 때 내가이를 automaticly 작동시킬 수 어차피 :

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 

난 누군가가 내 문제를 도와 줄 수 있기를 바랍니다.

고맙습니다.

답변

4

거의 다 알았습니다. 활성 시트 내에서 행을 숨 깁니다. 괜찮아. 그러나 더 나은 방법은 그것이 어디에 있는지 추가하는 것입니다.

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

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

내가 했어 이상한 일이없이 발생된다. 자동으로 만드는 방법. 시트가 아닌 VBA 에디터의 시트 매크로에서 worksheet_change 이벤트를 사용해야합니다 (모듈이 아닌 편집기 1의 왼쪽에있는 시트 1을 두 번 클릭하십시오). 시트 내에서 편집기 바로 위의 드롭 다운 메뉴를 사용하십시오 2 개의 목록 상자). 왼쪽의 목록 상자에는 찾고있는 이벤트가 있습니다. 그 후에 그냥 매크로를 던지십시오. 아래 코드와 같아야합니다.

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

그게 전부입니다. 언제든지 무언가를 변경하면 매크로 test1이 실행됩니다.

+1

참고 : activesheet가 더 이상 시트를 참조하는 경우 이상한 일에 의해, 예를 들어, 당신은 때문에 통합 문서 또는 워크 시트 상황의 변화로한다는 것을 생각하지, 그때는 다른 시트 행을 숨기는 것 (52 : 55) 그것이 작동하지 않는 것처럼 보이게합니다. –

5

글쎄, 당신은 올바른 길을 걷고 있습니다, 베노!

VBA 프로그래밍과 관련하여 도움이되는 몇 가지 팁이 있습니다.

1- 상호 작용하려는 시트에 항상 명시 적 참조를 사용하십시오. 그렇지 않으면 Excel에서 코드가 활성 시트에 적용된다고 가정 할 수 있으며 결과적으로 스프레드 시트를 뒤틀리게됩니다.

2 lionz가 언급했듯이 Excel에서 제공하는 고유 한 방법으로 연락하십시오. 대부분의 속임수에 사용할 수 있습니다.

3 명시 적으로 변수를 선언하면 ... VBA에서 각 개체가 제공하는 메서드 목록이 표시됩니다. 그것은 인터넷에 파고 시간을 절약 할 수 있습니다.

지금,

가 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