Khống chế cập nhật Dữ liệu từ Form

Liên hệ QC

namkhanh.dangtran

Thành viên mới
Tham gia
5/3/11
Bài viết
17
Được thích
8
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!
 

File đính kèm

  • FORM.rar
    80.3 KB · Đọc: 89
Xem form mẫu ở đây
http://www.giaiphapexcel.com/forum/showthread.php?7358-External-Database-Query-nhi%E1%BB%81u-tables-v%E1%BB%9Bi-relations&p=55016#post55016
Form thiết kế không giống nhưng có thể vận dụng 90% code cho bài này.

Về việc 1 phiếu nhập nhiều dòng dữ liệu, thì từ code 1 dòng chả lẽ không mở rộng ra được nhiều dòng?
Về vấn đề chống nhập trùng số phiếu thì hình như tôi cũng hướng dẫn 1 lần là dùng countIf, hoặc dùng phương thức Find.

Hình như tôi đưa link này cho NHDK hơn 1 lần rồi.

Mà sao nội dung là tạo form VBA lại post vào thành viên giúp nhau?
 
Lần chỉnh sửa cuối:
Upvote 0
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?

Đâu phải Form mới khống chế việc nhập trùng này hả Ngọc? Sự kiện Worksheet_Change hay một sự kiện nào đó khác cũng có thể làm được đều này.
(Còn vì lý do để làm một chương trình lại là khác). Theo mình Ngọc nên đơn giản hóa vấn đề, đôi khi nhập trên Form còn lại chậm hơn như File ví dụ của Ngọc
Chúc Ngọc thành công
 
Upvote 0
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é!
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:

untitled.JPG


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
PHP:
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
Đươ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 Object
------------------------
Nói ngoài lề: Tôi cũng giống ý kiến viethoaiLê 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
 

File đính kèm

  • GPEb_1.xls
    41.5 KB · Đọc: 197
Lần chỉnh sửa cuối:
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Hàm đó trong VBA

Dùng nó để luôn đảm bảo mã nhân viên toàn ký tự viết hoa; Ví dụ ta có nhập nv001 thì trong CSDL của chúng ta cũng sẽ là NV001
Còn nếu bạn nhiều nhân viên quá đổi, đến mức fải xài cả gpe01 & GPE01 thì chúng ta đổi lại (& lúc đó đổi cả cách tìm kiếm nữa đó nha.)

(húc thành công.
 
Upvote 0
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
PHP:
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
Đươ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 Object
------------------------
Nói ngoài lề: Tôi cũng giống ý kiến viethoaiLê 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

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:
PHP:
   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
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!
 
Upvote 0
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
 
Upvote 0
Upvote 0
Ít ra bạn cũng phải cho tôi xem lỗi ấy là gì chứ

Cụ thể lả: Khi em chọn nút FORM thì nó lỗi và hiện luôn:
PHP:
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
 
Upvote 0
Cụ thể lả: Khi em chọn nút FORM thì nó lỗi và hiện luôn:
Bạn ơi, là tôi muốn hỏi cái CÂU THÔNG BÁO LỖI ấy
Lỗi gì cũng phải có 1 thông báo xuất hiện chứ
Còn mấy đoạn code trên thì bạn cứ yên tâm đi, chẳng bao giờ có lỗi được đâu
 
Upvote 0
Bạn ơi, là tôi muốn hỏi cái CÂU THÔNG BÁO LỖI ấy
Lỗi gì cũng phải có 1 thông báo xuất hiện chứ
Còn mấy đoạn code trên thì bạn cứ yên tâm đi, chẳng bao giờ có lỗi được đâu

Vâng anh xem nhé! hình lỗi ở đây: 00012.JPG
Khi click chuột vào nút Form thì nó xuất hiện lỗi đó ah!
 
Upvote 0
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...
 
Lần chỉnh sửa cuối:
Upvote 0
Ông Bà xưa có câu: Không dạy người yếu đánh vật.
người yếu thì phải bồi bổ sức khoẻ cho gân cốt cứng cáp, rồi mới dạy đứng tấn, rồi hít thở, rồi từ từ mới dạy đánh vật.

ndu không biết câu này? Nên qua 10 bài không biết lỗi gì, lỗi do đâu, ...

Tiếc rằng tất cả các thang thuốc bổ (các link bài viết) đều bị chê, đứng chưa vững mà toàn muốn chạy.
Và, cơm nấu sẵn thì mới nhận, chứ cho gạo thì chịu chết đói vì không muốn tự nấu.
 
Upvote 0
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...

Anh ơ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é!
 
Upvote 0
phát hiện mã bị trùng

Chào cả nhà!
Mình đang thiết kế một form nhập dữ liệu khách hàng vào cell bao gồm các textbox:
makh,tenkh,mst,diachi,dt tương ứng với cell a2,b2,c2,...trong sheet ma.khi nhấn lệnh ghi thì rất ok. nhưng có một chút vấn đề nhờ các cao thủ giúp đỡ nhé.
1.Khi nhập mã khách hàng tại textbox mã khách hàng ,nếu mã KH đã tồn tại trong cell cột A rùi thì báo lỗi mã bị trùng.
rất mong các cao thủ giúp đỡ!!!
 
Upvote 0
Web KT
Back
Top Bottom