Có cách nào chỉ cho nhập dữ liệu vào ô trống còn ô đã có dữ liệu thì không cho nhập? (1 người xem)

Liên hệ QC

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

Status
Không mở trả lời sau này.

sieunhi10079

Thành viên thường trực
Tham gia
26/2/07
Bài viết
230
Được thích
196
Có cách nào giúp em việc này với!

Không biết vấn đề em đưa ra có thể giải quyết được không nữa, vì em thấy khó quá! Vấn đề là: trong một sheet có những ô có dữ liệu và những ô không có dữ liệu. Có cách nào chỉ cho nhập dữ liệu vào ô trống còn ô đã có dữ liệu thì không cho nhập!
Rất mong nhận được sự giúp đỡ của các anh chị!
 
- Mình đố bạn thay đổi được dử liệu của cell đã có nếu không bít pass hìhì !!!
- Tuỳ theo nhu cầu có thể là Workbook cho toàn bộ và WorkSheet cho Sheet.
Mã:
Dim OldValue
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
   OldValue = Target.Cells(1, 1)
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Not IsEmpty(OldValue) And (OldValue <> Target.Cells(1, 1)) Then
        If InputBox("Password:", "Yeu cau nhap Password ""tuan""") <> "tuan" Then
            Application.Undo
        End If
    End If
End Sub
 
Lần chỉnh sửa cuối:
Đây cũng là một cách khóa ô có dữ liệu.
Thực chất là lock các ô có dữ liệu và protect bảng tính khi bảng tính có thay đổi.
Mã:
[/FONT]
[FONT=Verdana]Private Sub Worksheet_Change(ByVal Target As Range)[/FONT]
[FONT=Verdana]On Error Resume Next[/FONT]
[FONT=Verdana]Application.ScreenUpdating = False[/FONT]
[FONT=Verdana]ActiveSheet.Unprotect[/FONT]
[FONT=Verdana]Cells.Locked = False[/FONT]
[FONT=Verdana]Cells.SpecialCells(xlCellTypeConstants, 23).Locked = True[/FONT]
[FONT=Verdana]Cells.SpecialCells(xlCellTypeFormulas, 23).Locked = True[/FONT]
[FONT=Verdana]ActiveSheet.Protect[/FONT]
[FONT=Verdana]End Sub[/FONT]
[FONT=Verdana]
 

File đính kèm

Vấn đề của bạn Sieunhi10079 đề cập cũng khả thi mà, vì trên thực tế có những file bảng tính người ta thiết kế công thức tính toán hoàn chỉnh rồi và khoá công thức lại, phòng tránh trường hợp, sữa chữa, thay đổi làm sai kết quả,v.v...., rồi gởi file cho các đơn vị, thành viên nhập liệu theo những yêu cầu. Lúc đó báo cáo sẽ tự động cho ra kết quả, hoặc sau đó người ta làm thao tác xử lý để cho ra kết quả. Việc này mình thấy hoàn toàn hợp lý.
Ví dụ: một file tính giá thành được thiết kế hoàn chỉnh, qua các công đoạn sản xuất, người ta có thể khoá công thức lại, vì nếu ai đó vọc, thay đổi, sữa chữa thì ảnh hưởng rất nghiêm trọng. Sau đó file được share cho các bộ phận nhập số liệu thô vào, như bộ phận theo dõi định mức sản xuất sẽ cập nhật định mức, kế toán nguyên liệu sẽ cập nhật nguyên liệu xuất sử dụng trong tháng, kế toán thành phẩm thì cập nhật lượng thành phẩm nhập kho, v.v....khi đó người tính giá thành chỉ bấm nút cho chương trình chạy, hoặc công thức đã tự tính và họ chỉ kiểm soát, kiểm tra và phân tích chi phí thôi.
Và việc này excel cũng đã có hỗ trợ hoàn toàn rồi, mình không phải dùng vba đâu.
Các bước thực hiện:
(Sorry! do cách diễn đạt các thuật ngữ hơi bị quên "nói thì dễ mà viết khó quá", để mình xem lại rồi viết tiếp sau nhé.)
 
