Lệnh ghi đè dữ liệu cũ

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

vu mfu

Thành viên mới
Tham gia
25/9/09
Bài viết
22
Được thích
3
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Kế toán
File mình gửi chức nắng như sau:
Ở sheet Voucher: mỗi lần nhập chứng từ xong, ấn Save là dữ liệu sẽ được gán vào dòng cuối cùng ở sheet List
Mình muốn tạo 1 chức năng sửa chứng từ, gọi lại toàn bộ giao dịch theo số chứng từ (cột A trong sheet List), sau đó sửa thông tin, rồi ghi đè lên đúng số chứng từ muốn sửa trong sheet List
Chức năng gọi lại chứng từ thì mình làm được ở sheet "Edit" rồi, nhưng để ghi đè dữ liệu vào sheet List đúng cái dòng chứa số chứng từ (cột A) mình ko nghỉ ra cách
Có cao thủ nào có cách làm hay giúp mình với
 

File đính kèm

  • FY23-06_VIMFU.XLSB
    254 KB · Đọc: 14
Đương nhiên sửa và lưu là nhiều sub rồi.
Load dữ liệu lên 1 listbox, lọc nếu nhiều. Nếu chứng từ nhiều dòng thì cần 2 listbox cho cha và con (phần chung và vần chi tiết)

Chọn 1 chứng từ. Nhấn nút Sửa
Chuyển thông tin chung vào các textbox nhóm 1, Lưu các dòng chi tiết vào 1 mảng (Child). Load 1 trong các dòng vào các textbox nhóm 2
Ghi lại vị trí của chứng từ đó trên sheet
Sửa thông tin chung.
Sửa thông tin chi tiết dòng 1. Update chi tiết dòng 1 vào mảng Child. Nếu muốn hiển thị trên listbox con thì update vào
Chuyển xuống dòng chi tiết kế tiếp, sửa cho đến hết
Nếu xóa chi tiết thì phải xóa trong mảng Child, xóa trong listbox con
Nếu thêm dòng chi tiết thì phải thêm vào mảng Child, thêm trong listbox con

Nhấn nút lưu (có thể cũng vẫn là nút Sửa nhưng đã đổi Caption)
tra vị trí trên sheet, xóa dòng trên sheet
Tìm dòng cuối trên sheet
Lưu thông tin chung từ các textbox đã sửa
Lưu các dòng chi tiết từ mảng Child
Sort lại dữ liệu trên sheet
Cập nhật lại Rowsource của các listbox, combobox, ...

Mỗi sub có thể chia thành sub con tùy theo thực tế.

Nên vẽ sơ đồ khối lập trình trên giấy để thấy những tình huống khác nhau để rẽ nhánh
 
Lần chỉnh sửa cuối:
Upvote 0
Bài 21 là nói về những bước chính. Các bước trên có thể có những đoạn code mà việc khác cũng dùng, có thể tách ra sub con như sau:
1. Load dữ liệu: Hiển thị lên 2 Listbox và các textbox. Dùng cho Form initialize, sau khi sửa và sau khi nhập liệu mới
2. Lưu dữ liệu: Lưu sau khi sửa và sau khi tạo mới
3. Xóa dữ liệu: Dùng xóa cũ tạo mới khi sửa và cố tình xóa hẳn 1 chứng từ (1 giao dịch)
4. Cập nhật RowSource: Nhiều chỗ cần.
 
Upvote 0
Thích thì chiều. Bạn chủ thớt tham khảo và sửa lại cho phù hợp với bạn.
Phần code này chỉ là 1 phần nhỏ trong 1 workbook có rất nhiều modul
Code này tôi viết đã lâu rồi, tuy nhiên đến nay sử dụng vẫn chạy mượt dù rằng Dũ liệu đã được hàng ngày nhập thêm vào rất nhiều dòng (khoảng độ từ 40-60 dòng/ngày và 1 ngày chỉ có 1 phiếu NX) đến nay đã có gần 40k dòng (dữ liệu 2 năm làm mới một lần)
Mã:
Option Explicit
Option Base 1

