win-sun
Thành viên hoạt động
- Tham gia
- 19/1/09
- Bài viết
- 151
- Được thích
- 15
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: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!
Có xem qua file của bạn rồi, và mình nghĩ rằng code hoạt động bình thường.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!
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!
Thế này có được không anh?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
Chưa làm được theo gợi ý của thầy, nhưng dường như for next là k ổnBà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
Mình thấy các cách trên đều chạy được mà.Chưa làm được theo gợi ý của thầy, nhưng dường như for next là k ổn
Đã nói là không For... Next có nghĩa là không vòng lập cơ mà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]
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
Đã 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é:
Xóa hết mấy cell công thức cho khỏePHP: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
-------------------
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 ạ.Đã 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...
Thử nghiệm một cái coi: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.
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ợ?! HihihiXin đượ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: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.
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)Anh chơi chiêu này ác cũng không ít hén.
Á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ả.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)
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ả.
.
Em lại thử nghiệm một lần nữa:Đố tiếp: Tại sao tôi dùng Application.Caller? Mục đích?
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 đó"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.
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2