[Trợ giúp] Hiển thị số dòng và Sheet tương ứng với số lựa chọn trong DataList (1 người xem)

  • Thread starter Thread starter quyenpv
  • Ngày gửi Ngày gửi

Người dùng đang xem chủ đề này

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
729
Được thích
101
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Em có 1 vấn đề như sau nhờ anh chị trên Forum giúp đỡ
Em có 1 file trong đó em có tạo khoảng 10 tên công trình và mã công trình tương ứng và 10 Sheet nhập số liệu cho các công trình trên. Nếu để hiển thị cả 10 công trình nhìn sẽ rất dài nên em nghĩ tạo 1 Datalist hiển thị số 10 công trình đó, - Nếu chọn số lượng 1 công trình hiển thị thì dòng bên dưới chỉ hiện thị 2 dòng tên, mã của 1 công trình và chỉ hiển thị Sheets"Input_1" đồng thời ẩn các Sheets còn lại
- Nếu chọn số lượng 2 công trình thì hiển thị 2 công trình tương ứng với 2 dòng tên, mã của 2 công trình và hiển thị Sheets"Input_1" và Sheets"Input_2" đồng thời ẩn các Sheets còn lại

Nhờ anh chị hướng dẫn giúp với ạ +-+-+-++-+-+-++-+-+-++-+-+-+
 

File đính kèm

Các bạn ơi giúp mình với
 
Upvote 0
Tên 1 và mã 1 chỉ là tên công trình 1 ầ mã công trình thôi. Cái này không quan trọng
Nếu [C5]=1 thì hiện 2 dòng là Tên 1 và mã 1. Hiện Sheet Input_1 còn lại ẩn các Sheet Input khác
Nếu [C5]=2 thì hiện 4 dòng trong đó Tên 1, mã 1 và Tên 2, mã 2. Hiện Sheet Input_1 và Input_2 còn lại ẩn các Sheet Input khác
.....
 
Upvote 0
Tên 1 và mã 1 chỉ là tên công trình 1 ầ mã công trình thôi. Cái này không quan trọng
Nếu [C5]=1 thì hiện 2 dòng là Tên 1 và mã 1. Hiện Sheet Input_1 còn lại ẩn các Sheet Input khác
Nếu [C5]=2 thì hiện 4 dòng trong đó Tên 1, mã 1 và Tên 2, mã 2. Hiện Sheet Input_1 và Input_2 còn lại ẩn các Sheet Input khác
.....
Nhưng một khi người ta đã viết code hộ bạn thì người ta phải có những tên đó để "điền vào" code. Nếu bạn không cung cấp thì người ta sẽ phải tự tạo. Nhưng những tên tự tạo đó bạn không không thể "bê" vào tập tin thực của mình, đúng không? Bạn sẽ phải thay code tự tạo các tên đó bằng code của mình để lấy các tên đó từ "nguồn" nào đó. Bạn có thể tự làm như thế không hay lúc đó "nhỏ giọt" thêm yêu cầu sửa code để lấy các tên kia?

Ít ra bạn phải nói các tên kia có ở vùng vd. D100:E120 (D _ Tên, E Mã) hoặc ở tập tin trên đĩa "c:\hehe.txt", hoặc trên server www.ten.ma.com

Nếu theo lôgíc đó thì khi chọn 5 thì hiện Tên 1, mã 1, ..., Tên 5, mã 5. Hiện Sheet Input_1, ... Input_5?
 
Upvote 0
Vâng cám ơn anh, cái tên1 và mã 1 này có thể thay đổi do mình nhập vào khi làm công trình nào đó anh ạ.
Chắc phải dùng vùng để quy định chứ không thể dùng theo tên và mã được còn Sheet Input_1 đến Input_5 là cố định
Thanks anh chị
 
Upvote 0
Vâng cám ơn anh, cái tên1 và mã 1 này có thể thay đổi do mình nhập vào khi làm công trình nào đó anh ạ.
Chắc phải dùng vùng để quy định chứ không thể dùng theo tên và mã được còn Sheet Input_1 đến Input_5 là cố định
Thanks anh chị

Thế thì nhập luôn đi, bạn ơi,
không ai giúp mình khi chính mình chưa chuẩn bị đủ số liệu, thế ha
 
