PDA

View Full Version : tự động tìm khi nhập mã số



lehuyluan
18-08-08, 01:04 PM
em đang tìm lời giải cho bài toán này mà em chưa tìm ra cách làm sao.mong được các anh chị giúp đỡ.em gửi file đính kèm vì khó nói quá

hoangdanh282vn
18-08-08, 01:11 PM
em đang tìm lời giải cho bài toán này mà em chưa tìm ra cách làm sao.mong được các anh chị giúp đỡ.em gửi file đính kèm vì khó nói quá

Đọc file đính kèm mà không hiểu ý bạn là gì cả.
Có phải ý bạn là có 1 sheet chứa dữ liệu, ở sheet Báo cáo ta chỉ cần nhập mã là sẽ thấy được các thông tin liên quan đến mã đó.
Nếu vậy thì dùng hàm Vlookup là ok.
Bạn nói rõ hơn về yêu cầu xem

lehuyluan
18-08-08, 01:19 PM
dạ ý em là ở bảng sheet đó. mỗi lần em tìm tên hàng để nhập ngày tháng giao hàng thấy mất công quá. em muốn ở ô màu vàng em chi cần nhập mã số thì ở dưới nó sẽ hiện ra tên hàng mà mình đang tìm để nhập ngày tháng vào .

ndu96081631
18-08-08, 01:20 PM
Bài này dùng Advanced Filter thôi, kết hợp với code VBA nữa là thành tự động!
Xem file nhé

lehuyluan
18-08-08, 01:24 PM
thank anh ndu96081631 và mọi người đã giúp đỡ em. đúng là cái em đang tìm.

hoangdanh282vn
18-08-08, 01:35 PM
dạ ý em là ở bảng sheet đó. mỗi lần em tìm tên hàng để nhập ngày tháng giao hàng thấy mất công quá. em muốn ở ô màu vàng em chi cần nhập mã số thì ở dưới nó sẽ hiện ra tên hàng mà mình đang tìm để nhập ngày tháng vào .

BẠn xem file nha

Sub worksheet_change(ByVal target As Range)
On Error Resume Next
Dim i As Long
If [B2] <> "" Then
For i = 4 To [B65536].End(xlUp).Row
If Cells(i, 2) = [B2] Then
Cells(i, 7).Select
Exit For
End If
Next
End If
End Sub

hong gam
18-08-08, 01:35 PM
bác ndu ơi, bác có thể giải thích cái sub của bác cho em hiểu nha. cách bác làm hay lắm. đọc bài của lehuyluan em chỉ nghĩ đến cách tạo 1 data và bảng dò tìm ra kết quả mà thôi.
em thấy bác có sử dụng 1 name. còn sub của bác, em có thấy DS. vậy DS là sao.

ndu96081631
18-08-08, 01:45 PM
bác ndu ơi, bác có thể giải thích cái sub của bác cho em hiểu nha. cách bác làm hay lắm. đọc bài của lehuyluan em chỉ nghĩ đến cách tạo 1 data và bảng dò tìm ra kết quả mà thôi.
Tôi record macro quá trình lọc bằng Advanced Filter thôi mà, rất đơn giãn
Quy trình tôi làm như sau:
1> Tạo vùng điều kiện trước (B1 gõ chứ MA SO ---> chử này bắt buộc phải giống tiêu đề của bảng tính, B2 để trống )
2> Bặt chức năng Record macro lên
3> Đặt con trỏ chuột tại A4, bấm Ctrl + G\Special\CurrentRegion... rồi OK
4> Vào menu Data\Filter\Advanced Filter
a) Chọn Filter the list, in-place
b) Phần list range đã được điền sẳn
c) Khung Criteria Range, quét chọn $B$1:$B$2 và OK
5> Tắt record macro tôi được:


Sub Macro1()
'
' Macro1 Macro
' Macro recorded 18/08/2008 by ndu
'

'
Range("A4").Select
Selection.CurrentRegion.Select
Range("A4:J24").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("B1:B2"), Unique:=False
End SubChỉnh lại chút:


Sub Macro1()
Set DS = [A4].CurrentRegion
DS.AdvancedFilter Action:=1, CriteriaRange:= Range("B1:B2")
End Sub6> Mang code này gán vào sự kiện WorkSheet_Change và chỉnh thêm lần nữa (thêm điều kiện ép code chỉ hoạt động khi có thay đổi tại B2)


Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$2" Then
Set DS = [A4].CurrentRegion
DS.AdvancedFilter Action:=1, CriteriaRange:=Range("B1:B2")
End If
End Sub
Xong!
Ghi chú thêm: Name trong Define name mà bạn nhìn thấy không phải do tôi tạo ra, nó được tự tạo trong quá trình Filter
Bạn cũng có thể tự làm được dể dàng như ăn khoai

hong gam
18-08-08, 01:53 PM
Lời hướng dẫn rất chi tiết. rất phù hợp và dễ hiểu đối với người chẳng biết vba như em. em sẽ tập làm. có gì sẽ hỏi bác tiếp. thanks

bác ndu ơi, vậy Set DS = A4 tức là mình gán cho địa chỉ này là DS phải không bác.
Bác danh ơi, em mở file bác để tham khảo nhưng khi gõ mã số vào nó không tự động auto filter như bác ndu được.

ndu96081631
18-08-08, 02:34 PM
bác ndu ơi, vậy Set DS = A4 tức là mình gán cho địa chỉ này là DS phải không bác.
Bác danh ơi, em mở file bác để tham khảo nhưng khi gõ mã số vào nó không tự động auto filter như bác ndu được.
Chính xác là:

Set DS = [A4].CurrentRegion
Tương đương với việc đặt con trỏ tại A4, bấm Ctrl + G vào Special\CurrentRegion... lúc đó nó sẽ chọn hết những vùng dử liệu có "dính" với A4
Chiêu này rất thuận tiện khi bạn không biết dử liệu của bạn sẽ mở rộng đến dòng bao nhiêu và cột bao nhiêu (Nó sẽ tự cập nhật khi bạn thêm bớt dử liệu)
Set DS = .... cũng gần tương đương với đặt name trong Define name
Thêm 1 cái thuận tiện nữa là trong code chỉ có duy nhất 1 cell A4, mai này muốn sửa lại vùng dử liệu thì chỉ cần sửa cell này trong code là đủ

ndu96081631
18-08-08, 02:42 PM
Nói thêm: Code của Danh không phải là LỌC, mà nó dời con trỏ chuột đến cột G cho bạn nhập ngày (bạn thử xem)
Code đấy không cần dùng For (sẽ chậm)... Có thể sửa lại như sau:


Private Sub Worksheet_Change(ByVal target As Range)
Dim i As Long
On Error Resume Next
Set Ma = Range("B4:B" & [B65536].End(xlUp).Row)
VT = Application.WorksheetFunction.Match([B2], Ma, 0)
[B3].Offset(VT, 5).Select
End Sub
Nhanh hơn nhiều

hong gam
18-08-08, 03:01 PM
Bác Ndu và bác Danh và cả bác okebab ơi , cho em hỏi thêm nha. em có 1 file, sử dụng trên 1 form của bác Mr Okebab ( chỉ cho nhập liệu vào các cell trống. sau khi lưu không cho sửa). em thấy cách làm của bác Danh và bác ndu làm lại cho tốc độ nhanh hơn nó rất phù hợp vì file này của em rất nhiều dòng (1 tháng khoảng 800 - 1500 dòng mà tìm mã sẽ cực). tuy nhiên do không chỉnh sửa cell đã lưu nên em không biết mìn phải chỉnh sửa làm sao để chừa lại cái ô nhập mã số không khị khóa.
Em gởi kèm file nha các bác ( bác xem cáh 2 ạh)
thanks các bác

ndu96081631
18-08-08, 03:55 PM
Vậy giờ bạn muốn làm gì trên file này?

hong gam
18-08-08, 04:11 PM
em muốn vận dụng cách làm của bác danh vào file tương tự như bạn lehuyluan nhưng cái file của em lại được làm trên cái form có các câu lệnh khóa cell của bác bab. các bác có thể giúp em thêm câu lệnh hay chỉnh sửa câu lệnh của bác bab để em có thể ứng dụng vào file của mình.vì file em nặng lắm không post lên được. bác có thể copy file của bạn lehuyluan vào form của bác bab rồi giúp em ạh.cám ơn bác.

hoangdanh282vn
18-08-08, 05:49 PM
em muốn vận dụng cách làm của bác danh vào file tương tự như bạn lehuyluan nhưng cái file của em lại được làm trên cái form có các câu lệnh khóa cell của bác bab. các bác có thể giúp em thêm câu lệnh hay chỉnh sửa câu lệnh của bác bab để em có thể ứng dụng vào file của mình.vì file em nặng lắm không post lên được. bác có thể copy file của bạn lehuyluan vào form của bác bab rồi giúp em ạh.cám ơn bác.

Bạn xem VD này thử :


Sub worksheet_change(ByVal target As Range)
On Error Resume Next
ActiveSheet.Unprotect
If target <> "" Then
target.Locked = True
End If
ActiveSheet.Protect
End Sub
--------------------------------------------------
Sub Button1_Click()
ActiveSheet.Unprotect
End Sub

hoangdanh282vn
18-08-08, 05:52 PM
dạ ý em là ở bảng sheet đó. mỗi lần em tìm tên hàng để nhập ngày tháng giao hàng thấy mất công quá. em muốn ở ô màu vàng em chi cần nhập mã số thì ở dưới nó sẽ hiện ra tên hàng mà mình đang tìm để nhập ngày tháng vào .

Cách khác dùng Hyperlink động

hong gam
18-08-08, 06:28 PM
cám ơn bác danh. em thích cách của bác bab vì muốn chỉnh sửa phải có password mới cho phép chỉnh sửa. Để em copy cái dữ liệu nhỏ nhỏ rồi đưa lên để bác giúp em. em mượn file của bạn lehuyluan nha.
Bác có thể thêm câu lệnh có pass vào cái forrm mẫu của bác là rất ok vì bác đặt macro ở vị trí dễ sử dụng hơn bác bab.

hoangdanh282vn
18-08-08, 06:42 PM
cám ơn bác danh. em thích cách của bác bab vì muốn chỉnh sửa phải có password mới cho phép chỉnh sửa. Để em copy cái dữ liệu nhỏ nhỏ rồi đưa lên để bác giúp em. em mượn file của bạn lehuyluan nha.
Bác có thể thêm câu lệnh có pass vào cái forrm mẫu của bác là rất ok vì bác đặt macro ở vị trí dễ sử dụng hơn bác bab.

Mình sửa lại file cũ của mình tí là xong ấy mà :

Sub worksheet_change(ByVal target As Range)
On Error Resume Next
ActiveSheet.Unprotect "DANH"
If target <> "" Then
target.Locked = True
End If
ActiveSheet.Protect
End Sub

Sub Button1_Click()
If UCase(InputBox("Nhap password : ", "Unprotect")) = "DANH" Then
ActiveSheet.Unprotect
End If
End Sub

thaibinh_excel
18-08-08, 06:50 PM
Mình sửa lại file cũ của mình tí là xong ấy mà :

Sub worksheet_change(ByVal target As Range)
On Error Resume Next
ActiveSheet.Unprotect "DANH"
If target <> "" Then
target.Locked = True
End If
ActiveSheet.Protect
End Sub

Sub Button1_Click()
If UCase(InputBox("Nhap password : ", "Unprotect")) = "DANH" Then
ActiveSheet.Unprotect
End If
End Sub

Cho mình hỏi thăm tí, với dữ liệu khoảng 1000 dòng, mình chạy code loc của Ndu xong, chỉnh sửa xong, muốn bung ra lai toàn bộ danh sach thì code chạy rất lâu ( vì hình như nó calculate lại dữ liệu mặc dù mình đã đạt EnableEvent = False. Có cách nào push nó nhanh hơn khong nhi?

ndu96081631
18-08-08, 07:00 PM
Cho mình hỏi thăm tí, với dữ liệu khoảng 1000 dòng, mình chạy code loc của Ndu xong, chỉnh sửa xong, muốn bung ra lai toàn bộ danh sach thì code chạy rất lâu ( vì hình như nó calculate lại dữ liệu mặc dù mình đã đạt EnableEvent = False. Có cách nào push nó nhanh hơn khong nhi?
Tôi không hiểu bạn đã làm gì trên file mà lại nói là chậm!
Tôi nghĩ rằng code dùng Advanced Filter là rất nhanh đấy (xem lại, biết đâu trên file của bạn còn những món khác nữa)
Vui lòng cho xem code hoặc tốt nhất là nguyên file để tìm hiểu nguyên nhân chính xác hơn

hong gam
18-08-08, 07:07 PM
để mình có thể dò tìm theo mã sau khi gõ vào 1 ô quy định, ở trên bác sử dụng Sub Worksheet_Change(ByVal target As Range ) và ở bảo vệ cell bác cũng sử dụng cái sub này ( chỉ khác có câu lệnh bên trong), vậy em phải chỉnh sửa làm sao để khi gõ mã số vào ô màu vàng, nhấn go là đến vị trí cần nhập liệu đó ạh.
Ah, anh Danh ơi, cũng trong trường hợp như vậy nhưng riêng cell để nhập mã số màu vàng không bị protec được không vậy anh, em chẳng nữa. Mong anh chỉ dẫn

thaibinh_excel
18-08-08, 07:16 PM
Tôi không hiểu bạn đã làm gì trên file mà lại nói là chậm!
Tôi nghĩ rằng code dùng Advanced Filter là rất nhanh đấy (xem lại, biết đâu trên file của bạn còn những món khác nữa)
Vui lòng cho xem code hoặc tốt nhất là nguyên file để tìm hiểu nguyên nhân chính xác hơn

Mình đoán là vì trong file này có công thức tính toán, có thể khi bung Advance Filter ra thi nó tinh toán lại dữ liệu nên lâu, không biết có chính xác không?

Code thì chính xác là code của bác luôn.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$2" Then
Set DS = [A4].CurrentRegion
DS.AdvancedFilter Action:=1, CriteriaRange:=Range("D1:D2")
End If
End Sub

Nếu đúng là do công thức tính toán lại, mình chặn như thế nào vậy bác?

Po_Pikachu
18-08-08, 07:58 PM
để mình có thể dò tìm theo mã sau khi gõ vào 1 ô quy định, ở trên bác sử dụng Sub Worksheet_Change(ByVal target As Range ) và ở bảo vệ cell bác cũng sử dụng cái sub này ( chỉ khác có câu lệnh bên trong), vậy em phải chỉnh sửa làm sao để khi gõ mã số vào ô màu vàng, nhấn go là đến vị trí cần nhập liệu đó ạh.
Ah, anh Danh ơi, cũng trong trường hợp như vậy nhưng riêng cell để nhập mã số màu vàng không bị protec được không vậy anh, em chẳng nữa. Mong anh chỉ dẫn
Khỏi cần nhấn Go chi cho mệt. Khi bạn gõ xong thì lập tức sẽ chạy đến ô bạn cần nhập. Mình cũng đã làm cho ô B4 đó không bị protect luôn rồi đó!
Bạn xem có đúng ý không!
Thân.

Bổ sung: Bổ sung lệnh cho nút Unprotect

ndu96081631
18-08-08, 08:45 PM
để mình có thể dò tìm theo mã sau khi gõ vào 1 ô quy định, ở trên bác sử dụng Sub Worksheet_Change(ByVal target As Range ) và ở bảo vệ cell bác cũng sử dụng cái sub này ( chỉ khác có câu lệnh bên trong), vậy em phải chỉnh sửa làm sao để khi gõ mã số vào ô màu vàng, nhấn go là đến vị trí cần nhập liệu đó ạh.
Ah, anh Danh ơi, cũng trong trường hợp như vậy nhưng riêng cell để nhập mã số màu vàng không bị protec được không vậy anh, em chẳng nữa. Mong anh chỉ dẫn
Hình như tôi hơi hiểu đựoc vấn đề: Có phải ý bạn muốn bảo vệ cell theo kiểu code của Mr OkeBab nhưng vẩn muốn chừa lại 1 cell để gõ vào thoải mái không?
Vậy thì bạn tìm chổ code WorkSheet_change và thêm vào đầu code này dòng:
If Target.Address = "$B$4" Then Exit Sub
(trong trừong hợp cell muốn chừa lại là B4)

hong gam
19-08-08, 09:22 AM
Hình như tôi hơi hiểu đựoc vấn đề: Có phải ý bạn muốn bảo vệ cell theo kiểu code của Mr OkeBab nhưng vẩn muốn chừa lại 1 cell để gõ vào thoải mái không?
Bác hiểu đúng ý em rồi ah.
Em làm theo như bác hướng dẫn nhập dòng lệnh

If Target.Address = "$B$4" Then Exit Sub
trước worksheet_change.
đoạn code này:

Sub worksheet_change(ByVal target As Range)
On Error Resume Next
ActiveSheet.Unprotect "DANH"
If target <> "" Then
target.Locked = True
End If
ActiveSheet.Protect
End Sub
thì máy báo lỗi: compile error: invalid outside procedure sau khi nhấn run.
Không biết sao nữa hay em đưa vào không đúng vị trí bác chỉ. Mong bác giúp đỡ

Po_Pikachu
19-08-08, 09:30 AM
Bạn sửa thành vầy:


Sub worksheet_change(ByVal target As Range)
On Error Resume Next
ActiveSheet.Unprotect "DANH"
If target.Value <> "" Then
target.Locked = True
End If
ActiveSheet.Protect "DANH"
End Sub

Nhưng trước hết bạn quét chọn toàn bộ dữ liệu, chọn Format Cells -> Chọn tab Protection -> Bỏ chọn Locked. Để khi nhập dữ liệu mới thì ô đó sẽ bị khóa đi.

ptm0412
19-08-08, 09:38 AM
Thêm vào đầu code là thêm vầy nè:


Sub worksheet_change(ByVal target As Range)
On Error Resume Next
If Target.Address = "$B$4" Then Exit Sub
ActiveSheet.Unprotect "DANH"
If target.Value <> "" Then
target.Locked = True
End If
ActiveSheet.Protect "DANH"
End Sub


chứ hông phải


If Target.Address = "$B$4" Then Exit Sub
Sub worksheet_change(ByVal target As Range)
.............
End Sub

Như vậy là Outside Procedure mà lại Invalid nữa.

le tin
19-08-08, 09:44 AM
Bài này dùng Advanced Filter thôi, kết hợp với code VBA nữa là thành tự động!
Xem file nhé
Nếu mình muốn tìm một vài chữ trong đó có được không bạn.
Ví dụ đánh 16 thì liệt kê tất cả mã...16... như 2316,1642,6516956,...

le tin
19-08-08, 09:48 AM
Nếu mình muốn liệt kê những mã có liên quan được không các bạn.
Ví dụ đánh 16 thì cho ra ...16...như 1654,2416,12316547,...

hong gam
19-08-08, 09:49 AM
Tại em không biết đầu code là ở đâu. BÁc đừng cười em nhé. cám ơn bác đã chỉ dẫn.
Các bác ơi. còn nếu khi ta nhập password mà nhập sai, sẽ có xuất hiện 1 msbox thông báo để mình nhập lại cho đúng, code của nó ra sao vậy các bác. và thêm nó vào chỗ nào ạh.

Po_Pikachu
19-08-08, 09:52 AM
Ý bạn nói là nút Button1 (Unportect) đó phải không? Nếu vậy bạn thêm vào như sau:

Sub Button1_Click()
If UCase(InputBox("Nhap password : ", "Unprotect")) = "DANH" Then
ActiveSheet.Unprotect "DANH"
Else
MsgBox ("nhap lai password nha!")
Call Button1_Click
End If
End Sub

hong gam
19-08-08, 10:13 AM
Rất Ok bác Po_Pikachu ạh.
Trong tưường hợp này, Khi mình protec file thì mình đâu thể lọc auto filter như cách làm của bác ndu được phải không ạh.

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$2" Then Set DS = [A4].CurrentRegion DS.AdvancedFilter Action:=1, CriteriaRange:=Range("B1:B2")End IfEnd Sub
và không biết có cách nào kết hợp được auto filter không vậy các bác.

ndu96081631
19-08-08, 10:26 AM
Rất Ok bác Po_Pikachu ạh.
Trong tưường hợp này, Khi mình protec file thì mình đâu thể lọc auto filter như cách làm của bác ndu được phải không ạh.
[/font][/color][/b]
và không biết có cách nào kết hợp được auto filter không vậy các bác.

Này nhé: điều đầu tiên là thí nghiệm! Bạn thử với 1 file chưa có code gì cả... hảy Protect sheet lại xem có AutoFilter đựoc không?
Để ý khi protect sheet lại (làm bằng tay) thì có 1 hộp chọn hiện ra, trong list chọn có mục "Use AutoFilter".. tức cho phép Filter ngay cả khi sheet đã được protect
Vậy bạn hãy record macro quá trình này xem thử nếu ta protect sheet và check vào mục "Use AutoFilter" thì macro ghi lại thành code gì?

hong gam
19-08-08, 10:39 AM
Này nhé: điều đầu tiên là thí nghiệm! Bạn thử với 1 file chưa có code gì cả... hảy Protect sheet lại xem có AutoFilter đựoc không?
Để ý khi protect sheet lại (làm bằng tay) thì có 1 hộp chọn hiện ra, trong list chọn có mục "Use AutoFilter".. tức cho phép Filter ngay cả khi sheet đã được protect
Vậy bạn hãy record macro quá trình này xem thử nếu ta protect sheet và check vào mục "Use AutoFilter" thì macro ghi lại thành code gì?
dạ lúc này ở module có 1 code macro như sau:
Sub Macro1()
'
' Macro1 Macro
' Macro recorded 19/08/2008 by matrix
'
'
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
False, AllowFiltering:=True
Range("E6").Select
End Sub
Vây nếu trong trường hợp này thì em phải làm sao để vừa protec sheet ( chỉ chừa lại cells mình không muốn protec), vừa auto file được ạh.
-------
Bổ sung:
Khi em sort autofilter thì code lại thay đổi như sau:
Sub Macro1()
'
' Macro1 Macro
' Macro recorded 19/08/2008 by matrix
'
'
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
False, AllowFiltering:=True
Range("F6").Select
Selection.AutoFilter Field:=5, Criteria1:="kt pc"
Range("F22").Select
Selection.AutoFilter Field:=5
Selection.AutoFilter Field:=6
Range("E6").Select
Selection.AutoFilter Field:=5, Criteria1:="K.toaùn tröôûng"
Range("G45").Select
Selection.AutoFilter Field:=5
Range("E6").Select
Application.WindowState = xlMinimized
Selection.AutoFilter Field:=5, Criteria1:="B?o v?"
End Sub

Thiệt là thiên biến vạn hóa.em bị gà mờ luôn rồi.

Po_Pikachu
19-08-08, 11:12 AM
Mình không biết bạn Fillter bao nhiêu dữ liệu nữa, thôi thì bạn tự copy thêm code và fillter từ từ vậy. Đây là ví dụ để fillter theo mã số, bạn nhập 1 mã số vào thì nó lập tức nhảy ra dòng đó thôi, được không? Code nằm trong Sheet1 đó.

lehuyluan
19-08-08, 12:46 PM
Kính chào các bác.Sau khi đã được các bác giúp đỡ,Giờ em lại nảy sinh ý tưởng mới không biết có khả thi hay không.
Yêu cầu của em thế này:
1. Ngay khi nhập mã số vào ô màu vàng.khi nhấn Enter dấu nháy chuyển sang ô C3
2. Tại ô màu xanh. em muốn tại đây mình nhập ngày tháng vào thì dữ liệu ngày tháng sẽ được cập nhập xuống vị trí còn trống bắt đầu tính từ cột Giao lần 1... đến nhập kho. nếu cột giao lần 1 đã có dữ liệu ngày tháng thì nó sẽ bỏ qua và chạy sang cột giao lần 2...
vẫn tại ô màu xanh. khi em đã nhập dữ liệu cho cột (vi dụ cột lần 2) em muốn nhập thêm vào cột lần 3 thì em muốn tiếp tục gõ thêm lần nữa thi dữ liệu se vào ô giao lần 3
Sau khi nhập xong cho Lô hàng. Em tìm tên hàng mới và bắt đầu nhập thì dữ liệu các ô trước không được thay đổi chứ mất hết thì ... chết quá.

Em xin chân thành cảm ơn vì đã được giúp đỡ tận tình.

hong gam
19-08-08, 01:42 PM
Bác ndu ơi, em làm theo cách hướng dẫn của bác ở bài số #8, khi gõ mã số thì rất ok còn khi em xóa mã số trong ô điều kiện này thì mày trả về hiện trạng ban đầu không được, em chờ hoài mà máy chỉ bung ra được vài dòng rồi cứ chạy nhưng không bung hết dòng được. em nhấn escap thì máy hiện thông báo có 3 chọn lựa trong đó có 1 chữ end. File em có dữ liệu khoảng gần 1000kb, sheet mà em cần sd auto filter khoảng 1000 dòng. Không biết có thể nhanh được hơn không vậy bác

Po_Pikachu
19-08-08, 01:47 PM
Vậy cũng dễ thôi! Bạn xem code mình bổ sung.

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$2" Then
Set DS = [A4].CurrentRegion
DS.AdvancedFilter Action:=1, CriteriaRange:=Range("B1:B2")
[C2].Select
End If
If Target.Address = "$C$2" And [C2].Value <> "" Then
k = Range("B2").Value
For i = 5 To Range("B5").End(xlDown).Row
If Cells(i, 2).Value = k Then
Cells(i, Range("B" & i).End(xlToRight).Column + 1) = Cells(2, 3)
Cells(i, Range("B" & i).End(xlToRight).Column + 1).Select
End If
Next
End If
End Sub

hong gam
19-08-08, 02:44 PM
Bác Po_Pikachu ơi, vậy nếu cái file bác vừa up lên này có thể kết hợp chung với protec cell được không ạh ( tức là cũng nhập dữ liệu vào ô quy định và tự động ghi vào nơi mình muốn).
Về phần protect cell như các bác đã giúp đỡ là trong 1 sheet, vậy nay muốn cả file được không ạh.
Em đ1ung là đòi hỏi nhiều quá. Bác đừng buồn em nhé, mong được sự giúp đỡ.

Po_Pikachu
19-08-08, 02:59 PM
Bạn xem file nha!
Nếu bạn muốn Sheet nào khóa thì thêm lệnh protect và thêm password đặt kế bên thôi. Ví dụ: Tôi muốn khóa Sheet có tên là THN và HNB với password là DANH thì viết như sau:

Sheets("THN").Protect "DANH"
Sheets("HNB").Protect "DANH"
Cái này là sử dụng tên của sheet, còn sử dụng thứ tự của Sheet, như Sheet THN có thứ tự là Sheet1, Sheet HNB có thứ tự là Sheet3. Thì viết code như sau:

Sheet1.Protect "DANH"
Sheet3.Protect "DANH"

hong gam
19-08-08, 04:17 PM
Em đã xem file của bác, cách này đỡ phải làm 1 button để gõ pass mà cứ vào tool để làm. Đơn giản và gọn hơn nhiều.
Em mở vbe ra thấy đoạn code sau:



Private Sub Worksheet_Change(ByVal Target As Range)
Sheet1.Unprotect "DANH"
If Target.Address = "$B$2" Or Target.Address = "$C$2" Then
Target.Locked = False
Else
Target.Locked = True
End If
If Target.Address = "$B$2" Then
Set DS = [A4].CurrentRegion
DS.AdvancedFilter Action:=1, CriteriaRange:=Range("B1:B2")
[C2].Select
End If
If Target.Address = "$C$2" And [C2].Value <> "" Then
k = Range("B2").Value
For i = 5 To Range("B5").End(xlDown).Row
If Cells(i, 2).Value = k Then
Cells(i, Range("B" & i).End(xlToRight).Column + 1) = Cells(2, 3)
Cells(i, Range("B" & i).End(xlToRight).Column + 1).Select
End If
Next
End If
Sheet1.Protect "DANH"
End Sub


Nhờ bác giải thích hộ em ý nghĩa của đoạn code em tô đỏ ạh.
Thanks

Po_Pikachu
19-08-08, 04:35 PM
Vầy nha!
If Target.Address = "$C$2" And [C2].Value <> "" Then | Nếu vị trí con trỏ chuột đặt vào ô C2 và ô C2 đó để trống thì
k = Range("B2").Value | Lấy giá trị của ô B2 đặt vào biến K
For i = 5 To Range("B5").End(xlDown).Row | Chạy dòng lệnh For bắt đầu từ 5 đến (số dòng bắt đầu từ ô B5)
If Cells(i, 2).Value = k Then | Nếu dòng i cột 2 có giá trị đúng bằng biến k thì
Cells(i, Range("B" & i).End(xlToRight).Column + 1) = Cells(2, 3) | dòng i cột (số cột bắt đầu từ (cột B dòng i) + 1) có giá trị bằng dòng 2 cột 3
Cells(i, Range("B" & i).End(xlToRight).Column + 1).select | dòng i cột (số cột bắt đầu từ (cột B dòng i) + 1) được chọn
End If | kết thúc lệnh IF
Next | tiếp của lệnh For...next
End If | kết thúc lệnh IF

Lệnh End(xlDown): có nghĩa là lấy hết đến cuối
Lệnh End(xlToRight): có nghĩa là lấy hết đến bên phải
Không biết dịch như vầy bạn có hiểu không nhỉ? Nó cũng như cách bạn hỏi thôi nhưng bằng ngôn ngữ VBA!
Thân.

Po_Pikachu
19-08-08, 05:08 PM
Bạn quá khách sáo rồi, giúp được mọi người là niềm vui mà.
Chúc bạn sớm ngày giỏi Excel nha!
(Nhờ Mod xóa giùm vào hôm sau nha! Thanks)

lehuyluan
19-08-08, 06:17 PM
ok em đã xem và cũng hiểu ra được nhiều vấn đề.Có cái là mỗi khi em enter tại ô c2 thì chuột một là xuống dưới hoặc sang 2 phía.Có cánh nào tại vị trí đó mình cố định được chuột để nhập tiếp giá trị khác không phải click chuột lại không bác Po_pi.Và cái nữa là em chỉ muốn các số liệu được nhập đến khu nhập kho thì ko cho di chuyển thêm nữa.Ngừng tại đó, nếu có nhập thêm thi ko được.Thank bác

hoang_B
19-08-08, 06:43 PM
Vậy thì bạn làm cho ô đó cố định luôn nếu nhập dữ liệu vào thì lúc nào nó cũng trở về chổ đó thôi!
Ví dụ:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$3" Then
Range("C3").Select
End If
End Sub
Còn đối với khu vực khác thì không thể di chuyển ra được thì mình dùng code đơn giản như sau. Ví dụ: Khóa khu vực A1:J10 không thể nhập dữ liệu ở vùng khác được. Cũng không thể thao tác gì ở các ô bên ngoài luôn.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row > 10 Then
Cells(Target.Row - 1, Target.Column).Select
ElseIf Target.Column > 10 Then
Cells(Target.Row, Target.Column - 1).Select
End If
End Sub
Tất cả code này phải đặt trong Sheet (VBA) mới có tác dụng. Bạn thử xem!

lehuyluan
19-08-08, 07:02 PM
em đã thử nhưng...không được. chuột không trở lại vị trí c2 như mình mong muốn đê nhập tiếp dữ liệu
phiền bác up file giùm em

hoang_B
19-08-08, 07:09 PM
Mình quên là bạn đang nói về C3, nên trong ví dụ mình để mở B2. Mình sữa lại code rồi đó, bạn làm lại xem có đúng không?!

hong gam
20-08-08, 11:44 AM
mình tập hợp những gì các bác chỉ và đưa vào file câu sub sau:

Sub worksheet_change(ByVal target As Range)
ActiveSheet.unprotect "DANH"
If target.Address = "$B$2" Or target = "" Then
target.Locked = False
Else
target.Locked = True
End If
If target.Address = "$B$2" Then
Set DS = [A4].CurrentRegion
DS.AdvancedFilter Action:=1, CriteriaRange:=Range("B1:B2")
End If
Sheet4.Protect "DANH"
Sheet3.Protect "DANH"
End Sub
active sheet ở đây là sheet 4
thế nhưng nó chỉ cho nhập vào mỗi B2 thôi, những cell trống khác không có dữ liệu vẫn không cho mình nhập liệu vào nếu không unprotec sheet.
Cácc bác xem giúp mình xem phải điều chỉnh sao nhé.

hoangdanh282vn
20-08-08, 11:59 AM
mình tập hợp những gì các bác chỉ và đưa vào file câu sub sau:

active sheet ở đây là sheet 4
thế nhưng nó chỉ cho nhập vào mỗi B2 thôi, những cell trống khác không có dữ liệu vẫn không cho mình nhập liệu vào nếu không unprotec sheet.
Cácc bác xem giúp mình xem phải điều chỉnh sao nhé.

Code đúng rồi, chỉ có điều thiếu chút thôi, bạn có thể chọn toàn bộ cell và bỏ check locked, sau đó mới sử dụng code hay thêm đoạn code sau vào đầu code của bạn

Cells.Locked = False

hong gam
20-08-08, 12:07 PM
Bác Danh ơi, em chỉ muốn khóa cells có dữ liệu thôi ( ngoại trừ cell b1 và b2) còn cells trống thì vẫn cho nhập liệu. còn khi toàn bộ cell và bỏ check locked và thêm đoạn code này thì vẫn kháo sheet nhưng lại chình sửa được dữ liệu.

lehuyluan
20-08-08, 12:14 PM
em đã làm như bác pi chỉ nhưng khi nhập ngày tháng vào file gốc của em thì không được.ở dưới không thấy hiện ngày tháng.Đây là file gốc tại ô em nhập dữ liệu (là ô B5 ).Không biết em đã làm sai bước nào.Mong được các bác chỉ giúp.

Po_Pikachu
20-08-08, 12:26 PM
em đã làm như bác pi chỉ nhưng khi nhập ngày tháng vào file gốc của em thì không được.ở dưới không thấy hiện ngày tháng.Đây là file gốc tại ô em nhập dữ liệu (là ô B5 ).Không biết em đã làm sai bước nào.Mong được các bác chỉ giúp.
Bạn xem lại code nha!
Mình sửa song, nhưng quên mất sai chổ nào rồi!
Thân.

Po_Pikachu
20-08-08, 12:32 PM
Còn khi toàn bộ cell và bỏ check locked và thêm đoạn code này thì vẫn kháo sheet nhưng lại chình sửa được dữ liệu.
Còn việc này thì mình không hiểu bạn muốn thế nào cả, bạn có thể nói rõ hơn không?
Thân.

lehuyluan
20-08-08, 12:32 PM
Hix.Hôm qua đến giờ em loay hoay mãi mà không tìm ra lý do+ nguyên nhân.Thật thấy bất tài vô cùng.code có sẵn rồi mà không biết làm sao....Thank bác đã giúp đỡ nhiệt tình.tuy rằng em không biết bác sửa thế nào hix hix.

Po_Pikachu
20-08-08, 12:38 PM
Bạn mở code của hai file ra (1 là của bạn gửi lên diễn đàn, 2 là của mình mới gửi) rồi so sánh vị trí khác nhau rồi thắc mắt xem tại sao mình lại sửa như vậy! Thì ra liền.
Không phải mình không biết bạn sai chổ nào nhưng làm vậy thì bạn sẽ nhanh giỏi hơn.
Học từ cái sai của mình thì sẽ tiến bộ từng ngày. Mình ngày trước cũng vậy, nên truyền cho bạn kinh nghiệm này nha!
Chúc thành công!

lehuyluan
20-08-08, 12:45 PM
À bác có thể làm cho khi nhập hết khu vực qui định chẳng hạn như file của em đến cột kết lô thi minh nhập thêm không được và chuột chuyển sang ô A5 để mình tìm tên hàng khác được không?
Làm phiền bác thêm lần nữa vậy

hong gam
20-08-08, 01:14 PM
Còn việc này thì mình không hiểu bạn muốn thế nào cả, bạn có thể nói rõ hơn không?
Thân.
mình tập hợp những gì các bác chỉ và đưa vào file câu sub sau:



Sub worksheet_change(ByVal target As Range)
ActiveSheet.unprotect "DANH"
If target.Address = "$B$2" or target.value = "" Then
target.Locked = False
Else
target.Locked = True
End If
If target.Address = "$B$2" Then
Set DS = [A4].CurrentRegion
DS.AdvancedFilter Action:=1, CriteriaRange:=Range("B1:B2")
End If
Sheet4.Protect "DANH"
Sheet3.Protect "DANH"
End Sub
active sheet ở đây là sheet 4
thế nhưng nó chỉ cho nhập vào mỗi B2, B3 thôi, những cell trống khác không có dữ liệu vẫn không cho mình nhập liệu vào nếu không unprotec sheet.
Sau khi nhìn lại file bác vừa gởi, mình bổ sung thêm value ( màu đỏ đậm). nhưng vẫn không được.
Ý mình muốn vừa auto fillter, vừa protec những cell có dữ liệu sau khi file được save, còn những cell trống thì không bị khóa.

Po_Pikachu
20-08-08, 01:18 PM
À bác có thể làm cho khi nhập hết khu vực qui định chẳng hạn như file của em đến cột kết lô thi minh nhập thêm không được và chuột chuyển sang ô A5 để mình tìm tên hàng khác được không?
Làm phiền bác thêm lần nữa vậy
Xong rồi nè!
Có 1 lệnh chờ bạn kích hoạt, bạn thử đi, thú vị lắm đó.
À, cái chương trình này cứ Enter không ha, đã quá nhỉ, không biết có ly kem nào không ta! Nógn quá! !$@!!
Bạn xem file nha!
Thân.

lehuyluan
20-08-08, 01:21 PM
oke ! ly kem thì chuyện nhỏ. nếu không phiền bác cứ cho cái hẹn ( em o sài gòn ) anh em mình làm chầu cafe làm quen. OK

Po_Pikachu
20-08-08, 01:25 PM
mình tập hợp những gì các bác chỉ và đưa vào file câu sub sau:
active sheet ở đây là sheet 4
thế nhưng nó chỉ cho nhập vào mỗi B2, B3 thôi, những cell trống khác không có dữ liệu vẫn không cho mình nhập liệu vào nếu không unprotec sheet.
Sau khi nhìn lại file bác vừa gởi, mình bổ sung thêm value ( màu đỏ đậm). nhưng vẫn không được.
Ý mình muốn vừa auto fillter, vừa protec những cell có dữ liệu sau khi file được save, còn những cell trống thì không bị khóa.
Trước hết bạn nên bỏ khóa (ý là nhập pass mở Protect), rồi sau đó chọn toàn bộ dữ liệu -> Chọn Format Cells -> chọn tab Protection -> Bỏ chọn mục Locked -> OK. Vậy thì file của bạn sẽ chạy được. Còn muốn vừa auto fillter được thì khi khóa phải viết như sau:
Sheet1.Protect Password:="DANH", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True

hong gam
20-08-08, 01:46 PM
Trước hết bạn nên bỏ khóa (ý là nhập pass mở Protect), rồi sau đó chọn toàn bộ dữ liệu -> Chọn Format Cells -> chọn tab Protection -> Bỏ chọn mục Locked -> OK
nếu như vậy thì file đều điều chỉnh được hết dù đã khóa sheet, không đúng với điều kiện được đặt ra.
Ngoài ra, file chỉ cần nhập liệu, enter xong là tự động protect chứ không chờ được đến khi save file.
Sub trên mình post lên, file mình vẫn auto filter rất tốt khi chưa có chèn thêm code mới mới của bác.
Bác xem và chỉ hộ mình nhé.thanks

Po_Pikachu
20-08-08, 02:01 PM
Bạn gửi file lên lại đi!
Mình thấy bạn nói có vẻ kô đúng lắm đâu. Mình test code lại thấy nếu không bỏ Locked trước thì các ô trống không thể nhập dữ liệu được.
Thứ hai, nếu bạn không dùng code thêm của mình thì mình vẫn không thể nào Fillter được, code báo lỗi ở dòng Fillter khi nhấn vào B2.
Mình không hiểu bạn đặt code ở đâu vậy.
Thân.

hong gam
20-08-08, 02:20 PM
Ok. để mình đưa file lên cho bác xem hộ.ở sheet 4 ( ban hang) va sheet 3 (Quy). mình muốn khóa những ô có dữ liệu .Riêng sheet 4 thì cả b1 và b2 có dữ liệu vẫn không khóa.
bạn xem lại sub và test hộ mình 2 sheet đó nhé.
thanks

Po_Pikachu
20-08-08, 02:38 PM
Vậy thôi!
Đúng ý rồi nha!
Thân.

hong gam
20-08-08, 03:03 PM
Bác Po_pikachu ơi ,có thể sau khi nhấn save thì mới protect được không chứ cứ sau khi di chuyển cll hay enter bị protect liền thì không ổn lắm bác ạh.
Ở sheet 3, mình không cần ghi sub mà ghi thêm vào gần cuối sub ở sheet 4 như hôm qua bác hướng dẫn được chứ?
Sheet4.Protect "DANH"
Sheet.Protect "DANH"
End Sub
Cám ơn bác đã giải thích ý nghĩa khác nhau của 2 sub ( thú thật trước đây mình thắc mắc nhưng chưa có dịp hỏi)

Po_Pikachu
20-08-08, 03:11 PM
Nếu sau khi save mới Protect thì việc các dữ liệu có sẳn cũng có thể bị thay đổi thì sao đây?

Còn việc thêm Sheet3.Protect "DANH" thì mình không nói nhưng bạn nói rằng Sheet (Quy) chỉ khóa các ô có dữ liệu thôi còn ô trống thì có thể thêm dữ liệu vào thì sao? Vì lệnh này chỉ khóa các ô đã được Locked thôi. Mà bên Quy không có gì làm thay đổi được lệnh Locked (true hay False) thì mặc định sao sẽ để y vậy. Tức là ô nào Locked rồi thì không sửa được, còn chưa thì bạn thêm sửa tùy ý đó.

hong gam
20-08-08, 03:30 PM
dạ đúng rồi. sheet 3 chính là sheet Quy đó bác.
những ô trống thêm dữ liệu vô tư. ô có dữ liệu sau khi lưu, chỉ khi unprotect với đúng pass thì mới được chỉnh sửa
Những ô nhập liệu xong, chưa lưu, cũng vẫn chỉnh sửa được.

Po_Pikachu
20-08-08, 03:40 PM
Sao không nói sớm. Vậy xem như code bên Sheet3 không cần thiết.
Vậy còn code bên Sheet "Ban Hang" thì sao, bạn cho người ta nhập những chỗ trống và ô B1, B2 thôi còn ô khác thì chỉ có bạn mới thay đổi được đúng không?

Nếu muốn sau khi nhấn Save thì hai sheet tự Protect thì nhập 1 đoạn code này vào trong ThisWorkbook nữa.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Sheet3.Protect "DANH"
Sheet4.Protect "DANH"
End Sub

hong gam
20-08-08, 04:27 PM
Bác Hiểu Gần đúng ý Em Rồi. ở đây Không Chỉ Sheet Ban Hang Mà Sheet Quy Cũng Vậy. đều Phải Có Pás Mới Chỉnh Sửa ô Có Dữ Liệu SAU KHI ĐƯỢC LƯU. Mình Không Bỏ Sub ở Sheet 3, Mình Vẫn Giữ Nguyên Tuy Nhiên, Nó Vẫn Tự Save Sau Khi Di Chuyển Hay Enter

hong gam
20-08-08, 04:42 PM
Mình đóng file và mở lại để kiểm tra. Mình Chỉ cần di chuyển sang ô khác, enter hay 1 cái lick chuột bất cứ nơi đâu đều khiến sheet tự động protect hết. nhờ bác giúp nốt ạh.
em chuyển lại file

Po_Pikachu
20-08-08, 04:56 PM
Thì chẳng phải đã Protect rồi sao!
Nếu bạn nghỉ rằng muốn khóa cả những ô không có dữ liệu luôn thì chỉ cần bỏ dòng này đi là xong.

Target.Locked = False
Else

hong gam
20-08-08, 05:04 PM
Dạ đúng rồi mình muốn protec tất cả cell có dữ liệu trong 2 sheet này.
Tuy nhiên cell có dữ liệu chỉ được khóa không cho chỉnh sửa sau khi save thôi còn chưa save họ vẫn chỉnh sửa được. ai có pass unprotec thì mới chỉnh được.
Riêng đối với sheet 4 ( ban hang) thì còn auto filter được đồng thời riêng 2 cell B1:B2: được phép chỉnh sửa khi có dữ liệu sau khi save.

Po_Pikachu
20-08-08, 06:02 PM
File này có những tính năng sau:
+Sheet4 (BAN HANG):
-Sheet tự khóa
-Có thể nhập dữ liệu ở ô B1 và B2
-Có thể nhập dữ liệu ở các ô trống
-Các ô có dữ liệu sẽ bị khóa hết, ngoại trừ B1 và B2 và các ô trống
+Sheet3 (QUY):
-Sheet tự khóa
-Các ô có dữ liệu thì tự khóa, các ô trống thì có thể nhập liệu được
+File:
-Khi save lại rồi thì file sẽ tự khóa sheet4 và sheet3
+Chủ (boss):
-Muốn được thoải mái sửa dữ liệu thì phải mở sheet5 (loc chua tien) ra, sửa ô A1 = 1 thì mới sửa chữa dữ liệu ở Sheet 4 và 3 thoải mái được.
-Bạn nên đặt thêm password cho VBA luôn là tốt rồi!
-Để đặt pass cho VBA, bạn vào Tools -> VBAProject Properties -> Chọn tab Protection -> nhấp chọn ô Lock và nhập hai pass giống nhau vào hai ô trống ở dưới -> OK.

Nếu không muốn nhập dữ liệu ở các ô trống thì là như thao tác ở mục #75.
Thân.

hong gam
21-08-08, 09:28 AM
Cám ơn bác.
Việc khóa pass cho VBA em vẫn sử dụng.
File này mình làm hộ 1 người bạn. Em tính sử dụng form mẫu của bác okebab nhưng vẫn có bất tiện khi khóa sheet thì không filter được. Khi đọc đến chủ đề của bạn lehuyluan, mình thấy hợp với ý muốn của mình. Do vậy mình đã làm phiền các bác.
Mình thấy vấn đề:
[quote]+Chủ (boss):
-Muốn được thoải mái sửa dữ liệu thì phải mở sheet5 (loc chua tien) ra, sửa ô A1 = 1 thì mới sửa chữa dữ liệu ở Sheet 4 và 3 thoải mái được[quote]
thì chỉ ai vô tình xóa dữ liệu A1 tại là vô hiệu háo pass rồi. vậy thì ta cũng đâu cần tạo pass và viết code nữa. cứ tool/protect lại gọn.
Mình thấy bác khóa sheet mà không sử dụng macro có 1 lợi thế : sử dụng được 1 phần tính năng sẵn có của excel nên mình rất thích . Nhưng lại khóa sheet 1 cách hoàn toàn chi có 1 tác động dù rất nhỏ tới file thì lại rất bất tiện.
Để em up form mẫu của bác bab ( chỉ sử dụng cách 2 , ko sử dụng cách 1 vì cách 1 tượng tự của bác Po_Pikachu) lại để bác giúp em nha.

Po_Pikachu
21-08-08, 09:38 AM
Bạn nói là "vô tình xóa dữ liệu A1" thì mình nói là không được. Vì:
1.VBA đã bị khóa
2.Sheet5 (loc chua tien) đã bị ẩn. Mà chỉ có thể mở ẩn này nếu có pass của VBA thôi!
3.Bạn cũng có thể khóa protect được sheet5 cơ mà!

Đây củng là 1 cách hay đấy!

hong gam
21-08-08, 10:41 AM
dạ đúng. Mình muốn chỉnh sửa sau khi lưu vì :
1. người nhập liệu không phải lúc nào cũng nhập đúng 100%. Do vậy họ cần phải kiểm tra lại trước khi save. Sau khi save mới không cho chỉnh sửa.
2. Sau khi lưu thì tất cả dữ liệu được update trước khi save không cho chỉnh sửa. Ở những cell trống, khi có nghiệp vụ phát sinh, họ lại tiếp tục nhập vào các ô trống và dữ liệu vừa nhập đó vẫn có thể chỉnh sửa được nếu chưa save.
3. Người chủ chỉ khi cần thiết mới đến mở pass điều chỉnh file thôi chứ họ không có mặt thường xuyên ở đó.
còn ở những code trên là hoàn toàn không chỉnh sửa nếu có sự di chuyển dù file đó vừa nhập liệu xong chưa lưu. khi thay đổi giá trị A1 tại sheet lọc chua tien thì xem như vô hiệu hóa toàn bộ lệnh protect sheet mà không thay đổi được số liệu vị trí A1 thì thật bất tiện nếu ai đó lỡ gõ lộn 1 ký tự vào file.
Tiện đây nhờ bác giúp giải thích giùm mình ý nghĩa của code này nha:


Selection.SpecialCells(xlCellTypeConstants, 23).Locked = True
Selection.SpecialCells(xlCellTypeFormulas, 23).Locked = True

Thanks

Po_Pikachu
21-08-08, 11:12 AM
Bạn thử lại xem còn gì thiếu xót không nha!
Mình có làm thêm 2 chức năng:
1.Là các ô có công thức thì có thể bị ẩn đi hết. Bạn có thể bỏ tính năng này bằng cách tìm các dòng này và xóa chúng đi.

.Cells.FormulaHidden = False
...
Selection.SpecialCells(xlCellTypeFormulas, 23).FormulaHidden = True

2.Là do dòng này "Selection.SpecialCells(xlCellTypeFormulas, 23).Locked = True" là cho các ô có công thức nhưng chưa có dữ liệu cũng bị khóa nốt. Nên khắc phục nó bằng cách thêm 1 đoạn code trong Sheet để khi khóa rồi mà ô đó (có công thức) vẫn trống thì có thể nhập công thức khác hoặc nhập dữ liệu trực tiếp.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Sheet4.prot1.Caption = "UnProtect" And Target.Value = "" Then
Sheet4.unprotect "DANH"
Target.Locked = False
Sheet4.Protect "DANH", True, True, True
End If
End Sub
Do tính năng quá nhiều khi save nên tình trạng save có thể hơi lâu hơn bình thường. Bạn đừng can thiệp vào hệ thông nha!
Nếu không sẽ bị treo máy đó.
Nghĩa:
Selection.SpecialCells(xlCellTypeConstants, 23).Locked = True | Tìm tất cả các ô có giá trị và đặt lệnh khóa chúng lại
Selection.SpecialCells(xlCellTypeFormulas, 23).Locked = True | Tìm tất cả các ô có công thức và khóa chúng lại

Thân.

ndu96081631
21-08-08, 11:18 AM
Tiện đây nhờ bác giúp giải thích giùm mình ý nghĩa của code này nha:

Selection.SpecialCells(xlCellTypeConstants, 23).Locked = True
Selection.SpecialCells(xlCellTypeFormulas, 23).Locked = True Thanks
Bạn thí nghiệm như sau:
1> Mở 1 file mới và gõ nhăng nhít gì đó vào 1 vài cell (có thể gõ cell cách cell)
2> Chọn nguyên cả vùng này
3> Bật chức năng Record macro lên
4> Bấm Ctrl + G\Special\Constants rồi OK
5> Bấm Ctrl +1, trong tab Protection bạn check vào Locked
6> Tắt Record macro, bấm Atl + F11 và xem chúng viết cái gì
Thí nghiệm tiếp: Cũng làm thế nhưng bước 4 bạn chọn món khác trong hộp Goto rồi xem code... Từ đó bạn có thể suy ra được rất nhiều trò hay (cả Current Region mà nhiều bạn đã từng hỏi cũng có trong này)
Ghi chú:
Trong hộp Goto bạn đếm từ trên xuống, từ trái qua phải, bạn thấy mục Constants nằm ở vị trí thứ 2, đúng không? vậy có thể thay:

Selection.SpecialCells(xlCellTypeConstants, 23)
Thành

Selection.SpecialCells(2, 23)
Quá tuyệt !!!

hong gam
21-08-08, 12:38 PM
Po_phikachu ơi. Vậy lại phải làm 2 button macro rồi.
Mình vào file của mình, mình tạo button bằng view/ toolbar/ form. rồi cho record macro với tuần tự tên prot1_lick() và pròt_lick(). sau đó copy toàn bộ các câu lệnh từ file bạn đính kèm vào file mình nhưng vẫn báo lỗi. ( lý do mình muốn tự thực hành làm macro này và file mình gởi lên cho bạn có vài sheet cho nó nhẹ ( trong đó có 2 sheet chính ) trong khi đó file gốc mình có nhiều sheet lắm.

Po_Pikachu
21-08-08, 01:16 PM
Tạm thời gửi bạn file này theo ý bạn, nhưng mình còn hai điều chưa khắc phục được.
1.Là khi bạn quét chọn 1 khu vực nào đó thì nó tự động khóa lại.
2.Là những ô có công thức nhưng chưa có giá trị thì có cái Locked = False, có cái Locked = True. Mình không hiểu sau không thể khống chế được các ô đó.
Không biết các cao thủ khác có ý kiến gì không?

@hong gam: Nếu bạn đặt code vào trong module thì các nút lệnh Protect (Unprotect) phải đặt cùng tên (NAME), và nhớ đặt lại code trong Thisworkbook. Nhưng cũng có cái lợi là bạn chỉ copy button đó qua các sheet và cùng 1 code gọi nút lệnh cho tất cả các sheet luôn.

hong gam
21-08-08, 01:27 PM
Cám ơn bác Po_Pikachu đã rất nhiệt tình giúp đỡ. Đôi khi button ở chế độ unprotec nhưng các cell có dữ liệu cũng không chịu lock. Các bác cao thủ ơi, mong các bác giúp vấn đề của em ạh.

Po_Pikachu
21-08-08, 02:15 PM
Bạn có thể chỉ mình được không? Mình thấy các ô có dữ liệu luôn khóa mà!
Chỉ có rắc rối ở các ô trống có công thức thôi. Mình cũng đã khắc phục được tình trạng quét chọn bị khóa rồi!
Thân.

hong gam
22-08-08, 03:48 PM
thật cám ơn bác lắm lắm. Nay mình lại vấn đề.
1. mình hide sheet loc chua tien roi mà unhide không được. Mình vào format/sheet để unhide nhưng chữ này bị mờ. mình mỡ pás cho 2 sheet có code vba rồi nhưng vẫn không được. làm giúp mình với nha. thanks.

Po_Pikachu
22-08-08, 04:42 PM
Bạn vào VBA, click chuột vào Sheet 5 "Loc chua tien" rồi tìm trong khung ở dưới mục cuối cùng Visible bạn sửa mục kế bên là "-1 - xlSheetVisible". Là nó sẽ hiện lên à.
Lệnh "2 - xlSheetVeryHidden" là siêu ẩn, ngay cả lệnh Unhide cũng không thể thấy được! Nên khi khóa VBA rồi thì cũng khá yên tâm là không ai có thể mở được từ ngoài đâu!
Đây cũng là 1 tuyệt chiêu đấy nhé!
Thân.

hong gam
23-08-08, 03:57 PM
Mình vào file gốc, mình tạo 2 button bằng view/ toolbar/ form ở 2 file cần khóa cell rồi cho record macro với tuần tự tên prot1_lick() và prort2_lick(). sau đó copy toàn bộ các câu lệnh từ file bạn đính kèm vào file mình nhưng vẫn báo lỗi. ( lý do mình muốn tự thực hành làm macro này và file mình gởi lên cho bạn có vài sheet cho nó nhẹ ( trong đó có 2 sheet chính ) trong khi đó file gốc mình có nhiều sheet lắm.
Tuy nhiên mình copy lệnh của bạn vào, mình phát hiện nó có tới có 2 sub là ajh và dsf. mình mở phần macro thì nó chính là macro.
Ở nút button bạn thiết kế là unprotect và protec.Vây mình phải làm như thế nào ạh. Nhờ các bác hướng dẫn mình nhé.
---
Ah bác po_pikachu ơi, ở sheet 3, ở sheet ban hang thì ok nhưng sheet Quy thì sau khi nhập liệu, di chuyển sang vùng khác là cell tự khóa vẫn không cho sửa khi chưa save.

Po_Pikachu
23-08-08, 05:51 PM
Lệnh button trong thanh Form đó là dạng nút lệnh bằng hình nên khi kích hoạt thì nó sẽ lấy code (Hay mình gọi là Macro) trong Module. Nên bạn copy code trong Sheet thì sẽ không chạy đâu!
Muốn dùng code trong Sheet thì phải dòng thanh Control Toolbox, và gọi lệnh Button ra.
Bạn để ý, lệnh button trong Form thì khi bạn chọn nó xong thì nó sẽ hiện thị 1 bảng Macro để chọn Macro chạy nó.
Còn Button trong Control Toolbox thì không thấy có hiện tượng gì hết. Mà bạn phải nhấp đúp chuột vào nó thì trong Sheet sẽ có dòng chữ "Private Sub CommandButton1_Click()" để bạn thiết lập lệnh thực thi cho nó!
Đó là hai sự khác biệt lớn về hai lệnh này.
À, việc này là do mình đang tìm cách sử lý việc các ô có công thức mà chưa hiện dữ liệu lên. Mình đã copy thử sang sheet Quy xem có tác dụng không! Rồi quên xóa đi đó mà. Bạn sửa code lại như vầy là được liền! Mặt dù tình huống đó vẫn còn bế tắt! Chẳng biết làm sao để hết cả! Mong bạn thông cảm nha!

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo loi
If Sheet3.prot1.Caption = "UnProtect" And Target.Value = "" Then
Sheet3.unprotect "DANH"
Target.Locked = False
Sheet3.Protect "DANH", True, True, True
End If
loi:
Exit Sub
End Sub
Còn hai sub ajh(), dsf() là để thử nghiệm thôi, bạn có thể xóa tự nhiên.
Thân.

hong gam
25-08-08, 05:06 PM
thật cám ơn bác rất nhiều. Bác rất nhiệt tình giúp em cũng đâu dám trách. em còn chưa biết làm phải nhờ đến bác mà và còn chưa hậu tạ bác nữa

hong gam
27-08-08, 01:47 PM
cám ơn bác Po_pikachu nhé. mình chỉnh sửa câu lệnh và giờ thì đã khắc phục được những vấn đề trên rồi. Mình đang hoàn thiện lại file - loay hoay tạo button cũng khá phê vậy mà các bác làm thiệt lẹ.(chắc làm luôn trên file có lệnh của bác cho tiện quá).

Po_Pikachu
27-08-08, 02:58 PM
Bạn không biết hay bí chỗ nào cứ hỏi, về nút lệnh thì vào Control Toolbox, kéo thả thôi. Nhấp đúp để nhập code. Bạn viết như trên thì bó tay rồi!
Thân.

tuanlichviet
09-08-09, 06:22 PM
chương trình này thật tuyệt nhưng quan trọng nhất trong sổ bảng tính chia sẻ share Workbook thì mất tác dũng các bạn có thể sửa lại được không

phuongc5
03-09-09, 09:20 AM
Bài #4 của anh Ndu rất hay nhưng mà nếu dữ liệu lên đến 5000 dòng thì phải đợi hơi lâu (lúc lọc thì nhanh nhưng lúc bỏ lọc thì đợi lâu). Có cách nào làm cho nó nhanh được không ạ. Vì em lọc theo thủ công thì ấn vào All ở hình tam giác xổ xuống thì rất nhanh.

doantrang57
03-09-09, 12:00 PM
Bài này dùng Advanced Filter thôi, kết hợp với code VBA nữa là thành tự động!
Xem file nhé
Em nhìn pác dùng VBA mà siêu thế, em chưa bít dùng nó như thế nào cả. Nhìn thấy có vẻ tiện ích lắm, Trong diễn đàn mình có bài nào hướng dẫn từ đầu cách dùng vba ko nhỉ. gửi cho bà con mới như em học tập cái coi

ndu96081631
03-09-09, 12:06 PM
Em nhìn pác dùng VBA mà siêu thế, em chưa bít dùng nó như thế nào cả. Nhìn thấy có vẻ tiện ích lắm, Trong diễn đàn mình có bài nào hướng dẫn từ đầu cách dùng vba ko nhỉ. gửi cho bà con mới như em học tập cái coi
Đương nhiên là nó rất "tiện" rồi...
Bạn có thể tập tành VBA bằng cách Record maco
Tiếp theo hãy xem bài viết này:
http://www.giaiphapexcel.com/forum/showpost.php?p=183052&postcount=1163