Mong các AC xem giúp code ẩn cột, có lúc chạy nhanh lúc chậm rù! (1 người xem)

Liên hệ QC

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

win-sun

Thành viên hoạt động
Tham gia
19/1/09
Bài viết
151
Được thích
15
Em làm file đăng ký suất ăn và theo dõi chấm cơm thực tế, chí ẩn các cột không cần thiết, sao có lúc chạy bình thường, 15 phút sau là chậm rù, mong mọi người chỉ giúp, cảm ơn!
 

File đính kèm

ub Ancot()
Application.ScreenUpdating = False
Dim Col As Range
If Range("B4") = "ALL" Then
Columns("E:FC").EntireColumn.Hidden = False
Else
For Each Col In Range("E9:FC9")
If Col = Range("B4") Then
Col.EntireColumn.Hidden = False
Else
Col.EntireColumn.Hidden = True
End If
Next Col
End If
Application.ScreenUpdating = True
End Sub
có điều gì đó không ổn!
 
Upvote 0
Em làm file đăng ký suất ăn và theo dõi chấm cơm thực tế, chí ẩn các cột không cần thiết, sao có lúc chạy bình thường, 15 phút sau là chậm rù, mong mọi người chỉ giúp, cảm ơn!
Mình thấy Sub AnCot trong file không có vấn đề gì, tuy nhiên có thể sửa lại một chút, hy vọng nhanh hơn:
[GPECODE=vb]Sub AnCot()
Dim Col As Range
Application.ScreenUpdating = False
Range("E9:FC9").EntireColumn.Hidden = False
If Range("B4") <> "ALL" Then
For Each Col In Range("E9:FC9")
If Col <> Range("B4") Then Col.EntireColumn.Hidden = True
Next
End If
Application.ScreenUpdating = True
End Sub[/GPECODE]
 
Upvote 0
ub Ancot()
Application.ScreenUpdating = False
Dim Col As Range
If Range("B4") = "ALL" Then
Columns("E:FC").EntireColumn.Hidden = False
Else
For Each Col In Range("E9:FC9")
If Col = Range("B4") Then
Col.EntireColumn.Hidden = False
Else
Col.EntireColumn.Hidden = True
End If
Next Col
End If
Application.ScreenUpdating = True
End Sub
có điều gì đó không ổn!
Có xem qua file của bạn rồi, và mình nghĩ rằng code hoạt động bình thường.
 
Upvote 0
ub Ancot()
Application.ScreenUpdating = False
Dim Col As Range
If Range("B4") = "ALL" Then
Columns("E:FC").EntireColumn.Hidden = False
Else
For Each Col In Range("E9:FC9")
If Col = Range("B4") Then
Col.EntireColumn.Hidden = False
Else
Col.EntireColumn.Hidden = True
End If
Next Col
End If
Application.ScreenUpdating = True
End Sub
có điều gì đó không ổn!

Bạn thử chạy với thủ tục này xem:

[GPECODE=vb]Sub Ancot()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
Dim Col As Range
With Sheet2
If .Range("B4") = "ALL" Then
.Columns("E:FC").EntireColumn.Hidden = False
Else
For Each Col In .Range("E9:FC9")
Col.EntireColumn.Hidden = (Col <> .Range("B4"))
Next Col
End If
End With
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
[/GPECODE]
 
Upvote 0
Bài này không dùng For.. Next và bỏ luôn dòng công thức phụ trên bảng tính cũng được
Dùng Find Method định vị vị trí ngày đầu và ngày cuối là được rồi
Thử nghiên cứu xem
 
Upvote 0
Bài này không dùng For.. Next và bỏ luôn dòng công thức phụ trên bảng tính cũng được
Dùng Find Method định vị vị trí ngày đầu và ngày cuối là được rồi
Thử nghiên cứu xem
Thế này có được không anh?
[GPECODE=vb]Sub AnCot()
Dim i As Long
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
With Sheet2
.[E9:FC9].EntireColumn.Hidden = (.[C4] < 6)
If .[C4] = 6 Then Exit Sub
For i = .[D9].Offset(, .[C4]).Column To 159 Step 5
.Cells(1, i).EntireColumn.Hidden = False
Next
End With
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub[/GPECODE]
 
