win-sun
Thành viên hoạt động



- Tham gia
- 19/1/09
- Bài viết
- 151
- Được thích
- 15
Thật ra tôi làm rất đơn giản:
- Đầu tiên xem thằng Dropdown ấy tên gì (bằng cách chọn nó rồi nhìn lên hộp Name box)
- Xong, Alt + F11 vào của sổ VBA
- Bấm Ctrl + G rồi gõ vào dòng lệnh
- Gõ xong, Enter phát tự nhiên có ngay cái listMã:ActiveSheet.Dropdowns("Tên của Dropdown").List = Array("Hide", "Unhide")
-------------------
Mục đích của việc làm này là giúp chúng ta đở mất công tạo danh sách trên sheet ---> Tạo 1 lần, xài mãi mãi ---> Đã dùng đến code thì chẳng cần gì đến Input Range và Cell link (mọi thứ cứ dùng code mà viết)
--------------------
Đố tiếp: Tại sao tôi dùng Application.Caller? Mục đích?
Xin được xì-pam tí:
Sao giọng điệu này na ná NghiaPhuc quá vậy ta???
Thật ra tôi làm rất đơn giản:
- Đầu tiên xem thằng Dropdown ấy tên gì (bằng cách chọn nó rồi nhìn lên hộp Name box)
- Xong, Alt + F11 vào của sổ VBA
- Bấm Ctrl + G rồi gõ vào dòng lệnh
- Gõ xong, Enter phát tự nhiên có ngay cái listMã:ActiveSheet.Dropdowns("Tên của Dropdown").List = Array("Hide", "Unhide")
-------------------
Mục đích của việc làm này là giúp chúng ta đở mất công tạo danh sách trên sheet ---> Tạo 1 lần, xài mãi mãi ---> Đã dùng đến code thì chẳng cần gì đến Input Range và Cell link (mọi thứ cứ dùng code mà viết)
--------------------
Đố tiếp: Tại sao tôi dùng Application.Caller? Mục đích?
Em đang sử dụng Excel 2010, nhưng khi làm, em lưu file với định dạng Excel 2003, thấy bình thường mà bác.Nhưng cái list đó qua máy mình sao trống rỗng?, mở file của Quang Hải cũng không có Hide, Unhide gì cả?
Hay là do mình mở bằng Excel2003 với sự trợ giúp của chương trình FileFormatConverters, do sự chuyển đổi này nên list bị xóa?
Nếu đúng vậy thì không add list kiểu này được rồi. Giả sử mình là đối tác hoặc xếp của bạn nhận được file này thì sao?
Nhờ bạn lưu với Excel2003 rồi gởi lại thử xem?
Em đang sử dụng Excel 2010, nhưng khi làm, em lưu file với định dạng Excel 2003, thấy bình thường mà bác.
Hay là bác thử làm theo cách mà bác ndu hướng dẫn xem có được không, hoặc theo cách mà em đã thử nghiệm xem sao.
Anh nghiaphuc là mod của diễn đàn, thuộc hàng cao thủ, còn em chỉ là lính mới, thuộc dạng thấp thủ, đâu dám múa rìu qua mắt thợ?! Hihihi
Bác lập luận cứ như là Sherlock Holmes vậy, ghê quá.Nói vậy thì tui càng nghi ngờ em là Nghĩa Phúc lí do:
+ Một thành viên mới (cả về số bài và cả ngày tham gia) mà:
- Đã giỏi code (khoảng 5% được như vậy)
- Biết tương đối về Nghĩa Phúc, ndu ... và thân thiện.
+ Mới đây Nghĩa Phúc bị mất tích (chà nhớ ghê)
- Rất mong chờ thầy ra tay giải quyết giúp vấn đề này! thanksĐố tiếp:
Trong file của tác giả, tại sheet CHAM COM người ta đang dùng vòng lập để ẩn cột theo điều kiện chọn của Dropdown
Vậy xin đố tiếp:
- Liệu có thể cải tiến để không cần vòng lập không?
- Cách nào nạp list cho Dropdown một cách nhanh nhất mà không dùng đến list trên bảng tính?
Ẹc... Ẹc...
--------------
Mục đích cuối cùng: xóa sạch hết các công thức và bảng phụ cho bảng tính nhẹ nhàng hơn!
- Rất mong chờ thầy ra tay giải quyết giúp vấn đề này! thanks
Sub Ancot()
Dim rng As Range
Dim cbo As DropDown
Dim sCboVal As String
Application.ScreenUpdating = False
On Error Resume Next
With Sheet2
Set cbo = .DropDowns(Application.Caller)
sCboVal = cbo.List(cbo.ListIndex)
With .Range("E9:FC9")
.EntireColumn.Hidden = False
If sCboVal <> "ALL" Then
.Replace sCboVal, ""
Set rng = .SpecialCells(4)
.EntireColumn.Hidden = True
rng.EntireColumn.Hidden = False
rng.Value = sCboVal
End If
End With
End With
Application.ScreenUpdating = True
End Sub
Ôi thật là tuyệt, sáng mắt ra rồi, đa tạ thầy!!!!! thanksĐã làm xong cho bạn rồi đây:
Nhân tiện tôi xóa 1 số công thức, bảng phụ không cần thiết đồng thời sửa lại các công thức ở cột TỔNG CỘNG luôn. Thí nghiệm xem thế nào nhéMã:Sub Ancot() Dim rng As Range Dim cbo As DropDown Dim sCboVal As String Application.ScreenUpdating = False On Error Resume Next With Sheet2 Set cbo = .DropDowns(Application.Caller) sCboVal = cbo.List(cbo.ListIndex) With .Range("E9:FC9") .EntireColumn.Hidden = False If sCboVal <> "ALL" Then .Replace sCboVal, "" Set rng = .SpecialCells(4) .EntireColumn.Hidden = True rng.EntireColumn.Hidden = False rng.Value = sCboVal End If End With End With Application.ScreenUpdating = True End Sub
---------------------------
Còn câu đố cuối cùng về việc nạp list cho Dropdown, các bạn nghĩ thế nào?
Ôi thật là tuyệt, sáng mắt ra rồi, đa tạ thầy!!!!! thanks
Em cũng đã nghĩ đến điều này nhưng chưa biết làm sao cho ra kết quảPhương pháp không vòng lập tôi dùng trong file của bạn chỉ là dợt chơi về thuật toán (để biết rằng không vòng lập cũng làm được). Thật ra chưa chắc nó đã nhanh bằng cách dùng vòng lập đâu
Các bạn làm thử bài này bằng vòng lập xem (bằng cách thu gom các cell về 1 mối, kết thúc vòng lập sẽ thực thi ẩn hiện 1 lần)
Sub Ancot()
Application.ScreenUpdating = False
Dim i As Long, vung
If [B4] < 6 Then
Columns("E:FC").EntireColumn.Hidden = True
For i = [B4] + 4 To 159 Step 5
If vung = "" Then
vung = Cells(9, i).Address
Else
vung = vung & "," & Cells(9, i).Address
End If
Next
Range(vung).EntireColumn.Hidden = False
Else
Columns("E:FC").EntireColumn.Hidden = False
End If
Application.ScreenUpdating = True
End Sub
Sao phải nối địa chỉ lại chi cho cực khổ vậy? Sao không dùng Union mà làmEm cũng đã nghĩ đến điều này nhưng chưa biết làm sao cho ra kết quả
Loay hoay cũng ra được 1 cách thế này
PHP:Sub Ancot() Application.ScreenUpdating = False Dim i As Long, vung If [B4] < 6 Then Columns("E:FC").EntireColumn.Hidden = True For i = [B4] + 4 To 159 Step 5 If vung = "" Then vung = Cells(9, i).Address Else vung = vung & "," & Cells(9, i).Address End If Next Range(vung).EntireColumn.Hidden = False Else Columns("E:FC").EntireColumn.Hidden = False End If Application.ScreenUpdating = True End Sub
Sub Ancot()
Dim rCel As Range, rTemp As Range
Dim cbo As DropDown
Dim sCboVal As String
Application.ScreenUpdating = False
On Error Resume Next
With Sheet2
Set cbo = .DropDowns(Application.Caller)
sCboVal = cbo.List(cbo.ListIndex)
With .Range("E9:FC9")
.EntireColumn.Hidden = False
If sCboVal <> "ALL" Then
For Each rCel In .Cells
If rCel.Value <> sCboVal Then
If rTemp Is Nothing Then
Set rTemp = rCel
Else
Set rTemp = Union(rTemp, rCel)
End If
End If
Next
End If
End With
End With
If Not rTemp Is Nothing Then rTemp.EntireColumn.Hidden = True
Application.ScreenUpdating = True
End Sub
Đố tiếp:
Trong file của tác giả, tại sheet CHAM COM người ta đang dùng vòng lập để ẩn cột theo điều kiện chọn của Dropdown
Vậy xin đố tiếp:
- Liệu có thể cải tiến để không cần vòng lập không?
- Cách nào nạp list cho Dropdown một cách nhanh nhất mà không dùng đến list trên bảng tính?
Ẹc... Ẹc...
Em xin tham gia một cách, không biết liệu có được không: Không biết liệu bác nói "không dùng đến list trên bảng tính" có phải là muốn nói đến vùng FI1:FI6 không, nếu đúng như vậy thì em làm như sau, lấy sẵn những gì đã có tại hàng 9:Còn câu đố cuối cùng về việc nạp list cho Dropdown, các bạn nghĩ thế nào?
ActiveSheet.Dropdowns("Tên của Dropdown").List = Array("Hide", "Unhide")
Để nói luôn về cách nạp list cho dropdown nhé
Bài 16 đã có hướng dẫn rằng:
List này chỉ có 2 phần tử thì chẳng nói làm gìMã:ActiveSheet.Dropdowns("Tên của Dropdown").List = Array("Hide", "Unhide")
Đặt trường hợp ta đang có 1 Dropdown chứa 100 phần tử và đang liên kết với 1 list trên bảng tính, giờ ta muốn nó "độc lập" luôn để có thể xóa list trên bảng tính, ta làm như sau:
- Dùng chuột chọn vào Dropdown (bước này bắt buộc phải làm)
- Bấm Alt + F11 vào cửa số lập trình
- Bấm Ctrl + G để mở cửa số Immediate
- Gõ dòng lệnh: Selection.List = Selection.List rồi Enter
- Bấm Alt + Q trở về bảng tính, kiểm tra lại Dropdown bằng cách click phải chuột vào nó, chọn Format Control. Tại tab Control, mục Input Range đã.. biến mất
- Giờ thì xóa list tạm trên bảng tính vô tư, list trong Dropdown vẫn còn
Ẹc... Ẹc...
Sub Auto_Open()
Sheet2.DropDowns(1).List = Array("AS", "C1", "C2", "C3", "TC", "ALL")
End Sub
Sub Ancot()
Application.ScreenUpdating = False
Dim n As Byte, i As Long, vung
n= Sheet2.DropDowns(1).ListIndex
If n< 6 Then
Columns("E:FC").EntireColumn.Hidden = True
For i = n+ 4 To 159 Step 5
If vung = "" Then
vung = Cells(9, i).Address(0, 0)
Else
vung = vung & "," & Cells(9, i).Address(0, 0)
End If
Next
Range(vung).EntireColumn.Hidden = False
Else
Columns("E:FC").EntireColumn.Hidden = False
End If
Application.ScreenUpdating = True
End Sub
Sao phải nạp lại mỗi lần khởi động! Đàng nào thì ta nạp 1 lần duy nhất (như cách tôi đã làm), lần sau mở file lên list ấy vẫn còn chứ có mất đâu mà nạp tiếp? (cái Form Controls này nó khác ActiveX Controls nha)Tuỳ bệnh mà dùng thuốc. Bài này em vẫn muốn làm cách này
Cứ mở file là nó nạp list vào không cản được
PHP:Sub Auto_Open() Sheet2.DropDowns(1).List = Array("AS", "C1", "C2", "C3", "TC", "ALL") End Sub
Thì cũng là duyệt qua từng cell thôi!. Nếu có khoảng 1000 cell, tôi sẽ cho vào Array rồi mới duyệtEm thắc mắc rằng code này không biết có tốt không nhưng em thấy có thể hạn chế được việc tác động lên sheet trong quá trình chạy vòng lặp
PHP:Sub Ancot() Application.ScreenUpdating = False Dim n As Byte, i As Long, vung n= Sheet2.DropDowns(1).ListIndex If n< 6 Then Columns("E:FC").EntireColumn.Hidden = True For i = n+ 4 To 159 Step 5 If vung = "" Then vung = Cells(9, i).Address(0, 0) Else vung = vung & "," & Cells(9, i).Address(0, 0) End If Next Range(vung).EntireColumn.Hidden = False Else Columns("E:FC").EntireColumn.Hidden = False End If Application.ScreenUpdating = True End Sub