Sub NHAPDL()
Dim i As Long
Dim t
i = Application.WorksheetFunction.CountIf(Sheets("TH").Range("A5:A65536"), Sheets("Nhap xuat").Range("M1"))
If i <> 0 Then
 t = MsgBox(" NGÀY NÀY ĐA CÓ DU LIÊU - BAN MUÔN SUA KHÔNG?" & Chr(10) & "NHÂN YES ĐÊ TIÊP TUC NHÂP" & Chr(10) & "NHÂN NO ĐÊ BO QUA", vbYesNo, "THÔNG BÁO")
    If t = vbYes Then
            Call KTRA ' kiêm tra tinh hop ly c?a du lieu nh?p vào
        If Sheets("Nhap xuat").[A1] = "X" Then
            MsgBox " Du lieu Nhap xuât chua đung-Hay kiêm tra lai": Exit Sub
        Else
            Call XoaDLcu
            Call Nhap
            Call XEP_A_Z
        End If
    End If
Else
 t = MsgBox(" NGÀY NÀY CHUA CÓ DU LIÊU - BAN MUÔN NHAP KHÔNG?" & Chr(10) & "NHÂN YES ĐÊ TIÊP TUC NHÂP" & Chr(10) & "NHÂN NO ĐÊ BO QUA", vbYesNo, "THÔNG BÁO")
    If t = vbYes Then
        Call KTRA
        If Sheet5.[A1] = "X" Then
                 MsgBox "CANH BAO: DU LIEU CHUA DUOC NHAP DO CHUA DUNG - HAY KIÊM TRA VÀ SUA LAI !?!", vbCritical
            Exit Sub
        Else
            Call Nhap
            Call XEP_A_Z
        End If
    End If
End If
MsgBox "ĐA XONG"

End Sub

Sub XoaDLcu()
 
 Dim D1 As Long
 Dim D2 As Long
    With Application.WorksheetFunction
        D1 = .Match(Sheets("Nhap xuat").Range("M1"), Sheets("TH").Range("A:A"), 0)
        D2 = .Match(Sheets("Nhap xuat").Range("M1"), Sheets("TH").Range("A:A"), 1)
    End With
        Sheets("TH").Activate
        Sheets("TH").Range(Cells(D1, 1), Cells(D2, 256)).ClearContents
        Sheets("Nhap xuat").Activate
 End Sub

Sub Nhap()

 Dim Arr(), KQ(), Ngay As Date
 Dim i&, k&, m&, cot&, j&, t&, S&, N&, d&
 Dim Ws As Worksheet, Sh As Worksheet
 
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = False

Set Sh = Sheets("Nhap xuat")
    Ngay = Sh.Range("M1")
     k = Sh.Range("A62").End(xlUp).Row
     Arr = Sh.Range("B6:AL" & k).Value
Set Ws = Sheets("TH")
cot = Ws.Range("IV1").End(xlToLeft).Column
 ReDim KQ(1 To UBound(Arr), 1 To cot + 20)
 For i = 1 To UBound(Arr)
    t = t + 1: KQ(t, 1) = CDate(Ngay)
        For j = 1 To 20  ' cot
            KQ(t, j + 1) = Arr(i, j)
        Next j
        For S = 24 To 29
            KQ(t, S - 1) = Arr(i, S)
        Next S
            KQ(t, 21) = Arr(i, 34)
            KQ(t, 22) = Arr(i, 35)
 Next i
 If t Then
    d = Ws.Range("A" & Rows.Count).End(xlUp).Row + 1
        Ws.Range("A" & d).Resize(100, 150).ClearContents
        Ws.Range("A" & d).Resize(t, 28) = KQ
End If

Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
Sub XEP_A_Z()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
On Error GoTo Thoat

Sheets("TH").Activate
    Range("A5:IV65536").Select
    ActiveWorkbook.Worksheets("TH").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("TH").Sort.SortFields.Add Key:=Range("A5"), SortOn _
        :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("TH").Sort
        .SetRange Range("A5:IV65536")
        .Apply
    End With
Thoat:
Sheets("Nhap xuat").Activate
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Cũng định sửa lại code cho nó ngắn gọn hơn , nhưng mà lại thôi.
Bạn chủ thớt tham khảo
Mọi người ghé qua xem, xin đừng ném đá - tôi đã nhận đủ để xây nhà rồi
Cảm ơn bạn nhé, đoạn code mình cần tìm chính là lệnh Xoadlcu, mình thêm lệnh đó vào thì hoàn thiện việc call và sửa chứng từ rồi.
Đa tạ cao thủ
 
Upvote 0
Web KT

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

Back
Top Bottom