Upvote 0
Chưa làm được theo gợi ý của thầy, nhưng dường như for next là k ổn
Mình thấy các cách trên đều chạy được mà.
Có lẽ ý của anh ndu như thế này:
[GPECODE=vb]Sub AnCot()
Dim Rng As Range
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
With Sheet2
.[E9:FC9].EntireColumn.Hidden = (.[C4] < 6)
If .[C4] = 6 Then Exit Sub
Set Rng = .[E9:FC9].Find(.[FI1].Offset(.[C4] - 1), lookat:=xlWhole)
Do While Rng.Column < 160
Rng.EntireColumn.Hidden = False
Set Rng = Rng.Offset(, 5)
Loop
End With
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub[/GPECODE]
 
Upvote 0
Thế này có được không anh?
[GPECODE=vb]Sub AnCot()
Dim i As Long
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
With Sheet2
.[E9:FC9].EntireColumn.Hidden = (.[C4] < 6)
If .[C4] = 6 Then Exit Sub
For i = .[D9].Offset(, .[C4]).Column To 159 Step 5
.Cells(1, i).EntireColumn.Hidden = False
Next
End With
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub[/GPECODE]
Đã nói là không For... Next có nghĩa là không vòng lập cơ mà
Do.. Loop cũng là vòng lập nha bạn
Tôi nghĩ bài này chẳng cần vòng lập cũng được tuốt
Làm thử chơi nhé:
PHP:
Sub dangky()
  Dim rng1 As Range, rng2 As Range, rng As Range
  Dim cbo As DropDown
  Application.ScreenUpdating = False
  On Error Resume Next
  With Sheet3
    Set cbo = .DropDowns(Application.Caller)
    .Range("E:FC").EntireColumn.Hidden = (cbo.ListIndex = 1)
    Set rng1 = .Range("E8").Offset(, (Day(.Range("D3")) - 1) * 5 - 4)
    Set rng2 = .Range("E8").Offset(, (Day(.Range("D4")) - 1) * 5)
    Set rng = .Range(rng1, rng2)
    rng.EntireColumn.Hidden = False
  End With
  Application.ScreenUpdating = True
End Sub
Xóa hết mấy cell công thức cho khỏe
-------------------
Nhân đây đố mọi người biết cái ComboBox trên bảng tính đang liên kết với cái gì mà có được chữ "Hide" và "Unhide" trong list?
Ẹc... Ẹc...
 

File đính kèm

Upvote 0
Đã nói là không For... Next có nghĩa là không vòng lập cơ mà
Do.. Loop cũng là vòng lập nha bạn
Tôi nghĩ bài này chẳng cần vòng lập cũng được tuốt
Làm thử chơi nhé:
PHP:
Sub dangky()
  Dim rng1 As Range, rng2 As Range, rng As Range
  Dim cbo As DropDown
  Application.ScreenUpdating = False
  On Error Resume Next
  With Sheet3
    Set cbo = .DropDowns(Application.Caller)
    .Range("E:FC").EntireColumn.Hidden = (cbo.ListIndex = 1)
    Set rng1 = .Range("E8").Offset(, (Day(.Range("D3")) - 1) * 5 - 4)
    Set rng2 = .Range("E8").Offset(, (Day(.Range("D4")) - 1) * 5)
    Set rng = .Range(rng1, rng2)
    rng.EntireColumn.Hidden = False
  End With
  Application.ScreenUpdating = True
End Sub
Xóa hết mấy cell công thức cho khỏe
-------------------
Nhân đây đố mọi người biết cái ComboBox trên bảng tính đang liên kết với cái gì mà có được chữ "Hide" và "Unhide" trong list?
Ẹc... Ẹc...

Chắc là chữ "Hide" và "Unhide" trong list lấy từ các giá trị của .Range("E:FC").EntireColumn.Hidden. Đúng là nghệ thuật.

