Code cập nhật từ UserForm xuống bảng Sheet

Liên hệ QC

thanhtung0112

Thành viên chính thức
Tham gia
24/1/17
Bài viết
51
Được thích
5
Chào Anh Chị!
Hiện mình viết được bài Code là tra và nhập dữ liệu.
Bây giờ mình muốn sửa dữ liệu đã có mà không biết đoạn Code, nhờ anh chị giúp mình đoạn code với ạ, cảm ơn mọi người
 

File đính kèm

  • Tra CIC.xlsm
    1.3 MB · Đọc: 11
Chào Anh Chị!
Hiện mình viết được bài Code là tra và nhập dữ liệu.
Bây giờ mình muốn sửa dữ liệu đã có mà không biết đoạn Code, nhờ anh chị giúp mình đoạn code với ạ, cảm ơn mọi người
Bạn muốn thế nào thì nói rõ 1 chút. đọc xong ma cũng chưa hiểu bạn muốn giúp gì á
 
Upvote 0
Bạn muốn thế nào thì nói rõ 1 chút. đọc xong ma cũng chưa hiểu bạn muốn giúp gì á
VD: mình nhập CMND của người đó, thì form sẽ hiện thông tin người đó ra, nhưng mình muốn sửa và nhập lại thông tin khác của người đó lại thì phải làm như thế nào á
 
Upvote 0
Chào Anh Chị!
Hiện mình viết được bài Code là tra và nhập dữ liệu.
Bây giờ mình muốn sửa dữ liệu đã có mà không biết đoạn Code, nhờ anh chị giúp mình đoạn code với ạ, cảm ơn mọi người
Sửa đoạn code sau:
Mã:
Private Sub BtxReset_Click()
    If Txt01.Text = "" Then Exit Sub
    
    Dim Rng As Range, xFind As Range
    Set Rng = Sheet1.Range("B2:B5000")
    Set xFind = Rng.Find(Me.Txt01.Text, , , 1, , , 1)
    If Not xFind Is Nothing Then
        xFind = Txt01.Text
        xFind.Offset(0, 1) = Txt02.Text
        xFind.Offset(0, 2) = Txt03.Text
        xFind.Offset(0, 3) = Txt10.Text
    End If
    
    Txt01.Text = ""
    Txt02.Text = ""
    Txt03.Text = ""
    Txt10.Text = ""
End Sub
 

File đính kèm

  • Tra CIC.xlsm
    1.3 MB · Đọc: 17
Upvote 0
Sửa đoạn code sau:
Mã:
Private Sub BtxReset_Click()
    If Txt01.Text = "" Then Exit Sub
   
    Dim Rng As Range, xFind As Range
    Set Rng = Sheet1.Range("B2:B5000")
    Set xFind = Rng.Find(Me.Txt01.Text, , , 1, , , 1)
    If Not xFind Is Nothing Then
        xFind = Txt01.Text
        xFind.Offset(0, 1) = Txt02.Text
        xFind.Offset(0, 2) = Txt03.Text
        xFind.Offset(0, 3) = Txt10.Text
    End If
   
    Txt01.Text = ""
    Txt02.Text = ""
    Txt03.Text = ""
    Txt10.Text = ""
End Sub
Cảm ơn bạn nhiều lắm, mà bạn ơi mình muốn nhập thêm người mới sao đoạn Code báo lỗi không à, giúp mình sửa thêm đoạn Code Nhập mới nha.
 
Upvote 0
Cảm ơn bạn nhiều lắm, mà bạn ơi mình muốn nhập thêm người mới sao đoạn Code báo lỗi không à, giúp mình sửa thêm đoạn Code Nhập mới nha.
Bạn viết được đoạn code trong đó, tìm dòng cuối là viết được thôi (Search trên diễn đàn cách tìm dòng cuối).
 
Upvote 0
Bạn viết được đoạn code trong đó, tìm dòng cuối là viết được thôi (Search trên diễn đàn cách tìm dòng cuối).
Sao mình tìm không có thấy, bạn cho mình xin đường links nha, cảm ơn b nhiều. Nếu được bạn hướng dẫn mình sửa đoạn Code Nhập liệu thêm nha.
 
Upvote 0
Upvote 0
. . . Hiện mình viết được bài Code là tra và nhập dữ liệu.
Bây giờ mình muốn sửa dữ liệu đã có mà không biết đoạn Code, nhờ anh chị giúp mình đoạn code với ạ, cảm ơn mọi người
(1) Muốn sửa dữ liệu, ta phải tìm cho ra dữ liệu cần sửa;
Để vậy ta phải căn cứ vô trường (cột) duy nhất; Ở đây của bạn là trường (cột) CCCD