Để cho nhập dữ liệu vào các ô cho phép, bạn thực hiện như sau:
1. Chọn toàn bộ bảng tính (bấm vào góc trên bên trái bảng tính)
2. Vào Format\ cells\ protection bỏ chọn Locked.
3. Chọn vùng có dữ liệu trên bảng tính cần khoá lại, (không cho nhập liệu vào.)
4. Vào Format\ cells\ protection chọn Locked.
5. Vào Tools\ protection\ protect sheet..\ ở khung "Password to unprotect sheet" bạn gõ password hoặc để trống cũng được, ở khung "Allow all users of this worksheet to:" bạn chỉ chọn "Select unlocked cells"
* Vậy là bạn đã khoá vùng không được nhập liệu rồi đó, lúc này người ta có nhập liệu vào các ô bị khoá sẽ không nhập được (và hay là máy sẽ không báo là bảng tính bị protect...) và họ chỉ nhập được vào các ô mình cho phép thôi.
Chúc các bạn ứng dụng tốt cho công việc của mình.
 
Với hieplv3010: cách của bạn ko dc rồi... bạn đọc kỹ yêu cầu đi... Ý bạn ấy là những cell trống sẽ cho nhập liệu... khi nhập xong thì khóa luôn.. Nói tóm lại phải dùng 1 con macro đễ phát hiện dc cell nào còn trống, cell nào đã có dử liệu đễ cho phép hoặc ko cho phép nhập vào những cell ấy! Bạn hiểu ko?
ANH TUẤN
 
Mình đã đọc nhiều bài rồi nhưng vẫn không có cách giải quyết nào thấu đáo hoặc do mình chưa có biết cách làm:
- Có đoạn code không cho nhập nhưng khi mình chọn một vùng dữ liệu nào đó thì có thể xóa hết được (vùng dữ liệu này bao gồm ô có dữ liệu và không có dữ liệu).
- Có đoạn code thì buộc phải nhập password nhưng vẫn mắc lỗi như trên và nó chỉ cho phép nhập từng ô thôi!
Trong phần này ý của mình là:
- Nhập dữ liệu vào những ô trống, không cho nhập vào những ô có dữ liệu, kể cả các thao tác trên cùng dữ liệu.
- Chỉ khi nhập password mới được phép thao tác trên bảng tính (tức là sửa đổi hay nhập mới tất cả các ô trong bảng tính).
 
Chào Sieunhi
Thật sự không hiểu lắm yêu cầu của bạn. Thôi thì bạn tải file mình làm ví dụ. Nếu chưa đúng yêu cầu thì dựa vào đó mình thay đổi hé.

TDN
 

File đính kèm

Lần chỉnh sửa cuối:
anhtuan1066 đã viết:
Với hieplv3010: cách của bạn ko dc rồi... bạn đọc kỹ yêu cầu đi... Ý bạn ấy là những cell trống sẽ cho nhập liệu... khi nhập xong thì khóa luôn.. Nói tóm lại phải dùng 1 con macro đễ phát hiện dc cell nào còn trống, cell nào đã có dử liệu đễ cho phép hoặc ko cho phép nhập vào những cell ấy! Bạn hiểu ko?
ANH TUẤN
To AnhTuan1066: Cách này là đường hướng đúng đó chứ! Chỉ còn thiếu chút xíu nữa là xong:
Ghi các hoạt động đó thành macro & thực hiện sau mỗi lần nhập vô 1 ô;
Cụ thể như sau:(hướng giải quyết thôi & sẽ cụ thể sau)
Viết vô phần
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
         ... . . 
End Sub
những bước sau:
Mở khóa các ô đã bị khóa = Password;
Dùng lệnh goto để chọn toàn bộ các ô có dữ liệu
Khóa chúng lại = Password
Để làm được ~ điều này đúng là xem bài về Khóa Sheets (trong đó có bài của N&Son nói rất kỹ!!! - đúng như TDN đã nêu)
Tóm tắc: Mở khóa tất cả các ô trong sheets (mặc định excel đã khóa!)
Chép macro NVSơn vô nơi cần thiết!
/)/ếu bạn chưa rõ thì đưa lên 1 file & 1 mã mật khẩu sẽ có người zúp bạn tiếp!
 
sieunhi10079 đã viết:
Trong phần này ý của mình là:
- Nhập dữ liệu vào những ô trống, không cho nhập vào những ô có dữ liệu, kể cả các thao tác trên cùng dữ liệu.
- Chỉ khi nhập password mới được phép thao tác trên bảng tính (tức là sửa đổi hay nhập mới tất cả các ô trong bảng tính).

Cách của mình là thoả mãn ý của sieunhi. - Khoá những ô có dữ liệu, cho nhập vào các ô trống cho phép. - Khi bạn đặt password cho protect sheet.. thì những ai biết pw mới có thể sửa đổi hay nhập mới.
Bạn nói chưa thoả mãn thì không hiểu luôn. Hay bạn muốn nhập đến đâu khoá đến đó, ý này hơi ngộ. Nhưng muốn vậy thì ý của bạn HYEN rất hay, bạn tham khảo thêm. OK nhé!
 
Có lẽ do mình diễn đạt kém quá! Ý của mình là như thế này:
- Chỉ có admin (người biết PW) mới chỉnh sửa được các ô có dữ liệu.
- User chỉ nhập dữ liệu vào những ô trống, không copy, không xóa,....
Trong bài của tedaynui, khi click vào ô có dữ liệu nó đòi PW và khi nhập vào thì chỉnh sửa được ô đó còn các ô có dữ liệu khác thì không được, phải nhập lần nữa. Nói chung là muốn chỉnh sửa ô nào thì nhập PW vào. Điều này rất mất công. Mình muốn admin nhập PW một lần thì chỉnh sửa được tất cả các ô có dữ liệu. Sau khi chỉnh sửa xong thì nhập PW khóa lại.
Rất mong nhận được đóng góp ý kiến!
 
Gởi Sieunhi
Mình đã chỉnh lại và Up lại ở bài #17, bại thử tại lại xem có như ý không nhé !

TDN
 
Hiếu ơi!
Sao khi chọn 1 vùng chưa làm gì cả thì nó báo lỗi code rùi.

TC.
 
Thien đã viết:
Hiếu ơi!
Sao khi chọn 1 vùng chưa làm gì cả thì nó báo lỗi code rùi.

TC.
Mình sửa lại rồi.
Có gì thì cứ thông báo thêm hoặc vào code sửa lại thôi.

Thân!

Làm xong chẳng biết đúng ý chưa, chẳng thấy ai nói gì. Chán !!+-+-+-++-+-+-++-+-+-++-+-+-+

be be be!!!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Mr Okebab đã viết:
Làm xong chẳng biết đúng ý chưa, chẳng thấy ai nói gì. Chán !!+-+-+-++-+-+-++-+-+-++-+-+-+

be be be!!!
:D
Góp ý nhé : khi đã unprotect thì phải cho Admin chọn nhiều ô chứ (Admin mà xoá từng ô luôn thì có mà gãy cổ :D
 
SoiBien đã viết:
:D
Góp ý nhé : khi đã unprotect thì phải cho Admin chọn nhiều ô chứ (Admin mà xoá từng ô luôn thì có mà gãy cổ :D

Thì sửa tiếp vậy. Cảm ơn bác. (có như vậy thì em mới tiến được chứ)

Thân!
 

File đính kèm

Mình có ý kiến tiếp nhé, thường thỉ khi nhập liệu, không thể tránh khỏi chuyện sai xót, vậy là không thể sửa sai????

Có nên làm là chỉ sau khi Close (or Save) thì mớu protect lại những cells đã có giá trị (chỉ sợ phải quét qua hết cả Workbook thì hơi lâu)????
 
SoiBien đã viết:
Mình có ý kiến tiếp nhé, thường thỉ khi nhập liệu, không thể tránh khỏi chuyện sai xót, vậy là không thể sửa sai????

Có nên làm là chỉ sau khi Close (or Save) thì mớu protect lại những cells đã có giá trị (chỉ sợ phải quét qua hết cả Workbook thì hơi lâu)????

Việc cho sửa những dữ liệu vừa nhập xong thì không khó gì cả, chỉ có điều là như thế không biết có đúng ý của người hỏi không ????

Tuy nhiên đây là một ý rất hay.
Bác xem nhé :


Thân!
 

File đính kèm

hình như cái bebe2 nó có vấn đề, chắc nó phải gọi cái thủ tục LockSh2 luôn thì phải, Bạn xem lại xem? như vậy chắc hay hơn ??? vì nếu Protect mà mấy cái cell có dữ liệu, nhưng Not locked thì lại không đúng ý nghĩa Caption của Nút Bebe2.
 
Lần chỉnh sửa cuối:
đến giờ đó mới hỏi thì ngủ mất tiêu rồi.

Thế này nhé: ở sheet2 thì command bebe2 phải gọi Sub LockSh2 (khi protect), vì như hiện nay thì nó chỉ chỉ lock những ô nào đã được đánh dấu Lock.

Tuy nhiên trường hợp này chỉ đáng ngại khi Admin mở ra rồi điều chỉnh trực tiếp trên máy user (điều chỉnh xong rồi bỏ đi, không Reopen lại).
 
SoiBien đã viết:
đến giờ đó mới hỏi thì ngủ mất tiêu rồi.

Thế này nhé: ở sheet2 thì command bebe2 phải gọi Sub LockSh2 (khi protect), vì như hiện nay thì nó chỉ chỉ lock những ô nào đã được đánh dấu Lock.

Tuy nhiên trường hợp này chỉ đáng ngại khi Admin mở ra rồi điều chỉnh trực tiếp trên máy user (điều chỉnh xong rồi bỏ đi, không Reopen lại).

Thì như trên đã nói, nó chỉ khóa lại (với những ô là hiện tại chưa khóa) khi thực hiện Save or Close.
Còn admin mà quên thì. . . bó tay thôi.--=0--=0

Thân!
 
dmtdmtbb đã viết:
- Mình đố bạn thay đổi được dử liệu của cell đã có nếu không bít pass hìhì !!!
- Tuỳ theo nhu cầu có thể là Workbook cho toàn bộ và WorkSheet cho Sheet.
Mã:
Dim OldValue
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
   OldValue = Target.Cells(1, 1)
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Not IsEmpty(OldValue) And (OldValue <> Target.Cells(1, 1)) Then
        If InputBox("Password:", "Yeu cau nhap Password ""tuan""") <> "tuan" Then
            Application.Undo
        End If
    End If
End Sub
Cái này của bạn cũng hay, nhưng khi người ta xem code và thấy pass thì họ sữa máy hồi. cho nên mình làm thế nào để không cho họ xem code để không thấy pass luôn
 
Cho Em hỏi? Với đọan code nầy, thì việc đặt Pass phải là chử HOA, nhưng khi gỏ pass vào ô Inputbox thì tại sao gỏ chử thường cũng được. Và xi giải thíc giùm Em hai dòng :
Selection.SpecialCells(xlCellTypeConstants, 23).Locked = True
Selection.SpecialCells(xlCellTypeFormulas, 23).Locked = True
Xin cảm ơn.

Sub LockSh1()
On Error Resume Next
With Sheet1
.Select
.Unprotect "Z"
.Cells.Locked = False
End With
Selection.SpecialCells(xlCellTypeConstants, 23).Locked = True
Selection.SpecialCells(xlCellTypeFormulas, 23).Locked = True
Sheet1.Protect "Z"
Sheet1.Bebe2.Caption = "Khoa"
Sheet1.Bebe2.ForeColor = &HFF&
End Sub
 
Mở cửa sổ VBE, vào menu Tools\VBA Project Properties.. trong tab Protection ấy... gõ pass vào thì sau này chỉ có bạn biết pass mới có thề edit dc code
 
ko hẳn đâu bạn , có người ko cần biết pasword mà vẫn mở đc , chỉ mất 5s thôi ah
Tất nhiên Anhtuan1066 và mọi người thừa biết chuyện đó nhưng ta đang đề cập vấn đề con đường chính đạo bạn à. Ai cũng 5s và công khai thế thì... hix hix...

TDN
 
Cho Em hỏi? Và xin giải thíc giùm Em hai dòng :
Selection.SpecialCells(xlCellTypeConstants, 23).Locked = True
Selection.SpecialCells(xlCellTypeFormulas, 23).Locked = True
Xin cảm ơn.
Trăm nghe không bằng 1 thấy; Mình sẽ giúp bạn thấy rỏ điều này, như sau:
Bạn lấy trang tính mới
Cột đầu, với vài ba động tác, bạn tạo cột số tăng dần; (khoảng chứng trên 12 số)
Cột kế, bạn tạo cột số bằng cách tạo công thức (CT) tại B(i) =A(i) + A(i+1)
Cột thứ ba: Bạn tạo CT kiểu logic, như sau =B(i) < A(i)
Cột tiếp chứa CT: =B(i) & cod(B(i)+64) - Đừng sợ, chúng ta đang gây CT lỗi mà!
Cột 5 ta tạo CT tại E(i): =CHAR(CODE("A(i)")+A(i+1))
Cột kế tiếp ta nhập CT tại F(i): =E(i)&B(i)
Cuối cùng, (mừng quá-Sắp xong!) tại G(i) ta nhập CT: =INDIRECT(F(i))

Sau đó cho chạy macro này, bạn sẽ thích ngay khi hiểu được vấn đề;
Nếu còng thắc mắc, còn trả lời!

PHP:
Option Explicit
Sub GoToAll()
    Range("A1:G16").Select
    Selection.SpecialCells(xlCellTypeConstants, 23).Select
    Selection.Interior .ColorIndex = 38
    
    Range("A1:G16").Select
    Selection.SpecialCells(xlCellTypeConstants, 3).Select
    
    Range("A1:H16").Select
    Selection.SpecialCells(xlCellTypeFormulas, 23).Select
    Selection.Interior .ColorIndex = 36
    
    Selection.SpecialCells(xlCellTypeFormulas, 3).Select
    Selection.Interior.ColorIndex = 34
    
    Range("A1:G15").Select
    Selection.SpecialCells(xlCellTypeFormulas, 20).Select
    
End Sub
Nhai.jpg
 
Cho Em hỏi? Với đọan code nầy, thì việc đặt Pass phải là chử HOA, nhưng khi gỏ pass vào ô Inputbox thì tại sao gỏ chử thường cũng được. Và xi giải thíc giùm Em hai dòng :
Selection.SpecialCells(xlCellTypeConstants, 23).Locked = True
Selection.SpecialCells(xlCellTypeFormulas, 23).Locked = True
Xin cảm ơn.
Selection.SpecialCells(xlCellTypeConstants, 23) chọn những ô có dữ liệu (không phải công thức)
Selection.SpecialCells(xlCellTypeFormulas, 23) chọn những ô công thức
Locked = True khóa ô (False: không khóa)
 
Chào cả nhà.
nhân đọc bài của sieunhi10079 mình thấy trùng hợp với thắc mắc của mình. mình xin nói rõ 1 chút để các bác rõ suy nghĩ của chúng em.
Em có 1 file excel quản lý việc tiếp nhận của bộ phận dịch vụ với khách hàng. Tuy nhiên file này em tạo ra nhưng người sử dụng là phòng tiếp nhận sửa chữa. Cuối mỗi ngày bộ phận này gởi thông tin cho em. Tuy vậy, khi họ nhập dữ liệu rồi xóa đi hiệu chỉnh lại thì em không thể quản nổi. Các bác nào biết cách chỉ giúp em với. Em có cài thử đoạn code của bác phamduylong rồi nhưng vẫn không được. có lẽ do em không biết gì vba.
 
Chào các bác.

theo như file đính kèm của bác okbab, protect data cells-OB3. em muốn ứng dụng theo cách 2 và có tác dụng trên toàn workbook thì em phải thêm và bớt cái gì. Mong các bác chỉ dẫn.
 
Lần chỉnh sửa cuối:
Cái file Protect Data Cells-OB3 của bạn bị lỗi do chỉnh protect level high rồi kìa chỉnh lại sao được đây bạn?
Nếu được rồi thì làm sao áp dụng ra các ô được phải chọn phần nào, có cần đánh code gì không?
Mong các bạn giúp đỡ, thanks.
 
Các Anh Chị giúp em với ( Protec nhưng không lọc được)

Em có áp dụng việc protec nhưng vẫn điền dữ liệu vào ô trống. Nhưng lại không lọc được. Các anh chị xem có cách nào giúp em vẫn protec dữ liệu, vẫn nhập dữ liệu vào ô trống mà vẫn lọc được không?
Cảm ơn các Anh/Chị
 

File đính kèm

Thấy chủ đề này chưa có cao thủ nào trả lời, mình cũng đang gặp vấn đề như của tungsb ở bài #33. Có cao thủ nào giúp mình khi protec rồi vẫn fillter được không?

Xin đa tạ!
 
E CŨNG ĐANG GẶP VƯỚNG MẮC NÀY, CÓ SI ĐÃ LÀM ĐƯỢC RÙI THÌ CHỈ E VỚI.
tks!
 
Oài. Loạt bài đang hấp dẫn mà không có cao thủ nào viết tiếp nè. Đúng là cho dù khóa dữ lieu thì người nhập liệu vẫn cần phải lọc được để xem chứ khóa luôn chức năng này e là quá đáng với họ. Hì
 
Oài. Loạt bài đang hấp dẫn mà không có cao thủ nào viết tiếp nè. Đúng là cho dù khóa dữ lieu thì người nhập liệu vẫn cần phải lọc được để xem chứ khóa luôn chức năng này e là quá đáng với họ. Hì
Đánh dấu check cho "Use AutoFilter" trong hộp " Allow all Users..." là OK mà
 
File đã khóa nhưng muốn người dùng vẫn có thể chọn được list cho sẵn (data validation) khi nhập dữ liệu thì làm thế nào ạ?
Các bác giúp em với.
 
sory các bác, mình xử lý được rồi
 
Thì sửa tiếp vậy. Cảm ơn bác. (có như vậy thì em mới tiến được chứ)

Thân!

Cảm ơn bác, dù rằng chưa hiểu lắm, nhất là việc tạo ra cái bebe !!!, nhưng thôi, sẽ "ngâm" sau

Có ý nhỏ trong code

If (Target.Columns.Count > 1 Or Target.Rows.Count > 1) Then

nên thay bằng

If (Target.count > 1) Then

(đôi khi cũng chỉ muốn mã nguồn gọn)
 
Cho mình hỏi làm sao để tạo ra 1 file như ở #20 vậy. Hướng dẫn mình các bước với.
 
Status
Không mở trả lời sau này.

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

Back
Top Bottom