Nhưng có lẽ do máy mình chưa cảm nhận được nghệ thuật nên giống đàn gãi tai trâu:


- Trong List đó trống rỗng.

- Chạy code dangky, bỏ bẩy lỗi trì thấy lỗi tại dòng này Set cbo = .DropDowns(Application.Caller)

Nhờ Bác sỹ bốc thuốc!
 
Lần chỉnh sửa cuối:
Upvote 0
Đã nói là không For... Next có nghĩa là không vòng lập cơ mà

-------------------
Nhân đây đố mọi người biết cái ComboBox trên bảng tính đang liên kết với cái gì mà có được chữ "Hide" và "Unhide" trong list?
Ẹc... Ẹc...
Xin thưa với anh rằng đáp án em kèm trong file ạ.

Anh chơi chiêu này ác cũng không ít hén.
 

File đính kèm

Upvote 0
Nhân đây đố mọi người biết cái ComboBox trên bảng tính đang liên kết với cái gì mà có được chữ "Hide" và "Unhide" trong list?
Ẹc... Ẹc...
Thử nghiệm một cái coi:
1. Mở 1 Workbook mới, vẽ lên sheet (Sheet1) 1 ComboBox (Form control)
2. Chạy code sau:
[GPECODE=vb]Sub Test()
Dim Cbo As DropDown
Set Cbo = Sheet1.DropDowns(1)
Cbo.AddItem "Giai phap Excel"
Cbo.AddItem "Cong cu tuyet voi cua ban"
End Sub[/GPECODE]
3. Xóa macro trên.
4. Hỏi câu hỏi tương tự như bác ndu96081631 ở trên.
5. Ẹc ẹc một cái nữa.
 
Upvote 0
Thử nghiệm một cái coi:
1. Mở 1 Workbook mới, vẽ lên sheet (Sheet1) 1 ComboBox (Form control)
2. Chạy code sau:
[GPECODE=vb]Sub Test()
Dim Cbo As DropDown
Set Cbo = Sheet1.DropDowns(1)
Cbo.AddItem "Giai phap Excel"
Cbo.AddItem "Cong cu tuyet voi cua ban"
End Sub[/GPECODE]
3. Xóa macro trên.
4. Hỏi câu hỏi tương tự như bác ndu96081631 ở trên.
5. Ẹc ẹc một cái nữa.

Xin được xì-pam tí:

Sao giọng điệu này na ná NghiaPhuc quá vậy ta???
 
Upvote 0
Thử nghiệm một cái coi:
1. Mở 1 Workbook mới, vẽ lên sheet (Sheet1) 1 ComboBox (Form control)
2. Chạy code sau:
[GPECODE=vb]Sub Test()
Dim Cbo As DropDown
Set Cbo = Sheet1.DropDowns(1)
Cbo.AddItem "Giai phap Excel"
Cbo.AddItem "Cong cu tuyet voi cua ban"
End Sub[/GPECODE]
3. Xóa macro trên.
4. Hỏi câu hỏi tương tự như bác ndu96081631 ở trên.
5. Ẹc ẹc một cái nữa.
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
Mã:
ActiveSheet.Dropdowns("Tên của Dropdown").List = Array("Hide", "Unhide")
- Gõ xong, Enter phát tự nhiên có ngay cái list
-------------------
Anh chơi chiêu này ác cũng không ít hén.
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?
 
Lần chỉnh sửa cuối:
Upvote 0
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
Mã:
ActiveSheet.Dropdowns("Tên của Dropdown").List = Array("Hide", "Unhide")
- Gõ xong, Enter phát tự nhiên có ngay cái list
-------------------
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)
Ái chà chà... Đơn giản có vậy thôi mà em phải copy cái dòng lệnh Dim Cbo As DropDown trong code của bác rồi "chế biến", thậm chí kiểu dữ liệu DropDown còn không có trong danh mục các kiểu dữ liệu có sẵn của VBA nữa. Và gõ Sheet1 rồi chấm 1 phát cũng chẳng thấy anh chàng DropDown đâu cả.
Vậy là lại biết thêm một điều hay nữa... Cảm ơn bác ndu96081631.
 