Ở đây có 2 trường hợp sẩy ra:
a./ Trường hợp dương tính: Đó là có người có số CCCD trước mặt bạn & nói cho bạn biết số CCCD của người ấy
b./ Trường hợp âm tính thì sao đây? Bạn sẽ tìm ở đâu số CCCD của người cần tìm? (Chả lả mỗi lần cần tìm 1 ai thì nhắc ĐT lên & gọi cho người đó?
Tóm lại là lấy số CCCD làm mã duy nhất cho CSDL về nhân sự là 5 ăn, 5 thua, phải không?

(2) Vấn đề này bạn chớ xem thường: Trong CSDL của bạn rất nhiều dòng sai chính tả & điều này mình có thể chụp cho bạn cái nón: Chưa thấy 2uan tài chưa đỗ lệ!
Hiễn nhiên 1 điều là họ & tên trong CCCD không như bạn đã ghi như dưới đây:

6290821404nguyễn thị duyênB0457231094890
7290420431nguyễn văn sơnB0457231031389
8075092000307lê thành vinhB0457231714805
9291199267mai thị kim huệB0457231684976
10270608065lê thành dươngB0457531920857
11072176002292phạm kim lanB0457231772566
12072072002857nguyễn thanh phúB0450
13075156000099nguyễn thị mườiB0457231778292

Đừng nói với tôi là bạn chỉ đưa lên vậy cho nhanh thôi, trong bản gốc không như vậy đó nha! Vì có như vậy thì bạn đã xem thường những đọc giả trên GPE này khi cần đọc file của bạn 1 khi có nhã ý muốn giúp đỡ bạn chút nào đó.

(3) Bạn tham khảo cách mình tạo bộ mã nhân viên như mô tả dưới đây:

STTMã NVHọ và TênMã CụmMã CICCMND
1FHP00Đinh Hòang PhongB0457231593990312059633
2FVP00Đặng Văn PhátB0457231718920072074001267
3FVS00Đặng Văn SươngB0457231817621290357527
4LTA00Lê Thanh AnhB0457231714805075092000307
5LTD00Lê Thành DươngB0457531920857270608065
6LTD01Lê Tấn DũngB0457231772566072176002292
7LTD02Lê Thi Thùy DungB0450072072002857
8LTV00Lê Thiện VinhB0457231778675072071001972
9MKH00Mai Thị Kim HuệB0457231684976291199267
10NTM00Nguyễn Thị MườiB0457231778292075156000099
11NCH00Nguyễn Thị Cẩm HằngB0457935323700072174000940
12NFD00Ngô Đức DũngB0457231031389290420431
13NHT00Nguyễn Hoàng TrangB0457231050666290188957
14NJD00Ngô DuyênB0457231094890290821404
15NTL00Nguyễn Thị LiờnB0507231591251290045082
16PKM00Phạm Kim MâyB0457231158552290188737
17PML00Phan Thị Mỹ LinhB0457231624125290743931
18TBB00Trần Thị Bé BảyB0457231002817072165001046
19TMH00Trần Thị Mỹ HạnhB0457231700668072168000948
20TMN00Từ Minh NhiềuB0457231018945072073001361
21VKN00Võ Thị Kim NươngB0457931152773290541974

. . . . .
Chúc các bạn vui vẻ & mạnh khỏe!
 
Upvote 0
...

(2) Vấn đề này bạn chớ xem thường: Trong CSDL của bạn rất nhiều dòng sai chính tả & điều này mình có thể chụp cho bạn cái nón: Chưa thấy 2uan tài chưa đỗ lệ!
Hiễn nhiên 1 điều là họ & tên trong CCCD không như bạn đã ghi như dưới đây:
...
Người ta chỉ làm hồ sơ thôi.
Kẻ thấy quan tài là những kẻ trong danh sách.
 
Upvote 0
Người ta chỉ làm hồ sơ thôi.
Kẻ thấy quan tài là những kẻ trong danh sách.
1./ Nhớ vào khoảng năm 95, khi triển khai số BHXH trong các CQ quốc doanh, mình tá hỏa khi thẻ quân nhân ghi 1 ông sỹ quan chuyển ngành sinh ngày 30/02
Khi đem hồ sơ trình sở LĐ TB & XH tỉnh, các ông bà 2uan hàng tỉnh nhất quyết không chịu . . . (?)
2./ Cũng thời gian gần trước đó, người tiền nhiệm đã thêm 1 đấu chấm cho 1 trong 2 người trùng cả họ, đệm & tên; Các 2uan trên tỉnh cũng phát hiện ra & bắt vạ . . . . toát mồ hôi hột!
. . . .
Trên đe, đưới búa cũng không sướng ích gì cho lắm!
 
Upvote 0
Cảm ơn bạn nhiều lắm, mà bạn ơi mình muốn nhập thêm người mới sao đoạn Code báo lỗi không à, giúp mình sửa thêm đoạn Code Nhập mới nha.
Nếu muốn trong Txt01 vừa có thể nhập CMND ĐÃ CÓ để sửa thông tin và vừa có thể nhập CMND CHƯA CÓ để nhập mới thì không thể có code kiểu

Mã:
Private Sub Txt01_AfterUpdate()
'Check to see if value exists
If Me!Txt01.Text = "" Then Exit Sub
If WorksheetFunction.CountIf(Sheet1.Range("B:B"), Me.Txt01.Value) = 0 Then
MsgBox "CMND sai OR k CIC "
Me.Txt01.Value = ""
Exit Sub
End If
'Lookup values based on first control
With Me
.Txt02 = Application.WorksheetFunction.VLookup(Me.Txt01.Value, Sheet1.Range("lookup"), 2, 0)
.Txt10 = Application.WorksheetFunction.VLookup(Me.Txt01.Value, Sheet1.Range("lookup"), 4, 0)
.Txt03 = Application.WorksheetFunction.VLookup(Me.Txt01.Value, Sheet1.Range("lookup"), 3, 0)
End With
End Sub

Hãy suy nghĩ chút đi. Tạo hóa đã cho cái hộp trên cổ thì nên tận dụng nó. Nếu nhập CMND CHƯA CÓ thì dĩ nhiên
WorksheetFunction.CountIf(Sheet1.Range("B:B"), Me.Txt01.Value) = 0

và do vậy code MsgBox "CMND sai OR k CIC " được thực thi, tức thông báo lỗi.

Phải sửa thành vd.
Mã:
Private Sub Txt01_AfterUpdate()
Dim rng As Range, cell_ As Range
    Txt01.Tag = ""  ' TAG  = 0 co nghia la CMND trong txt01 CHUA CO
    If Txt01.Text = "" Then Exit Sub
    Set rng = Sheet1.Range("B2:B5000")
    Set cell_ = rng.Find(Me.Txt01.Text, , xlValues, xlWhole, xlByRows, xlNext)
    If Not cell_ Is Nothing Then    ' tim thay CMND DA CO
        With cell_
            Txt02 = .Offset(0, 1).Value
            Txt10 = .Offset(0, 3).Value
            Txt03 = .Offset(0, 2).Value
        End With
        Txt01.Tag = cell_.Address   ' CMND DA CO, tuc se sua thong tin, vay ghi dia chi cua o co CMND hien hanh vao TAG cua TextBox
    End If
End Sub

Code ghi thông tin vào thuộc tính TAG của txt01: Nếu TAG <> "" thì có nghĩa là chứa địa chỉ của ô trên sheet có CMND ĐÃ CÓ.

Không cần tới 2 nút CommandButton. Chỉ 1 button thôi, vd. lấy BtxReset.

Mã:
Private Sub BtxReset_Click()
Dim EndR As Long
    If Txt01.Text = "" Then Exit Sub
    If Txt01.Tag <> "" Then ' CMND DA CO -> sua thong tin
        With Sheet1.Range(Txt01.Tag)
            .Offset(0, 1) = Txt02.Text
            .Offset(0, 2) = Txt03.Text
            .Offset(0, 3) = Txt10.Text
        End With
    Else    ' CMND CHUA CO -> them thong tin
        With Sheets("Data")
            EndR = .Range("B" & Rows.Count).End(xlUp).Row
            .Range("B" & EndR + 1) = Txt01.Text
            .Range("C" & EndR + 1) = Txt02.Text
            .Range("D" & EndR + 1) = Txt03.Text
            .Range("E" & EndR + 1) = Txt10.Text
        End With
    End If
   
    Txt01.Text = ""
    Txt02.Text = ""
    Txt03.Text = ""
    Txt10.Text = ""
End Sub

Vứt bỏ nút btxNhapvaThem.

Nhìn qua là thế, hãy test kỹ.
-------------
Bạn viết được đoạn code trong đó, tìm dòng cuối là viết được thôi (Search trên diễn đàn cách tìm dòng cuối).

Người ta biết tìm dòng cuối mà.
Trích btxNhapvaThem_Click
EndR = .Range("B" & Rows.Count).End(xlUp).Row
 
Upvote 0
Nếu muốn trong Txt01 vừa có thể nhập CMND ĐÃ CÓ để sửa thông tin và vừa có thể nhập CMND CHƯA CÓ để nhập mới thì không thể có code kiểu

Mã:
Private Sub Txt01_AfterUpdate()
'Check to see if value exists
If Me!Txt01.Text = "" Then Exit Sub
If WorksheetFunction.CountIf(Sheet1.Range("B:B"), Me.Txt01.Value) = 0 Then
MsgBox "CMND sai OR k CIC "
Me.Txt01.Value = ""
Exit Sub
End If
'Lookup values based on first control
With Me
.Txt02 = Application.WorksheetFunction.VLookup(Me.Txt01.Value, Sheet1.Range("lookup"), 2, 0)
.Txt10 = Application.WorksheetFunction.VLookup(Me.Txt01.Value, Sheet1.Range("lookup"), 4, 0)
.Txt03 = Application.WorksheetFunction.VLookup(Me.Txt01.Value, Sheet1.Range("lookup"), 3, 0)
End With
End Sub

Hãy suy nghĩ chút đi. Tạo hóa đã cho cái hộp trên cổ thì nên tận dụng nó. Nếu nhập CMND CHƯA CÓ thì dĩ nhiên
WorksheetFunction.CountIf(Sheet1.Range("B:B"), Me.Txt01.Value) = 0

và do vậy code MsgBox "CMND sai OR k CIC " được thực thi, tức thông báo lỗi.

Phải sửa thành vd.
Mã:
Private Sub Txt01_AfterUpdate()
Dim rng As Range, cell_ As Range
    Txt01.Tag = ""  ' TAG  = 0 co nghia la CMND trong txt01 CHUA CO
    If Txt01.Text = "" Then Exit Sub
    Set rng = Sheet1.Range("B2:B5000")
    Set cell_ = rng.Find(Me.Txt01.Text, , xlValues, xlWhole, xlByRows, xlNext)
    If Not cell_ Is Nothing Then    ' tim thay CMND DA CO
        With cell_
            Txt02 = .Offset(0, 1).Value
            Txt10 = .Offset(0, 3).Value
            Txt03 = .Offset(0, 2).Value
        End With
        Txt01.Tag = cell_.Address   ' CMND DA CO, tuc se sua thong tin, vay ghi dia chi cua o co CMND hien hanh vao TAG cua TextBox
    End If
End Sub

Code ghi thông tin vào thuộc tính TAG của txt01: Nếu TAG <> "" thì có nghĩa là chứa địa chỉ của ô trên sheet có CMND ĐÃ CÓ.

Không cần tới 2 nút CommandButton. Chỉ 1 button thôi, vd. lấy BtxReset.

Mã:
Private Sub BtxReset_Click()
Dim EndR As Long
    If Txt01.Text = "" Then Exit Sub
    If Txt01.Tag <> "" Then ' CMND DA CO -> sua thong tin
        With Sheet1.Range(Txt01.Tag)
            .Offset(0, 1) = Txt02.Text
            .Offset(0, 2) = Txt03.Text
            .Offset(0, 3) = Txt10.Text
        End With
    Else    ' CMND CHUA CO -> them thong tin
        With Sheets("Data")
            EndR = .Range("B" & Rows.Count).End(xlUp).Row
            .Range("B" & EndR + 1) = Txt01.Text
            .Range("C" & EndR + 1) = Txt02.Text
            .Range("D" & EndR + 1) = Txt03.Text
            .Range("E" & EndR + 1) = Txt10.Text
        End With
    End If
  
    Txt01.Text = ""
    Txt02.Text = ""
    Txt03.Text = ""
    Txt10.Text = ""
End Sub

Vứt bỏ nút btxNhapvaThem.

Nhìn qua là thế, hãy test kỹ.
-------------



Người ta biết tìm dòng cuối mà.
Trích btxNhapvaThem_Click
Cảm ơn bạn rất nhiều
 
Upvote 0
Nếu muốn trong Txt01 vừa có thể nhập CMND ĐÃ CÓ để sửa thông tin và vừa có thể nhập CMND CHƯA CÓ để nhập mới thì không thể có code kiểu
...
Tại thớt làm theo kiểu "nghĩ đến đâu làm đến đó". Không có một kế hoạch sẵn.
Entry Form là chuyện lâu dài. Đáng lẽ trước khi làm phải lên kế hoạch. Công việc đầu tiên trong kế hoạch là "dò xét chung quanh xem muốn làm như thế thì thường người ta thiết kế thế nào"

Thông lệ của loại Add/Update/Delete Records này là:

- Đặt một cái label khá rõ ở đầu form
- Khi người nhập gõ vào một KEY (khoá chính, ID) thì code sẽ xét:
-- Nếu KEY không có thì hiện lên cái label "Nhập Hồ sơ mới cho ID: ...."
..... và xoá trống hết các controls khác, chỉ hiện lên các mặc định
..... và ẩn button Update Curent Record đồng thời hiện button Add New Record
-- Nếu KEY có sẵn thì hiện lên cái label "chỉnh hồ sơ cho ID...."
..... và moi dữ liệu, hiển thị lên form. Các dữ liệu không cho phép chỉnh thì đặt thêm tag không cho chỉnh.
..... và ẩn button button Add New Record đồng thời hiện Update Curent Record. Hiện thêm button Delete Record.
-- Và cả hai trường hợp, nếu bấm nút Back thì trở lại từ đầu.
 
Upvote 0
Web KT

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

Back
Top Bottom