Upvote 0
Vâng cám ơn anh, cái tên1 và mã 1 này có thể thay đổi do mình nhập vào khi làm công trình nào đó anh ạ.
Chắc phải dùng vùng để quy định chứ không thể dùng theo tên và mã được còn Sheet Input_1 đến Input_5 là cố định
Thanks anh chị

Bạn vẫn không chịu chỉ ra nguồn Tên và Mã. Thôi tôi tự cho là Tên và Mã ở 2 cột F và G bắt đầu từ dòng 2.

Trong Module1 có Sub Reset. Bất cứ khi nào cần trở lại trạng thái khi chưa chọn số công trình nào thì vào VBE và tự chạy Sub này 1 lần. Khi nào cần? vd. khi sửa lại tên các công trình, mã. Tôi không giới hạn số công trình là 5 vậy bạn có thể tạo thêm sheet Input_6, Input_7 hoặc xóa bớt vài công công trình. Ở mỗi thời điểm, tức khi thêm hoặc xóa sheet, thì ngoài sheet "TS" thì các sheet khác phải có tên "Input_xyz" trong đó xyz là các số liên tục bắt đầu từ 1. Khi thêm hoặc xóa sheet thì cũng chạy Sub Reset.

Khi bạn tải tập tin về mà muốn chạy thử thì cũng phải chạy sub Reset một lần để xóa dữ liệu hiện có và ẩn các sheet Input hiện thời đang hiển thị.

Việc chạy sub Reset không phải làm hàng ngay nên tôi để tự chạy thủ công để khỏi viết nhiều code.

Viết xong rồi tôi mới thấy là bạn Merge các cell là không cần thiết. Thay vì Merge các cell và nhập Tên, Mã ở 2 dòng liên tiếp của cột D thì sao bạn không muốn nhập chúng ở cùng dòng trong 2 cột D và E?. Lúc đó chỉ số công trình, Tên và Mã ở cùng dòng trong 3 cột C, D, E. Nhưng đã viết rồi tôi ngại sửa nên để nguyên như bạn muốn.
----------
Tôi gửi 2 tập tin. Thực ra tập tin "Tao so dong hien thi theo list.xlsm" chỉ lợi thế khi số sheet rất nhiều. Khi số sheet ít như của bạn thì chỉ nên dùng "Tao so dong hien thi theo list_dongian.xlsm" vì code đơn giản hơn. Lúc đó nếu số trước là 4 và chọn 5 thì code vẫn cứ xóa hết dữ liệu và ẩn hết các sheet rồi nhập lại dữ liệu và hiển thị các sheet cần hiện. Nếu là code của "Tao so dong hien thi theo list.xlsm" thì nó không xóa dữ liệu nào và cũng không ẩn sheet nào mà chỉ nhập thêm dữ liệu và hiển thị thêm sheet Input_5. Nếu số sheet nhiều thì đó là lợi thế. Vd. số hiện có là 999 và số chọn là 1000 thì nó chỉ thêm 2 dòng dữ liệu và hiển thị thêm sheet Input_1000. Còn code đơn giản lúc đó xóa 2*999 dòng dữ liệu và nhập lại 2000 dòng dữ liệu, và ẩn 999 sheet để rồi lại hiện 1000 sheet.

Nhưng số sheet của bạn không nhiều nên cái thua về việc + cái lợi về sự đơn giản của code cho thấy nên chọn "Tao so dong hien thi theo list_dongian.xlsm
---------------------
Viết xong rồi tôi mới để ý là biến curr_num trong tập tin "Tao so dong hien thi theo list.xlsm" là không cần thiết vì giá trị của curr_num có thể đọc từ cột C
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thành thật xin lỗi các anh!
Cám ơn anh Siwtom đã giúp đỡ code. Em quên không nói chi tiết hết, các Sheet TS, Input_1 đến Input_5 chỉ là các Sheet nhập thông tin và số công việc cần làm của công trình còn các SHeet khác để tính toán thì không ẩn
Các tên công trình và mã công trình nhập bằng tay không cần lấy dữ liệu từ bất kỳ đâu
Mong anh sửa lại đoạn code này giúp em với
Mã:
'        an tat ca cac sheet Input
        For index = 1 To Sheets.Count - 1
            Sheets("Input_" & index).Visible = xlSheetVeryHidden
        Next index

