Khống chế cập nhật Dữ liệu từ Form (1 người xem)

Liên hệ QC

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

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

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
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
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

Rất cám ơn bạn nhiều! Nhưng ý mình muốn nó không chế luôn khi mình chọn vào nút cbSave cơ. Vì Trong bài tập lỡn của mình thì mình chỉ để Form nhập liệu hiện thui. Nên nếu áp dụng cách của bạn thì không thể được. Ý mình muốn là: Nếu nhập đầy đủ thông tin vào 2 ô: Mã và tên rùi chọn nút cbSave 1 lần thì nó lưu lại, nếu chọn đến lần thứ 2 nó sẽ cảnh báo là dữ liệu đã lưu và không cho lưu nữa!
Nhờ bạn và các cao thủ chỉ thêm nhé!
 
Upvote 0
Có rất nhiều cách để làm 2 việc: Tránh nhập trùng và nhấn 1 nút 2 lần:

1. Tránh nhập 1 mã đã có:
- Cách 1: đơn giản nhất là dùng find để tìm giá trị textbox mã trong cột mã. Nếu tìm thấy, thì là trùng, sửa mã lại (chỉ 1 vài câu lệnh)
- Cách 2: Dùng hàm đếm giá trị textbox mã trong cột mã, nếu >0 nghĩa là đã có, làm lại với mã khác (cũng chỉ 1 vài dòng lệnh và dùng countif của excel)
- Dùng code của vba_gpe: phức tạp quá. Nhập liệu mỗi 1 record mà tới 3 nút lệnh phải nhấn và 1 đống code.

2. Tránh việc nhấn nút save 2 lần:
- Cách 1: Để nguyên dữ liệu trên textbox (chả hiểu giữ lại làm quái gì và tự gây khó cho mình): Dùng 1 biến kiểm tra số lần nhấn nút save. Nếu lớn hơn 1 thì la lên
- Cách 2: Nhấn 1 lần, vô hiệu nút save, chỉ khi nhấn new, mới kích hoạt lại nút save
- Cách 3: Dễ nhất, đơn giản nhất, chỉ cần nghĩ đơn giản là làm được (đừng suy nghĩ kiểu bác học với pro priếc làm gì): Kiểm tra trùng mã xong, ghi xuống sheet, xoá phứt 2 textbox. Nhấn lần thứ 2, hoặc là chả còn cái quái gì để ghi, hoặc là bẫy textbox trống không cho ghi. Với cách này, có thể vứt quách cái nút new. Hết chuyện.
 
Lần chỉnh sửa cuối:
Upvote 0
Bài của ptm 0412 là khá đủ điều kiện để bảo đảm bộ mã chuẩn mực, mình tham gia thêm là viết toàn bộ các điều kiện vào 1 hàm để kiểm tra. bình thường nút save đwowcj set enabled=false. chỉ khi nào hàm kiểm tra đủ dièu kiện mới set thành true

xin lỗi mình gõ 1 tay lộn xộn quá
 
Upvote 0
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!
 
Upvote 0
Upvote 0
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.

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é!
 
Upvote 0
Trời ạ. Xem cách 2 của mục 1 (Tránh nhập 1 mã đã có)
- Cách 2: Dùng hàm đếm giá trị textbox mã trong cột mã, nếu >0 nghĩa là đã có ...
Đừng nói là không biết dùng countif nha.
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
- Ai biểu không kiểm tra trùng làm chi?
- Ai biểu dấu sheet đi làm chi? Đừng nghĩ là chỉ hiện form, không hiện sheet là Pro. Pro thực sự viết ứng dụng excel để bán mới dấu sheet. Amateur thì lỗi tùm lum tá la, dấu rồi lấy ra lại không được thì chết sớm.
 
Lần chỉnh sửa cuối:
Upvote 0
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é!
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:
PHP:
Dim fRng As Range
Private Sub cbQuit_Click()
  Unload Me
End Sub
PHP:
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
PHP:
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
 

File đính kèm

Upvote 0
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: ...

Vậy là làm hết cho tác giả còn gì?
Tuy vậy, viết như thế này, gọn thì có gọn thật, nhưng chỉ 1 mình người viết là biết cách xài. Đưa cho người khác xài phải viết thêm "file hướng dẫn sử dụng"

Thôi lỡ rồi làm luôn:

1. Nếu chỉ thêm mã mới mà không sửa mã cũ, thì chỉ cần thêm điều kiện If trước khi ghi xuống sheet:

File bài 1, không có nút New.
PHP:
        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
2. Nếu muốn vừa thêm mã mới vừa sửa mã cũ như ndu:

Nếu là tôi thì tôi tách ra 2 nút lệnh trên sheet: "Thêm" và "Sửa"
Nhưng chỉ dùng 1 form với tuỳ biến như sau:

Code module:

PHP:
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
Code của form (không có nút New)

PHP:
'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
Ghi chú:
Có mỗi chuyện lấy iR là dòng cuối mà mắc gì phải .End(xlUp).Offset(1,0).Row? End(xlUp).Row + 1 có phải đơn giản hơn và nhanh hơn không? Đừng tư duy bác học nữa.

Xem file, nếu tự làm được hơn vậy hoặc hơn file của ndu, thì hãy nghĩ đến chuyện dấu sheet. Bản thân tôi chưa dám nghĩ đến dấu sheet vì còn phải xài thử rồi sửa cho đến khi hết lỗi. Và cũng không thích dấu làm gì, vì có bán cho ai đâu. Code còn để mở là khác.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tư vấn dùm Form nhập liệu

Em đ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.
 

File đính kèm

Upvote 0
Em đ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
 
Upvote 0
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

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é!
 

File đính kèm

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é!
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
 
Upvote 0
Viết thêm cho code không cho nhập dữ liệu trùng từ Form

Tôi có ví dụ nhỏ này, nhờ các anh em viết dùm thêm code cảnh báo nếu có dữ liệu nhập trùng (nếu trùng không cho nhập).
 

File đính kèm

Upvote 0
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

Cám ơn anh Thường nhiều! Đó chỉ là ví dụ để em làm một chương trình khác có khối lượng dữ liệu nhiều mà?
 
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?
 
Upvote 0
Xài tạm cái ni

PHP:
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
 
Upvote 0
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

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
Trùng mã

Chào các bạn!
Mình có chút vấn đề khi thiết kế form này nhờ các bạn giúp dùm nhé.
Cám ơn các bạn nhiều!
 

File đính kèm

Upvote 0
Nhờ lập công thức Báo trùng mã

Chào các bạn!
Mình nhờ các bạn hoàn thiện dùm form này nhé:
1/ Tại form nhà cung cấp nếu nhập trùng mã sẽ báo lỗi và hiện các thông tin khách hàng đã tồn tại tương ứng với các textbox trên form.
2/ Ghi vào các dòng tương ứng bên sheet ma.
cám ơn các bạn nhiều!!!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Khi chờ các cao thủ trả lời mình xin gửi bạn 1 ví dụ tại mình thấy file bạn nhiều quá nên mình không dám sửa mình dùng countif để tìm số trùng cái này có thể dùng phương thức find cũng được
 

File đính kèm

Upvote 0
Chào các bạn!
Mình nhờ các bạn hoàn thiện dùm form này 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.
Hay là bạn lại muốn nhờ làm sẵn từ A đến Z chứ không muốn tham khảo form có sẵn tương tự?
 
Lần chỉnh sửa cuối:
Upvote 0
Tạo nhiều ô trên Form để nhập liệu

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?
 

File đính kèm

Upvote 0
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?
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ô ích
Còn nếu "quá thích" form thì dùng SpreadSheet, cũng nhiều cột nhiều dòng
 
Upvote 0
đúng như a Ndu viết:
bài này tốt nhất ko dùng from vì dùng from sẽ mất thời gian nhập liệu ( phải kick vào save mỗi khi nhập xong)phoặc bạn muốn file của bạn pro hơn thì dùng from
 
Upvote 0
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?

Để trả lời 1 lần cho tất cả các nick hỏi về form nhập liệu:
- Tránh nhập trùng
- Nhập nhiều dòng
- nhập ngày tháng trên form
- ...

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

Hy vọng sau bài này không ai phải tạo nick mới để hỏi về vấn đề này nữa.

Dùng file của NHDK, chắc là cùng tác giả. (Việ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ác vấn đề cần lưu ý:

Tạo ra 1 đống textbox phải biết quản lý chúng:

- Đặt tên textbox theo nhóm và theo thứ tự, nếu không làm sao quản lý?
- TabStop phải theo thứ tự. Chứ không, nhập liệu 1 ô, enter, không biết con trỏ chạy đi đằng nào.

Những chuyện rất cơ bản và sơ đẳng như vậy mà không biết nữa thì thôi. Mất nửa tiếng để làm 2 việc này, chứ code chỉ quẹt quẹt mấy nhát là xong.
 

File đính kèm

Upvote 0
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ó 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"
Việ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ũng có khi là "nhiều" người nhưng cùng thầy
Ẹc... ẹc...
 
Lần chỉnh sửa cuối:
Upvote 0
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"

- Xoá code cho sự kiên Sophieu_Exit

- Thêm câu lệnh sau vào đầu code CommandButton1_Click:

If Len(SoPhieu) = 0 Then msgbox "So phieu khong duoc de trong!": SoPhieu.SetFocus: Exit Sub

Cũng có khi là "nhiều" người nhưng cùng thầy
Ẹc... ẹc...
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.
 
Lần chỉnh sửa cuối:
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

Anh ơi, em đã tải OWC11 về và cài nó rùi. Nhưng vẫn không được. Em đã diệt vi rút rùi mà không được nữa. Không biết sao nữa? Em dùng cả 2 office(2003 và 2007).
 
Upvote 0

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

Back
Top Bottom