Upvote 0
hậm chí kiểu dữ liệu DropDown còn không có trong danh mục các kiểu dữ liệu có sẵn của VBA nữa. Và gõ Sheet1 rồi chấm 1 phát cũng chẳng thấy anh chàng DropDown đâu cả.
.

Rất nhiều kiểu biến không có trong danh mục lắm bạn à
Muốn biết object thuộc "loại" gì, cứ chọn vào nó rồi chạy dòng lệnh: MsgBox TypeName(Selection)
Rất đơn giản
Ẹc... Ẹc...
 
Upvote 0
Đố tiếp: Tại sao tôi dùng Application.Caller? Mục đích?
Em lại thử nghiệm một lần nữa:
1. Tạo lại code như bài trên của em (ví dụ vậy), thay số 1 bởi Application.Caller
[GPECODE=vb]Sub Test()
Dim Cbo As DropDown
Set Cbo = Sheet1.DropDowns(Application.Caller)
Cbo.AddItem "Giai phap Excel"
Cbo.AddItem "Cong cu tuyet voi cua ban"
End Sub[/GPECODE]
2. Vẽ lên Sheet1 2 cái ComboBox, rồi Assign Macro cho cả 2 ComboBox này đều là Test.
3. Nhấn 1 trong 2 ComboBox vừa tạo, cứ chọn cái nào thì cái đó lại được thêm 2 dòng như trên.

--> Kết luận: Sử dụng Application.Caller để xác định rằng code đang chạy phụ thuộc vào chính ComboBox mà ta nhấn chuột vào.
 
Upvote 0
Em lại thử nghiệm một lần nữa:
1. Tạo lại code như bài trên của em (ví dụ vậy), thay số 1 bởi Application.Caller
[GPECODE=vb]Sub Test()
Dim Cbo As DropDown
Set Cbo = Sheet1.DropDowns(Application.Caller)
Cbo.AddItem "Giai phap Excel"
Cbo.AddItem "Cong cu tuyet voi cua ban"
End Sub[/GPECODE]
2. Vẽ lên Sheet1 2 cái ComboBox, rồi Assign Macro cho cả 2 ComboBox này đều là Test.
3. Nhấn 1 trong 2 ComboBox vừa tạo, cứ chọn cái nào thì cái đó lại được thêm 2 dòng như trên.

--> Kết luận: Sử dụng Application.Caller để xác định rằng code đang chạy phụ thuộc vào chính ComboBox mà ta nhấn chuột vào.
Mục đích của tôi là muốn khi bạn vẽ bất cứ thằng Drop down nào (tên gì mặc kệ), cứ Assign Macro với code là chạy được chứ không cần phải sửa tên Drop down trong code (dạng như tên động ấy) ---> Cứ "thằng" nào "đụng" vào tui thì tui "chỉ mặt thằng đó"
Ẹc... Ẹc...
 
Upvote 0
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
Mã:
ActiveSheet.Dropdowns("Tên của Dropdown").List = Array("Hide", "Unhide")
- Gõ xong, Enter phát tự nhiên có ngay cái list
-------------------

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?

Nhờ gợi ý của Thầy tại đây mà em đã thực hiện được hướng dẫn tại bài này:

http://www.giaiphapexcel.com/forum/...k-object-trả-ô-về-giá-trị&p=461025#post461025

Cám ơn Thầy rất nhiều!
 
Upvote 0
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
Mã:
ActiveSheet.Dropdowns("Tên của Dropdown").List = Array("Hide", "Unhide")
- Gõ xong, Enter phát tự nhiên có ngay cái list
-------------------

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?

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?
 
Upvote 0
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.
 
Upvote 0
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.

Ý mình nói là có khả năng chương trình FileFormatConverters nó chuyển đổi không hoàn hảo làm list bị xóa, nếu vậy thì không add Item bằng cách này được. Còn tất nhiên add theo ndu hoặc của "em" đều được, nhưng không được dùng FileFormatConverters.
 