Em sửa lại vòng lặp là thì ẩn hiện Sheet Input như mong muốn
Mã:
'        an tat ca cac sheet Input
        For index = 1 To 5
            Sheets("Input_" & index).Visible = xlSheetVeryHidden
               Next index
'        xoa du lieu
        'Sheets("TS").Range("C6:D17").ClearContents

Nhưng còn vấn đề nữa đó là các dòng em muốn ẩn những ô không được chọn
VD:
- Em chọn ô [C5]=2 thì hiển thị các ô [C6:C8], ẩn các ô từ [C9:C17]
- Em chọn ô [C5]=3 thì hiển thị các ô [C6:C10], ẩn các ô từ [C11:C17]
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thành thật xin lỗi các anh!
Cám ơn anh Siwtom đã giúp đỡ code. Em quên không nói chi tiết hết, các Sheet TS, Input_1 đến Input_5 chỉ là các Sheet nhập thông tin và số công việc cần làm của công trình còn các SHeet khác để tính toán thì không ẩn
Các tên công trình và mã công trình nhập bằng tay không cần lấy dữ liệu từ bất kỳ đâu <-- (A)
Mong anh sửa lại đoạn code này giúp em với
Mã:
'        an tat ca cac sheet Input
        For index = 1 To Sheets.Count - 1
            Sheets("Input_" & index).Visible = xlSheetVeryHidden
        Next index

Em sửa lại vòng lặp là thì ẩn hiện Sheet Input như mong muốn
Mã:
'        an tat ca cac sheet Input
        For index = 1 To [B][COLOR=#ff0000]5[/COLOR][/B]
            Sheets("Input_" & index).Visible = xlSheetVeryHidden
               Next index
'        xoa du lieu
        [COLOR=#0000ff]'Sheets("TS").Range("C6:D17").ClearContents[/COLOR]

Nhưng còn vấn đề nữa đó là các dòng em muốn ẩn những ô không được chọn
VD:
- Em chọn ô [C5]=2 thì hiển thị các ô [C6:C8], ẩn các ô từ [C9:C17]
- Em chọn ô [C5]=3 thì hiển thị các ô [C6:C10], ẩn các ô từ [C11:C17]

Từ <-- (A) tôi hiểu là bây giờ code không nhập gì vào cột D nữa. Từ đỏ đỏ tôi hiểu là luôn có và chỉ có 5 sheet Input , và chỉ ẩn hiện 5 sheet này. Từ xanh xanh tôi hiểu là code sẽ không xóa dữ liệu nào cả.

Vậy thì chỉ nhập 5 số vào cột C. Tôi đề nghị nhập bằng tay vì chỉ nhập 1 lần dùng muôn đời. Và tạo Data Validation bằng tay luôn: chọn C5 --> Data .... --> trong Allow chọn List, trong Source gõ 1;2;3;4;5. Nếu bạn có nhu cầu thì chạy sub Reset (ẩn tất cả các sheet và dòng từ 6 tới 15)

Nếu các ý trên đều đúng thì có nghĩa là code chả nhập dữ liệu gì. Code chỉ làm việc ẩn hiện sheet Input và các dòng. Nếu thế thì code "chả còn gì"

Mã:
Sub Reset()
'    tu chay thu cong khi muon tro ve trang thai chua chon so cong trinh nao
Dim s As String, index As Long
    Application.EnableEvents = False
    Sheets("TS").Range("D6:D15").ClearContents
    Application.EnableEvents = True
    For index = 1 To 5
        Sheets("Input_" & index).Visible = xlSheetVeryHidden
    Next index
    Sheets("TS").Rows("6:15").Hidden = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim index As Long, TargetValue As Long, Arr()
'    chi thuc hien code khi co thay doi tai C5
    If Target.Address = "$C$5" Then
        Application.ScreenUpdating = False
        
        TargetValue = Target.Value
'        an tat ca cac sheet Input
        For index = 1 To 5
            Sheets("Input_" & index).Visible = xlSheetVeryHidden
        Next index
'        an tat ca cac dong 6-15
        Rows("6:15").Hidden = True
        
'        hien thi cac sheet tu 1 toi TargetValue
        For index = 1 To TargetValue
            Sheets("Input_" & index).Visible = xlSheetVisible
        Next index
'        hien dong
        Rows("6:" & 2 * TargetValue + 5).Hidden = False
        Range("C5").Select
        Application.ScreenUpdating = True
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom