namkhanh.dangtran
Thành viên mới

- Tham gia
- 5/3/11
- Bài viết
- 17
- Được thích
- 8
Mình nghĩ bài viết của ban doomfootwear có thể giúp bạn:Em có ví dụ này muốn nhờ các cao thủ xem và hoàn thiện dùm. Em không nghĩ được code phải viết thế nào nữa!
Mình nghĩ bài viết của ban doomfootwear có thể giúp bạn:
http://www.giaiphapexcel.com/forum/...£nh-báo-khi-trùng-số-liệu-cá»§a-2-cá»™t
Khi 2 cột A,B có nhập trùng thì sẽ hiện lênh thông báo, đồng thời delele dòng mới nhập trùng. (mình lấy nguyên đoạn code của bạn doomfootwear).
Tác giả thông cảm nhé. Mình xin lỗi tác giã vì đã sửa một tí form của tác giả.
Mong nhận được đóng góp,
Thân
ptm0412! Em mới nên chưa biết nhiều. Anh sửa giúp em theo cách nhấn nút Save 2 lần (theo cách 3 anh gợi ý) để em tham khảo nha.
Cám ơn ptm0412 nhiều!
Lấy 2 dòng lệnh của nút New, bỏ lên code của nút lệnh Save. Xoá nút New. Xong.
Đừng nói là không biết dùng countif nha.- Cách 2: Dùng hàm đếm giá trị textbox mã trong cột mã, nếu >0 nghĩa là đã có ...
- Ai biểu không kiểm tra trùng làm chi?namkhanh đã viết:nếu mở file đó lên và chỉ để hiện Form đó để nhập liệu thui thi lấy cách đó sẽ không ổn
Tôi làm bài này theo nguyên tắc sau:Cách này em biết. Nhưng nếu mở file đó lên và chỉ để hiện Form đó để nhập liệu thui thi lấy cách đó sẽ không ổn. Có thể có mã đã nhập mà mình không biết thì sẽ nhập lại nhiều lần.
Vậy nhờ ptm0412 xem thêm cho em nhé!
Dim fRng As Range
Private Sub cbQuit_Click()
Unload Me
End Sub
Private Sub cbSave_Click()
Dim iR As Long
iR = Sheets("Sheet1").Range("A1000").End(3).Offset(1, 0).Row
If Trim(Me.txtMa.Value) = "" Then
Me.txtMa.SetFocus
MsgBox "Ma khong duoc de trong!", vbCritical + vbOKOnly
Else
fRng.Offset(, 0) = Me.txtMa.Value
fRng.Offset(, 1) = Me.txtTen.Text
End If
Me.txtMa.SetFocus
End Sub
Private Sub txtMa_Change()
With Sheet1.Range("A1").CurrentRegion.Resize(, 1)
Set fRng = .Find(txtMa.Text, , , xlWhole)
If fRng Is Nothing Then Set fRng = .Parent.Cells(60000, .Column).End(xlUp).Offset(1)
txtTen.Text = fRng.Offset(, 1).Value
End With
End Sub
Tôi làm bài này theo nguyên tắc sau:
- UserForm được thiết kế gồm có: TextBox Mã, TextBox Tên, Nút Save và Nút Thoát (không có nút New)
- Khi bạn nhập mã vào TextBox Mã, nếu mã ấy tồn tại thì tên tự động hiện ra tại TextBox Tên... khi ấy, nếu bạn sửa tên và bấm nút Save thì đồng nghĩa là bạn sửa thông tin của mã vừa nhập
- Khi bạn nhập mã vào TextBox Mã, nếu mã ấy không tồn tại thì TextBox Tên sẽ rổng... khi ấy, nếu bạn nhập tên và bấm nút Save thì đồng nghĩa là bạn thêm thông tin của mã vừa nhập
- Như vậy thì chẳng bao giờ có chuyện nhập trùng cả
Code như sau: ...
If Application.CountIf(Range("A2:A" & iR - 1), txtMa) = 0 Then
With Sheets("Sheet1")
.Cells(iR, 1).Value = Me.txtMa.Value
.Cells(iR, 2).Value = Me.txtTen.Text
End With
Else
MsgBox "Ma nay co roi ku!"
End If
Public EditMode As String
'-----------'
Sub Button1_Click() 'Sửa mã cũ'
EditMode = "Edit"
FORM.Show
End Sub
'------------------'
Sub Button2_Click() 'Thêm mã mới'
EditMode = "Add"
FORM.Show
End Sub
'mở form'
Private Sub UserForm_Initialize()
Dim rng As Range, EndR As Long
If EditMode = "Edit" Then
EndR = [a1000].End(xlUp).Row
Set rng = Range("A2:B" & EndR)
Me.Cb1.Visible = True
Me.txtMa.Visible = False
Me.Cb1.RowSource = rng.Address
Else
Me.Cb1.Visible = False
Me.txtMa.Visible = True
End If
End Sub
'-----------------
Code nhấn nút save'
Private Sub cbSave_Click()
Dim iR As Long
iR = Sheets("Sheet1").Range("A1000").End(xlUp).Row
If EditMode = "Add" Then
If Trim(Me.txtMa.Value) = "" Then
Me.txtMa.SetFocus
MsgBox "Ma khong duoc de trong!", vbCritical + vbOKOnly
Exit Sub
Else
If Application.CountIf(Range("A2:A" & iR), txtMa) = 0 Then
With Sheets("Sheet1")
.Cells(iR + 1, 1).Value = Me.txtMa.Value
.Cells(iR + 1, 2).Value = Me.txtTen.Text
End With
Else
MsgBox "Ma nay co roi ku!" & Chr(10) & "Lam lai!"
Me.txtMa.Value = ""
Me.txtMa.SetFocus
Exit Sub
End If
End If
Else
With Sheet1.Range("A1:A" & iR)
Set fRng = .Find(Cb1.Text, , , xlWhole)
fRng.Offset(, 1) = txtTen
End With
End If
If MsgBox("Them nua hong nhoc?", vbYesNo) = vbYes Then
Me.txtMa.Value = ""
Me.txtTen.Text = ""
If EditMode = "Edit" Then
Me.Cb1.SetFocus
Else
Me.txtMa.SetFocus
End If
Else
Unload Me
End If
End Sub
Hay là vầy đi: Bạn cứ thử tự mình tạo ra Form theo cách mà bạn cho là tối ưu nhất, đưa lên đây rồi mọi người sẽ góp ý sauEm đang bối rối không biết nên thiết Form nhập liệu như thế nào? Em đưa lên đây nhờ các AC xem và tư vấn thêm có em cách tạo Form đó cho hợp lý với các thông tin đã cho trong Excel.
Hay là vầy đi: Bạn cứ thử tự mình tạo ra Form theo cách mà bạn cho là tối ưu nhất, đưa lên đây rồi mọi người sẽ góp ý sau
Dear NGọcEm mới chỉ nghĩ là làm được thế này thui ah. Anh không biết có thể làm bằng cách khác không? Anh xem dùm cho em với nhé!
Dear NGọc
Tôi không được học VBA gì cả .mình nghĩ nếu đơn giản thì chúng ta nên chọn cách đơn giản,nếu dữ liệu phức tạp và đồ sộ thì hãy nên dùng form, nhưng với dữ liệu chỉ đơn giản như vậy thì dùng form làm gì cho thêm phức tạp vậy Ngọc
Private Sub CommandButton1_Click()
Dim iJ As Long, Rng As Range, sRng As Range
With Sheet1
Set Rng = Range([A1], [A65500].End(xlUp))
iJ = Rng.Rows.Count + 1
If Me.MaNV.Value = "" Then Exit Sub
Set sRng = Rng.Find(UCase$(Me.MaNV.Value), , xlFormulas, xlWhole)
If sRng Is Nothing Then
.Cells(iJ, 1).Value = UCase$(Me.MaNV.Value)
.Cells(iJ, 2).Value = Me.Ten.Text
Else
MsgBox "Ma Nay Da Co"
End If
Me.MaNV.Value = "": Me.Ten.Text = ""
End With
Me.MaNV.SetFocus
End Sub
Thực ra mình muốn làm vậy để có thể khống chế việc nhập trùng số phiếu và mỗi phiếu có dữ liệu nhiều chỉ nhập 1 lần thui. Không biết còn có cách nào khác tạo nó không?
Theo giao diện mà bạn vừa đưa lên, tôi sửa lại, dùng SpreadSheet sẽ giúp ta đơn giản hóa code rất nhiều:Em mới chỉ nghĩ là làm được thế này thui ah. Anh không biết có thể làm bằng cách khác không? Anh xem dùm cho em với nhé!
Private Sub CommandButton1_Click()
Dim sRng As Range
Set sRng = Sheet1.Range("A65536").End(xlUp).Offset(1)
With Me.Spreadsheet1.Range("A1").CurrentRegion
If .Count > 1 Then
sRng.Offset(, 0).Resize(.Rows.Count, 1).Value = SoPhieu.Text
sRng.Offset(, 1).Resize(.Rows.Count, 1).Value = Ngay.Value
sRng.Offset(, 2).Resize(.Rows.Count, 5).Value = .Value
End If
End With
End Sub
Private Sub Spreadsheet1_SheetChange(ByVal Sh As OWC11.Worksheet, ByVal Target As OWC11.Range)
On Error GoTo ExitSub
If Sh.Name = "Sheet1" Then
If Target.Column = 3 Or Target.Column = 4 Then
Sh.Cells(Target.Row, 5) = Sh.Cells(Target.Row, 3) * Sh.Cells(Target.Row, 4)
End If
End If
ExitSub:
End Sub
Theo giao diện mà bạn vừa đưa lên, tôi sửa lại, dùng SpreadSheet sẽ giúp ta đơn giản hóa code rất nhiều:
View attachment 60914
Với giao diện trên thì code chỉ cần vầy là đủ:
PHP:Private Sub CommandButton1_Click() Dim sRng As Range Set sRng = Sheet1.Range("A65536").End(xlUp).Offset(1) With Me.Spreadsheet1.Range("A1").CurrentRegion If .Count > 1 Then sRng.Offset(, 0).Resize(.Rows.Count, 1).Value = SoPhieu.Text sRng.Offset(, 1).Resize(.Rows.Count, 1).Value = Ngay.Value sRng.Offset(, 2).Resize(.Rows.Count, 5).Value = .Value End If End With End Sub
Đương nhiên bạn vẫn có thể cải tiến thế nào đó tùy ý, chẳng hạn để khống chế nhập trùng, bạn dùng sự kiện Spreadsheet1_SheetChange tại cột A, bằng cách dùng hàm COUNTIF hoặc dùng Dictionary ObjectPHP:Private Sub Spreadsheet1_SheetChange(ByVal Sh As OWC11.Worksheet, ByVal Target As OWC11.Range) On Error GoTo ExitSub If Sh.Name = "Sheet1" Then If Target.Column = 3 Or Target.Column = 4 Then Sh.Cells(Target.Row, 5) = Sh.Cells(Target.Row, 3) * Sh.Cells(Target.Row, 4) End If End If ExitSub: End Sub
------------------------
Nói ngoài lề: Tôi cũng giống ý kiến viethoai và Lê Duy Thương, tôi chỉ dùng Form khi tôi cảm nhận được sự cần thiết đến mức không thể nhập trực tiếp được... Nói thật, với form này, tôi chẳng thấy sự cần thiết của Form nó nằm ở chổ nào nữa (dợt code chơi cho vui thì chẳng nói làm gì) ---> Còn nếu làm form chỉ đê cho nó.. PRO hơn thì thôi... miễn đi
Private Sub Spreadsheet1_SheetChange(ByVal Sh As OWC11.Worksheet, ByVal Target As OWC11.Range)
On Error GoTo ExitSub
If Sh.Name = "Sheet1" Then
If Target.Column = 3 Or Target.Column = 4 Then
Sh.Cells(Target.Row, 5) = Sh.Cells(Target.Row, 3) * Sh.Cells(Target.Row, 4)
End If
End If
ExitSub:
End Sub
Có phải bạn dùng Excel 2007 không nhỉ?Cám ơn anh @ndu nhiều lắm! Nhưng không hiểu sao máy tính của em mở file của anh làm ra thì nó toàn báo lỗi:
Em nghĩ là nó bị lỗi gì đó? Hoặc máy tính của em thiếu phần nào đó mà chưa được cài đặt? Nhờ anh tư vấn thêm!
Có phải bạn dùng Excel 2007 không nhỉ?
Sang topic này, cũng có người thắc mắc trong này hôm nay:
http://www.giaiphapexcel.com/forum/showthread.php?47341-Bị-lỗi-Error-loading-DLL-Nhờ-GPE
Ít ra bạn cũng phải cho tôi xem lỗi ấy là gì chứEm dùng cả 2 anh ah! Cứ khi Click vào nút FORM thì nó báo lỗi vậy. Em cứ nghĩ nó bị lỗi thiếu cái gì đó.
Ít ra bạn cũng phải cho tôi xem lỗi ấy là gì chứ
Private Sub Spreadsheet1_SheetChange(ByVal Sh As OWC11.Worksheet, ByVal Target As OWC11.Range) 'Loi vay do anh ah!
On Error GoTo ExitSub
If Sh.Name = "Sheet1" Then
If Target.Column = 3 Or Target.Column = 4 Then
Sh.Cells(Target.Row, 5) = Sh.Cells(Target.Row, 3) * Sh.Cells(Target.Row, 4)
End If
End If
ExitSub:
End Sub
Bạn ơi, là tôi muốn hỏi cái CÂU THÔNG BÁO LỖI ấyCụ thể lả: Khi em chọn nút FORM thì nó lỗi và hiện luôn:
Vào menu Tools\References xem thử lỗi chổ nào? (có MISSING gì gì đó không?)Vâng anh xem nhé! hình lỗi ở đây:
Thế đường link tôi đưa ở trên bạn đã đọc kỹ chưa? Có download Microsoft Office Web Components về cài chưa?Anh ơi, em đã vào đó tìm rùi nhưng không tìm ra. Anh chỉ dùm em nhé!
Thế đường link tôi đưa ở trên bạn đã đọc kỹ chưa? Có download Microsoft Office Web Components về cài chưa?
http://www.giaiphapexcel.com/forum/showthread.php?47341-B%E1%BB%8B-l%E1%BB%97i-Error-loading-DLL-Nh%E1%BB%9D-GPE&p=302099#post302099
Tôi đoán máy của bạn thiếu thành phần này
Ngoài ra, bạn có kiểm tra cái Form mà tôi thiết kế chưa? Có nhìn thấy SpreadSheet nằm trên Form không? (kiểm tra trong cửa số code chứ không phải chạy code)
------------
Bạn có thể thí nghiệm thế này: Mở file mới, chèn 1 form rồi tự mình vẽ SpreadSheet lên Form... Bạn có làm được điều này không?
Kiểm tra từng đoạn 1 bạn ơi... Tiếc là tôi không ngồi trên máy của bạn, nếu không thì chắc chắn có thể biết được nguyên nhân gì trong 5 phút
Hic...
Không có thì cài vào thôi.. Đã nói ở trên, bạn còn hỏi gì nữaAnh ơi, sao máy tính của em không có thành phần SpreadSheet nhỉ!! Em muốn tìm hiểu nó mà không thấy có? Anh chỉ dùm cho em nhé!
Có 1 vấn đề mà bạn mở 2 topic khác nhau, tôi đã gom cả 2 vào đây và chỉ link cho bạn xem các form mẫu bài trên, bạn lại mở topic thứ 3.Chào các bạn!
Mình nhờ các bạn hoàn thiện dùm form này nhé:
Thì trên sheet đang có sẳn nhiều cột nhiều dòng đấy, nhập trực tiếp vào luôn đi. Form trong trường hợp này là vô íchMình có file 1 này muốn hỏi các bạn: Có cách nào mình có thể tạo các ô trên Form để có thể nhập liệu cùng một lúc?
ngocdak đã viết:Mình có file 1 này muốn hỏi các bạn: Có cách nào mình có thể tạo các ô trên Form để có thể nhập liệu cùng một lúc?
Có 1 lỗi nhỏ trong form này sư phụ à! Đó là nếu mở form mà không làm gì cả, bấm nút Thoát nó cũng... "cằn nhằn"Tôi tạo 1 form nhập liệu với code sơ đẳng nhất:
- Dùng CountIf chống nhập trùng
- Dùng For next
- Ghi từng giá trị xuống từng cell
- Xoá từng textbox sau khi ghi
Cũng có khi là "nhiều" người nhưng cùng thầyViệc nhận xét nick này rất đơn giản, đọc sơ qua nội dung bài, đọc giọng văn, nhìn sơ qua file là biết ai là tác giả và có thể kết luận nick của ai.
Có 1 lỗi nhỏ trong form này sư phụ à! Đó là nếu mở form mà không làm gì cả, bấm nút Thoát nó cũng... "cằn nhằn"
Tính luôn cả những từ ngữ thường dùng trong câu và cách đặt câu, tính luôn phong cách hỏi "cơm" không nhận "gạo" và không chịu đọc link gợi ý, tính luôn cả thói quen đặt tên file, tính luôn thói quen "Pro" hiện form là dấu Application, ... thì có thể chắc 100% là 1 người.Cũng có khi là "nhiều" người nhưng cùng thầy
Ẹc... ẹc...
Theo giao diện mà bạn vừa đưa lên, tôi sửa lại, dùng SpreadSheet sẽ giúp ta đơn giản hóa code rất nhiều:
View attachment 60914
Với giao diện trên thì code chỉ cần vầy là đủ:
PHP:Private Sub CommandButton1_Click() Dim sRng As Range Set sRng = Sheet1.Range("A65536").End(xlUp).Offset(1) With Me.Spreadsheet1.Range("A1").CurrentRegion If .Count > 1 Then sRng.Offset(, 0).Resize(.Rows.Count, 1).Value = SoPhieu.Text sRng.Offset(, 1).Resize(.Rows.Count, 1).Value = Ngay.Value sRng.Offset(, 2).Resize(.Rows.Count, 5).Value = .Value End If End With End Sub
Đương nhiên bạn vẫn có thể cải tiến thế nào đó tùy ý, chẳng hạn để khống chế nhập trùng, bạn dùng sự kiện Spreadsheet1_SheetChange tại cột A, bằng cách dùng hàm COUNTIF hoặc dùng Dictionary ObjectPHP:Private Sub Spreadsheet1_SheetChange(ByVal Sh As OWC11.Worksheet, ByVal Target As OWC11.Range) On Error GoTo ExitSub If Sh.Name = "Sheet1" Then If Target.Column = 3 Or Target.Column = 4 Then Sh.Cells(Target.Row, 5) = Sh.Cells(Target.Row, 3) * Sh.Cells(Target.Row, 4) End If End If ExitSub: End Sub
------------------------
Nói ngoài lề: Tôi cũng giống ý kiến viethoai và Lê Duy Thương, tôi chỉ dùng Form khi tôi cảm nhận được sự cần thiết đến mức không thể nhập trực tiếp được... Nói thật, với form này, tôi chẳng thấy sự cần thiết của Form nó nằm ở chổ nào nữa (dợt code chơi cho vui thì chẳng nói làm gì) ---> Còn nếu làm form chỉ đê cho nó.. PRO hơn thì thôi... miễn đi