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á
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 .
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
Tôi record macro quá trình lọc bằng Advanced Filter thôi mà, rất đơn giãnbá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.
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 Sub
Sub Macro1()
Set DS = [A4].CurrentRegion
DS.AdvancedFilter Action:=1, CriteriaRange:= Range("B1:B2")
End Sub
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
Chính xác là: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.
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 A4Set DS = [A4].CurrentRegion
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
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.
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
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á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.
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
Mình sửa lại file cũ của mình tí là xong ấy mà :
PHP: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
Tôi không hiểu bạn đã làm gì trên file mà lại nói là chậm!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
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để 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?để 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
Bác hiểu đúng ý em rồi ah.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?
trước worksheet_change.If Target.Address = "$B$4" Then Exit Sub
thì máy báo lỗi: compile error: invalid outside procedure sau khi nhấn run.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 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
Sub worksheet_change(ByVal target As Range)
On Error Resume Next
[B]If Target.Address = "$B$4" Then Exit Sub[/B]
ActiveSheet.Unprotect "DANH"
If target.Value <> "" Then
target.Locked = True
End If
ActiveSheet.Protect "DANH"
End Sub
[B]If Target.Address = "$B$4" Then Exit Sub[/B]
Sub worksheet_change(ByVal target As Range)
.............
End Sub
Nếu mình muốn tìm một vài chữ trong đó có được không bạn.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é
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
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
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?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.
dạ lúc này ở module có 1 code macro như sau: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ì?
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") [COLOR=red][C2].Select[/COLOR] End If [COLOR=red]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 [/COLOR][COLOR=red] Next End If[/COLOR] End Sub
Sheets("THN").Protect "DANH" Sheets("HNB").Protect "DANH"
Sheet1.Protect "DANH" Sheet3.Protect "DANH"
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
Private Sub Worksheet_Change(ByVal Target As Range)
[COLOR=red]If Target.Address = "$C$3" Then[/COLOR]
[COLOR=red]Range("C3").Select[/COLOR]
[COLOR=red]End If[/COLOR]
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If [COLOR=red]Target.Row > 10[/COLOR] Then
[COLOR=red]Cells(Target.Row - 1, Target.Column).Select[/COLOR]
ElseIf [COLOR=red]Target.Column > 10[/COLOR] Then
[COLOR=red]Cells(Target.Row, Target.Column - 1).Select[/COLOR]
End If
End Sub
active sheet ở đây là sheet 4Sub 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
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é.
Cells.Locked = False
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.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.
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.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.
mình tập hợp những gì các bác chỉ và đưa vào file câu sub sau: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.
active sheet ở đây là sheet 4Sub 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
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á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
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:=Truemì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.
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.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
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheet3.Protect "DANH" Sheet4.Protect "DANH" End Sub
[COLOR=red]Target.Locked = False Else[/COLOR]
+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 đượcthì 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.
ThanksSelection.SpecialCells(xlCellTypeConstants, 23).Locked = True
Selection.SpecialCells(xlCellTypeFormulas, 23).Locked = True
.Cells.FormulaHidden = False ... Selection.SpecialCells(xlCellTypeFormulas, 23).FormulaHidden = True
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
Bạn thí nghiệm như sau:Tiện đây nhờ bác giúp giải thích giùm mình ý nghĩa của code này nha:
ThanksSelection.SpecialCells(xlCellTypeConstants, 23).Locked = True
Selection.SpecialCells(xlCellTypeFormulas, 23).Locked = True
ThànhSelection.SpecialCells(xlCellTypeConstants, 23)
Quá tuyệt !!!Selection.SpecialCells(2, 23)
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
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 coiBà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é
Đương nhiên là nó rất "tiện" rồi...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