2011-07-04 40 views
5

Tôi là người mới lập trình trong VBA. Tôi đọc một số nội dung trên internet nhưng tôi không thể tìm thấy những gì tôi cần hoặc không thể làm cho nó hoạt động. vấn đề của tôi:macro cho Ẩn hàng trong excel 2010

trong trang tính '1' trong ô B6 một giá trị được đưa ra trong bao nhiêu năm một dự án sẽ được khai thác.

trong trang tính 2 'và' trang tính 3 'tôi đã tạo bảng tính trong 50 năm (năm 1 đến năm 50; hàng 7 đến hàng 56).

trong ô b6 trong 'trang tính 1' tôi muốn nhập giá trị từ 1 đến 50. khi giá trị là 49 tôi muốn ẩn hàng 56 trong 'sheet2' và 'sheet 3'. khi giá trị là 48 tôi muốn ẩn các hàng 55:56 trong 'sheet2' và 'sheet 3', v.v. đây là những gì tôi đã nhận cho đến nay nhưng tôi không thể làm cho nó hoạt động lại khi tôi thay đổi giá trị trong ô 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 

tôi hy vọng ai đó có thể giúp tôi với vấn đề của tôi.

Cảm ơn bạn

Trả lời

4

Bạn gần như đã hiểu. Bạn đang ẩn các hàng trong trang tính đang hoạt động. đó là okay. Nhưng một cách tốt hơn sẽ là thêm nó ở đâu.

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

trở nên những điều kỳ lạ

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

tôi đã xảy ra mà không có nó. Để làm cho nó tự động. Bạn cần sử dụng sự kiện worksheet_change trong macro của bảng trong trình soạn thảo VBA (không phải mô-đun, bấm đúp vào trang tính1 ở phía bên trái của trình soạn thảo.) Trong trang tính đó, hãy sử dụng trình đơn thả xuống ngay phía trên trình soạn thảo (cần có 2 hộp danh sách). Hộp danh sách bên trái sẽ có các sự kiện bạn đang tìm kiếm. Sau đó chỉ cần ném vào vĩ mô. Mã này trông giống như mã bên dưới,

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

Vậy đó. Bất cứ khi nào bạn thay đổi một cái gì đó, nó sẽ chạy thử nghiệm macro1.

+1

Lưu ý: bằng những điều lạ, ví dụ, nếu trang hoạt động không còn đề cập đến trang tính mà bạn cho rằng, do thay đổi trong bảng tính hoặc ngữ cảnh trang tính, nó sẽ ẩn một số hàng trang tính khác (52 : 55) sẽ làm cho nó xuất hiện như thể nó không hoạt động. –

5

Vâng, bạn đang đi đúng hướng, Benno!

Có một số mẹo về lập trình VBA có thể giúp bạn.

1- Sử dụng các tham chiếu luôn rõ ràng cho trang tính bạn muốn tương tác. Nếu không, Excel có thể 'giả định' mã của bạn áp dụng cho trang tính đang hoạt động và cuối cùng bạn sẽ thấy mã này được thêm vào bảng tính của bạn.

2- Như đã đề cập, hãy liên hệ với các phương thức gốc mà Excel cung cấp. Bạn có thể sử dụng chúng trên hầu hết các thủ thuật của bạn.

3- Khai báo rõ ràng biến của bạn ... chúng sẽ hiển thị danh sách các phương thức mà mỗi đối tượng cung cấp trong VBA. Nó có thể tiết kiệm thời gian của bạn đào trên internet.

Bây giờ, chúng ta hãy có một mã dự thảo ...

Hãy nhớ mã này phải nằm trong đối tượng Trang tính Excel, như được giải thích bởi lionz. Nó chỉ áp dụng cho Bảng 2, tùy thuộc vào bạn để thích ứng với Bảng 2 và Bảng 3 theo cách bạn muốn.

Hy vọng điều đó sẽ hữu ích!

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 
Các vấn đề liên quan