Lần chỉnh sửa cuối:
Upvote 0
Đố 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!
 
Upvote 0
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

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ê)
 
Upvote 0
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ê)
Bác lập luận cứ như là Sherlock Holmes vậy, ghê quá.
Thực ra thì em biết diễn đàn cũng đã khá lâu và đọc rất nhiều bài viết trên diễn đàn, nên cũng biết sơ sơ về một số thành viên trên diễn đàn.
Việc em mới đăng ký thành viên thì chỉ là trước giờ "chưa tích đủ lượng để thay đổi về chất" thôi mà.
Còn chuyện mới đây anh nghiaphuc "mất tích" có thể là một sự trùng hợp ngẫu nhiên thôi. Bác cứ nhìn nơi ở của em thì biết.
 
Upvote 0
Đố 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
 
Upvote 0
- Rất mong chờ thầy ra tay giải quyết giúp vấn đề này! thanks

Đã làm xong cho bạn rồi đây:
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
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é
---------------------------
Còn câu đố cuối cùng về việc nạp list cho Dropdown, các bạn nghĩ thế nào?
 

File đính kèm

Upvote 0
Đã làm xong cho bạn rồi đây:
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
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é
---------------------------
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
 
Upvote 0
Ôi thật là tuyệt, sáng mắt ra rồi, đa tạ thầy!!!!! thanks

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)
 
Upvote 0
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)
Em 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
 
Lần chỉnh sửa cuối:
Upvote 0
Em 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
Sao phải nối địa chỉ lại chi cho cực khổ vậy? Sao không dùng Union mà làm
Tôi dùng code cũ, sửa lại 1 tí thế này:
Mã:
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
1> Đầu tiên cho hiện toàn bộ các cell của vùng E9:FC9
2> Xét: Nếu Dropdown không phải chọn "ALL" thì.. đi tiếp
- Duyệt toàn bộ các cell
- Xet: nếu cell nào không trùng với Item của Dropdown thì thu gom lại vào 1 biến tạm rTemp
- Kết thúc vòng lập, xét: nếu rTemp có tồn tại thì ẩn rTemp

 
Lần chỉnh sửa cuối:
Upvote 0
Đố 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...
Còn câu đố cuối cùng về việc nạp list cho Dropdown, các bạn nghĩ thế nào?
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:
[GPECODE=vb]Sub Test()
Dim Cbb As DropDown
With Sheets("CHAM COM")
Set Cbb = .DropDowns(Application.Caller)
Cbb.List = WorksheetFunction.Transpose(.[E9:I9])
Cbb.AddItem "All"
End With
End Sub[/GPECODE]
Tất nhiên code trên chỉ dùng cho việc nạp list cho ComboBox thôi, nếu dùng cho các công việc tiếp theo thì phải xử lý khác, chứ nếu không thì cứ mỗi lần click vào ComboBox thì nó lại tạo list mới nên không dùng để chọn được.
 
Upvote 0
Để nói luôn về cách nạp list cho dropdown nhé
Bài 16 đã có hướng dẫn rằng:
Mã:
ActiveSheet.Dropdowns("Tên của Dropdown").List = Array("Hide", "Unhide")
List này chỉ có 2 phần tử thì chẳng nói làm gì
Đặ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...
 
Upvote 0
Để nói luôn về cách nạp list cho dropdown nhé
Bài 16 đã có hướng dẫn rằng:
Mã:
ActiveSheet.Dropdowns("Tên của Dropdown").List = Array("Hide", "Unhide")
List này chỉ có 2 phần tử thì chẳng nói làm gì
Đặ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...

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
Em 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
 
Upvote 0
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
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)
Với lại, ở đây đang nói đến cái Dropdown đang có sẵn list rồi, giờ ta chỉ giúp nó "độc lập tác chiến" thôi (không phải tạo mới 1 Dropdown)


Em 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
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ệt
Lưu ý rằng Cells.Address chỉ là 1 địa chỉ không chứa tên sheet nha ---> Vậy nên qua sheet khác mà chạy code là... trật lất
 
Upvote 0

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

Back
Top Bottom