Xin code tự chèn dòng khi thêm mã (1 người xem)

  • Thread starter Thread starter LYSM
  • Ngày gửi Ngày gửi

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

LYSM

Thành viên thường trực
Tham gia
16/3/11
Bài viết
290
Được thích
26
Em chào các thầy cô, anh chị!
Em muốn chèn dòng khi thêm mã như file đính kèm, nhờ các thầycô và anh chị giúp đỡ em. Cũng có nhiều chủ đề về tự động chèn dòng nhưng emchưa thấy giống yêu cầu của em, mong mọi người giúp đỡ. Em cảm ơn nhiều!
PS: Thêm 1 ý nữa là khi em xóa đi 1 mã nào đó thì bảng cũng tự độngxóa các dữ liệu liên quan đến mã đó
Chúc các thầy cô, anh chị có kỳ nghỉ lễ vui vẻ!
 

File đính kèm

Lần chỉnh sửa cuối:
Em chào các thầy cô, anh chị!
Em muốn chèn dòng khi thêm mã như file đính kèm, nhờ các thầycô và anh chị giúp đỡ em. Cũng có nhiều chủ đề về tự động chèn dòng nhưng emchưa thấy giống yêu cầu của em, mong mọi người giúp đỡ. Em cảm ơn nhiều!
Chúc các thầy cô, anh chị có kỳ nghỉ lễ vui vẻ!
Bạn cứ insert ở dòng cuối rùi sort lại là đc mà. Bạn thử xem.
 
Upvote 0
Bác ơi, thế thì nói làm gì, em có khoảng 250 mã ĐL, 80 mã SP. Nếu mà cứ thêm 1 mã ĐL insert thêm 80 dòng, thêm 1 mã SP insert thêm 250 dòng thì chết, lại còn bị nhầm lẫn nữa.
Mình nói hơi lộn, chỉ cần add thêm ở cuối bảng rùi sort lại.
Mà mục đích của bạn là chèn thêm (insert) dòng mà.
 
Upvote 0
Mình nói hơi lộn, chỉ cần add thêm ở cuối bảng rùi sort lại.
Mà mục đích của bạn là chèn thêm (insert) dòng mà.
Hiện tại bên em vẫn đang làm thủ công như thế nên rất mất thờigian và còn bị nhầm nữa, tháng vừa rồi bị nhầm mất mấy chục triệu , may mà pháthiện kịp thời.
 
Upvote 0
Hiện tại bên em vẫn đang làm thủ công như thế nên rất mất thờigian và còn bị nhầm nữa, tháng vừa rồi bị nhầm mất mấy chục triệu , may mà pháthiện kịp thời.
Ko biết bạn làm thủ công thế nào chứ sao mà nhầm đc, cứ làm như mình nói là đơn giản nhất rùi
Bạn check file xem thế nào
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ko biết bạn làm thủ công thế nào chứ sao mà nhầm đc, cứ làm như mình nói là đơn giản nhất rùi
Bạn check file xem thế nào

Cám ơn bác, phần chèn dòng thì chuẩn rồi, nhưng khi xóa cácmã vừa thêm vào thì bảng cập nhật chưa chuẩn, em muốn khi xóa các mã A4,SP3 đithì bảng trở về giống bảng 1. Bác xem giúp em nốt phần này với.
 
Upvote 0
Em chào các thầy cô, anh chị!
Em muốn chèn dòng khi thêm mã như file đính kèm, nhờ các thầycô và anh chị giúp đỡ em. Cũng có nhiều chủ đề về tự động chèn dòng nhưng emchưa thấy giống yêu cầu của em, mong mọi người giúp đỡ. Em cảm ơn nhiều!
PS: Thêm 1 ý nữa là khi em xóa đi 1 mã nào đó thì bảng cũng tự độngxóa các dữ liệu liên quan đến mã đó
Chúc các thầy cô, anh chị có kỳ nghỉ lễ vui vẻ!
bạn kiểm tra lại xem ổn chưa
 

File đính kèm

Upvote 0
Cám ơn bác, phần chèn dòng thì chuẩn rồi, nhưng khi xóa cácmã vừa thêm vào thì bảng cập nhật chưa chuẩn, em muốn khi xóa các mã A4,SP3 đithì bảng trở về giống bảng 1. Bác xem giúp em nốt phần này với.
Cập nhật code cho bạn, lưu ý tên sheet bỏ dấu đi nhé. Bạn check file
 

File đính kèm

Upvote 0
Chuẩn rồi bác ạ, nhưng khi em xóa mã đi thì nó vẫn còn thừa1 đoạn table trống bên sheet Chiết khấu, có cách nào bỏ đoạn table này đi khôngbác?
Bạn sửa lại code
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, j As Long
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
    CKarr = Range("A4:E" & Range("A4").End(xlDown).Row)
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    For j = 1 To UBound(CKarr)
        If Arr(i, 1) = CKarr(j, 1) And Arr(i, 2) = CKarr(j, 2) Then
            Arr(i, 3) = CKarr(j, 3)
            Arr(i, 4) = CKarr(j, 4)
            Arr(i, 5) = CKarr(j, 5)
        End If
    Next j
Next i
Range("A4:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:E" & Range("A4").End(xlDown).Row)
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn sửa lại code
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, j As Long
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
    CKarr = Range("A4:E" & Range("A4").End(xlDown).Row)
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    For j = 1 To UBound(CKarr)
        If Arr(i, 1) = CKarr(j, 1) And Arr(i, 2) = CKarr(j, 2) Then
            Arr(i, 3) = CKarr(j, 3)
            Arr(i, 4) = CKarr(j, 4)
            Arr(i, 5) = CKarr(j, 5)
        End If
    Next j
Next i
Range("A4:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:E" & Range("A4").End(xlDown).Row)
Application.ScreenUpdating = True
End Sub

Khi phần CKarr(j,3), CKarr(j,4), CKarr(j,5) là công thức thì có cách nào sau khi chạy code vẫn giữ được công thức không bác?
 
Upvote 0
Khi phần CKarr(j,3), CKarr(j,4), CKarr(j,5) là công thức thì có cách nào sau khi chạy code vẫn giữ được công thức không bác?
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, j As Long
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 2)
Application.ScreenUpdating = False
Sheets(2).Select
    CKarr = Range("A4:E" & Range("A4").End(xlDown).Row)
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
Next i
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 2) = Arr
Range("C4:E4").Copy
Range("C5").Resize(UBound(Arr) - 1, 3).Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.ListObjects("Table1").Resize Range("A3:E" & Range("A4").End(xlDown).Row)
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, j As Long
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 2)
Application.ScreenUpdating = False
Sheets(2).Select
    CKarr = Range("A4:E" & Range("A4").End(xlDown).Row)
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
Next i
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 2) = Arr
Range("C4:E4").Copy
Range("C5").Resize(UBound(Arr) - 1, 3).Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveSheet.ListObjects("Table1").Resize Range("A3:E" & Range("A4").End(xlDown).Row)
Application.ScreenUpdating = True
End Sub
Bác ơi, có cách nào mà khi nó là công thức thì vẫn giữ được công thức, còn khi nó là số thì vẫn giữ được số không ạ? Em copy code trên vào nếu ở dạng số nó cho ra toàn số giống nhau hết.
 
Upvote 0
Bác ơi, có cách nào mà khi nó là công thức thì vẫn giữ được công thức, còn khi nó là số thì vẫn giữ được số không ạ? Em copy code trên vào nếu ở dạng số nó cho ra toàn số giống nhau hết.
số nằm trong nguyên 1 cột hay nằm lung tung ở các cột và dòng? gởi file xem sao
 
Upvote 0
số nằm trong nguyên 1 cột hay nằm lung tung ở các cột và dòng? gởi file xem sao

Nó nằm lung tung bác ạ, em lấy ví dụ ở cột D (CK2), vì đối với mỗi đại lý khác nhau lại có chế độ chiết khấu khác nhau. Em cám ơn bác nhiều!
 

File đính kèm

Upvote 0
Nó nằm lung tung bác ạ, em lấy ví dụ ở cột D (CK2), vì đối với mỗi đại lý khác nhau lại có chế độ chiết khấu khác nhau. Em cám ơn bác nhiều!
Table tự động thực các lệnh khó chịu quá không kiểm soát được, chạy code không được
 
Upvote 0
bạn kiểm tra lại file, đã bỏ table 3 cột cuối

File này thì chuẩn rồi bác ạ, có điều khi em đưa danh sách 250 đại lý và 50 sản phẩm mà chạy là nó đứng hình luôn. Em dùng excel 2013, nếu là excel 2010 thì chậm nhưng vẫn ra kết quả. Có cách nào cải thiện được tốc độ của nó không bác? Em cám ơn bác nhiều.
 
Upvote 0
File này thì chuẩn rồi bác ạ, có điều khi em đưa danh sách 250 đại lý và 50 sản phẩm mà chạy là nó đứng hình luôn. Em dùng excel 2013, nếu là excel 2010 thì chậm nhưng vẫn ra kết quả. Có cách nào cải thiện được tốc độ của nó không bác? Em cám ơn bác nhiều.
Bạn dùng code mới xem sao
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, j As Long
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    For j = 1 To UBound(CKarr)
        If Arr(i, 1) = CKarr(j, 1) And Arr(i, 2) = CKarr(j, 2) Then
            Arr(i, 3) = CKarr(j, 3)
            Arr(i, 4) = CKarr(j, 4)
            Arr(i, 5) = CKarr(j, 5)
        End If
    Next j
Next i
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Hiện tại bên em vẫn đang làm thủ công như thế nên rất mất thờigian và còn bị nhầm nữa, tháng vừa rồi bị nhầm mất mấy chục triệu , may mà pháthiện kịp thời.

Trời, doanh nghiệp 250 đại lý, 80 sản phẩm mà dùng Excel để quản lý. Tiết kiệm kiểu này thì mất tiền chả có gì là lạ.
 
Upvote 0
xin anh cho cái đề nghị ta nên dùng cái gì để quản lý cái sòng này ạ ? ;;;;;;;;;;;;;;;;;;;;;;

Dùng tiền chứ dùng cái gì. Cỡ tầm quy mô như thế này thì phải mướn chuyên viên chứ hỏi từng bước trên mạng thì cho đến ngày quản lý được chắc đã thất thu hàng trăm triệu.
 
Upvote 0
Dùng tiền chứ dùng cái gì. Cỡ tầm quy mô như thế này thì phải mướn chuyên viên chứ hỏi từng bước trên mạng thì cho đến ngày quản lý được chắc đã thất thu hàng trăm triệu.
nhờ vậy mà mình có điều kiện luyện code, tới hôm nay mới mò ra được vụ .Formular
còn vụ Table tự động điền công thức thì chịu thua, các bạn có cách nào xử giúp mình
 
Lần chỉnh sửa cuối:
Upvote 0
Trời, doanh nghiệp 250 đại lý, 80 sản phẩm mà dùng Excel để quản lý. Tiết kiệm kiểu này thì mất tiền chả có gì là lạ.

Tìm hết phần mềm rồi bạn, nhưng nó không đáp ứng được các điều kiện cụ thể đặc biệt là tính mở. Đến như công ty mình đang làm có cả ERP mua 100 tr $ mà vẫn phải dùng kết hợp cả excel chứ chưa nói mấy phần mềm khác. Mà có như bạn nói thuê chuyên gia thì họ cũng phải dùng 1 phần mềm nào đó chứ họ có tính nhẩm được đâu. Tiện đây xin bạn giới thiệu giúp mình một vài phần mềm có thể thay thế đc excel.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn dùng code mới xem sao
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, j As Long
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    For j = 1 To UBound(CKarr)
        If Arr(i, 1) = CKarr(j, 1) And Arr(i, 2) = CKarr(j, 2) Then
            Arr(i, 3) = CKarr(j, 3)
            Arr(i, 4) = CKarr(j, 4)
            Arr(i, 5) = CKarr(j, 5)
        End If
    Next j
Next i
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
Em cảm ơn bác đã không ngại bỏ thời gian ra giúp em, cũngkhông thấy có cải thiện mấy bác ạ. Chắc tại dữ liệu nhiều nên 2 vòng lặp i,jgây ra. Chắc phải chấp nhận thôi.
 
Upvote 0
Em cảm ơn bác đã không ngại bỏ thời gian ra giúp em, cũngkhông thấy có cải thiện mấy bác ạ. Chắc tại dữ liệu nhiều nên 2 vòng lặp i,jgây ra. Chắc phải chấp nhận thôi.
bạn chạy thử code mới, nhanh hơn nhiều
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, Rws As Long, Tem As String, Dic As Object
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "!@#$" & CKarr(i, 2)
    Dic.Add Tem, i
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "!@#$" & Arr(i, 2)
    Rws = Dic.Item(Tem)
    Arr(i, 3) = CKarr(Rws, 3)
    Arr(i, 4) = CKarr(Rws, 4)
    Arr(i, 5) = CKarr(Rws, 5)
Next i
Set Dic = Nothing
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
 
Upvote 0
bạn chạy thử code mới, nhanh hơn nhiều
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, Rws As Long, Tem As String, Dic As Object
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "!@#$" & CKarr(i, 2)
    Dic.Add Tem, i
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "!@#$" & Arr(i, 2)
    Rws = Dic.Item(Tem)
    Arr(i, 3) = CKarr(Rws, 3)
    Arr(i, 4) = CKarr(Rws, 4)
    Arr(i, 5) = CKarr(Rws, 5)
Next i
Set Dic = Nothing
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
Nó báo lỗi Subcrip out of range bác ạ
 

File đính kèm

Upvote 0
Nó báo lỗi Subcrip out of range bác ạ
thêm hàm If để bẩy lổi
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, Rws As Long, Tem As String, Dic As Object
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "!@#$" & CKarr(i, 2)
    Dic.Add Tem, i
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "!@#$" & Arr(i, 2)
    Rws = Dic.Item(Tem)
    [COLOR=#ff0000]If Rws > 0 Then[/COLOR]
        Arr(i, 3) = CKarr(Rws, 3)
        Arr(i, 4) = CKarr(Rws, 4)
        Arr(i, 5) = CKarr(Rws, 5)
    [COLOR=#ff0000]End If[/COLOR]
Next i
Set Dic = Nothing
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
 
Upvote 0
thêm hàm If để bẩy lổi
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, Rws As Long, Tem As String, Dic As Object
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "!@#$" & CKarr(i, 2)
    Dic.Add Tem, i
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "!@#$" & Arr(i, 2)
    Rws = Dic.Item(Tem)
    [COLOR=#ff0000]If Rws > 0 Then[/COLOR]
        Arr(i, 3) = CKarr(Rws, 3)
        Arr(i, 4) = CKarr(Rws, 4)
        Arr(i, 5) = CKarr(Rws, 5)
    [COLOR=#ff0000]End If[/COLOR]
Next i
Set Dic = Nothing
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
Chạy trực tiếp thì ngon nhưng chạy trong cửa sổ VBE nó cứbáo lỗi “out of memory” là sao bác nhỉ? Vì em muốn tạo 1 nút bấm để khi nàoupdate dữ liệu thì bấm vào đó.
 
Upvote 0
thêm hàm If để bẩy lổi
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, Rws As Long, Tem As String, Dic As Object
DLarr = Range("A5:A" & Range("A5").End(xlDown).Row)
SParr = Range("B5:B" & Range("B5").End(xlDown).Row)
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "!@#$" & CKarr(i, 2)
    Dic.Add Tem, i
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "!@#$" & Arr(i, 2)
    Rws = Dic.Item(Tem)
    [COLOR=#ff0000]If Rws > 0 Then[/COLOR]
        Arr(i, 3) = CKarr(Rws, 3)
        Arr(i, 4) = CKarr(Rws, 4)
        Arr(i, 5) = CKarr(Rws, 5)
    [COLOR=#ff0000]End If[/COLOR]
Next i
Set Dic = Nothing
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub

Chạy trực tiếp thì ngon nhưng chạy trong cửa sổ VBE nó cứbáo lỗi “out of memory” là sao bác nhỉ? Vì em muốn tạo 1 nút bấm để khi nàoupdate dữ liệu thì bấm vào đó.
PS: Gắn button vào chạy cũng không sao, chỉ khi view code rồiấn vào nút run trên đó sẽ xuất hiện một số lỗi như “out of memory”, “this keyalready associated with an element of this collection|”
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chạy trực tiếp thì ngon nhưng chạy trong cửa sổ VBE nó cứbáo lỗi “out of memory” là sao bác nhỉ? Vì em muốn tạo 1 nút bấm để khi nàoupdate dữ liệu thì bấm vào đó.
sheet bangma bạn đã cài chế độ tự động chạy code rồi, thì nút bấm chạy trực tiếp không làm thay đổi kết quả
bạn xóa code trong sheet bangma và chạy code sau
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, Rws As Long, Tem As String, Dic As Object
[COLOR=#ff0000]With Sheets(1)[/COLOR]
[COLOR=#ff0000]    DLarr = .Range("A5:A" & .Range("A5").End(xlDown).Row)[/COLOR]
[COLOR=#ff0000]    SParr = .Range("B5:B" & .Range("B5").End(xlDown).Row)[/COLOR]
[COLOR=#ff0000]End With[/COLOR]
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "!@#$" & CKarr(i, 2)
    Dic.Add Tem, i
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "!@#$" & Arr(i, 2)
    Rws = Dic.Item(Tem)
    If Rws > 0 Then
        Arr(i, 3) = CKarr(Rws, 3)
        Arr(i, 4) = CKarr(Rws, 4)
        Arr(i, 5) = CKarr(Rws, 5)
    End If
Next i
Set Dic = Nothing
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
 
Upvote 0
sheet bangma bạn đã cài chế độ tự động chạy code rồi, thì nút bấm chạy trực tiếp không làm thay đổi kết quả
bạn xóa code trong sheet bangma và chạy code sau
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, Rws As Long, Tem As String, Dic As Object
[COLOR=#ff0000]With Sheets(1)[/COLOR]
[COLOR=#ff0000]    DLarr = .Range("A5:A" & .Range("A5").End(xlDown).Row)[/COLOR]
[COLOR=#ff0000]    SParr = .Range("B5:B" & .Range("B5").End(xlDown).Row)[/COLOR]
[COLOR=#ff0000]End With[/COLOR]
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "!@#$" & CKarr(i, 2)
    Dic.Add Tem, i
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "!@#$" & Arr(i, 2)
    Rws = Dic.Item(Tem)
    If Rws > 0 Then
        Arr(i, 3) = CKarr(Rws, 3)
        Arr(i, 4) = CKarr(Rws, 4)
        Arr(i, 5) = CKarr(Rws, 5)
    End If
Next i
Set Dic = Nothing
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
Nó báo lỗi này bác ạ “this key already associated with anelement of this collection”
em có để file đính kèm bên trên khi báo lỗi đó bác. Vì em làm cho người không biết gì về excel nên nếu lỗi họ không biết xử lý.
 
Lần chỉnh sửa cuối:
Upvote 0
Chạy trực tiếp thì ngon nhưng chạy trong cửa sổ VBE nó cứbáo lỗi “out of memory” là sao bác nhỉ? Vì em muốn tạo 1 nút bấm để khi nàoupdate dữ liệu thì bấm vào đó.
PS: Gắn button vào chạy cũng không sao, chỉ khi view code rồiấn vào nút run trên đó sẽ xuất hiện một số lỗi như “out of memory”, “this keyalready associated with an element of this collection|”

Bạn chạy thử File này coi sao.
Điều kiện mỗi sheet phải có vài dòng dữ liệu
 

File đính kèm

Upvote 0
Nó báo lỗi này bác ạ “this key already associated with anelement of this collection”
em có để file đính kèm bên trên khi báo lỗi đó bác. Vì em làm cho người không biết gì về excel nên nếu lỗi họ không biết xử lý.
nhiều dòng Ma DL và Ma SP trùng nhau nên nó báo lổi, nếu chạy code ngay từ đầu thì không bị tình trạng nầy
bạn chỉnh code lại
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, Rws As Long, Tem As String, Dic As Object
[COLOR=#ff0000]With Sheets(1)[/COLOR]
[COLOR=#ff0000]    DLarr = .Range("A5:A" & .Range("A5").End(xlDown).Row)[/COLOR]
[COLOR=#ff0000]    SParr = .Range("B5:B" & .Range("B5").End(xlDown).Row)[/COLOR]
[COLOR=#ff0000]End With[/COLOR]
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "!@#$" & CKarr(i, 2)
[COLOR=#ff0000]    If Not Dic.Exists(Tem) Then Dic.Add Tem, i[/COLOR]
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "!@#$" & Arr(i, 2)
    Rws = Dic.Item(Tem)
    If Rws > 0 Then
        Arr(i, 3) = CKarr(Rws, 3)
        Arr(i, 4) = CKarr(Rws, 4)
        Arr(i, 5) = CKarr(Rws, 5)
    End If
Next i
Set Dic = Nothing
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Vâng, em cám ơn bác #HieuCD và thầy #Ba Tê nhiều.
Em thấy khá ổn rồi, có gì khúc mắc em lại lên hỏi sau ạ.

 
Upvote 0
nhờ vậy mà mình có điều kiện luyện code, tới hôm nay mới mò ra được vụ .Formular
còn vụ Table tự động điền công thức thì chịu thua, các bạn có cách nào xử giúp mình

Theo tôi thấy thì khả năng code của bạn đã cao lắm rồi, ít nhất cũng hơn tôi. Bạn đã đạt đến mức có thể tự tin mà nói "bất cứ vấn đề gì, chỉ cần giải thích rõ cho tôi thì tôi có thể code"

Cái bạn cần học thêm nữa là phân tích giải thuật và ứng dụng. Bước đầu tiên của phần này là cố gắng đạt đến lúc "bất cứ vấn đề gì Excel cũng giải quyết được, nếu không trực tiếp từ công cụ chính của bảng tính thì vẫn có thể gọi API để thực hiện. Tuy nhiên, đó chỉ là công việc của người viết code. Công việc của người quản lý là phải nhận thức được ngựa kéo xe, trâu kéo cày, tránh dùng lẫn lôn"

Tìm hết phần mềm rồi bạn, nhưng nó không đáp ứng được các điều kiện cụ thể đặc biệt là tính mở. Đến như công ty mình đang làm có cả ERP mua 100 tr $ mà vẫn phải dùng kết hợp cả excel chứ chưa nói mấy phần mềm khác. Mà có như bạn nói thuê chuyên gia thì họ cũng phải dùng 1 phần mềm nào đó chứ họ có tính nhẩm được đâu. Tiện đây xin bạn giới thiệu giúp mình một vài phần mềm có thể thay thế đc excel.

ERP là công cụ quản lý cấp cao. Cơ quan bạn chỉ biết bỏ tiền ra mua phần mềm lấy oai (chắc để trộ khách hàng) chứ không biết chịu khó bỏ công đào tạo chuyên viên sử dụng phần mềm. Chuyên viên sử dụng ERP tự động biết cách sắp sếp chu trình và dữ liệu cho hợp lý, hiệu quả.

Dùng Excel và VBA để xử lý dữ liệu là chuyện bất đắc dĩ. Nếu công ty là cổ phần trách nhiệm, chưa chắc kiểm toán đã chấp nhận loại dữ liệu này. Tầm công ty của bạn là tầm rộng lớn, cái nhìn về công việc cũng phải rộng lớn.
 
Upvote 0
nhiều dòng Ma DL và Ma SP trùng nhau nên nó báo lổi, nếu chạy code ngay từ đầu thì không bị tình trạng nầy
bạn chỉnh code lại
Mã:
Sub InsertMa()
Dim DLarr, SParr, CKarr, Arr
Dim i, Rws As Long, Tem As String, Dic As Object
[COLOR=#ff0000]With Sheets(1)[/COLOR]
[COLOR=#ff0000]    DLarr = .Range("A5:A" & .Range("A5").End(xlDown).Row)[/COLOR]
[COLOR=#ff0000]    SParr = .Range("B5:B" & .Range("B5").End(xlDown).Row)[/COLOR]
[COLOR=#ff0000]End With[/COLOR]
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 5)
Application.ScreenUpdating = False
Sheets(2).Select
CKarr = Range("A4:E" & Range("A4").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "!@#$" & CKarr(i, 2)
[COLOR=#ff0000]    If Not Dic.Exists(Tem) Then Dic.Add Tem, i[/COLOR]
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "!@#$" & Arr(i, 2)
    Rws = Dic.Item(Tem)
    If Rws > 0 Then
        Arr(i, 3) = CKarr(Rws, 3)
        Arr(i, 4) = CKarr(Rws, 4)
        Arr(i, 5) = CKarr(Rws, 5)
    End If
Next i
Set Dic = Nothing
Range("A5:E" & Range("A4").End(xlDown).Row).Clear
Range("A4").Resize(UBound(Arr), 5) = Arr
ActiveSheet.ListObjects("Table1").Resize Range("A3:B" & Range("A3").End(xlDown).Row)
Range("A3").Resize(UBound(Arr) + 1, 5).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
Bác @HieuCD ơi, xem lại giúp em code insert Mã với, khi em để lọc cột A hoặc B thì chạy code phần chế độ CK không còn đúng nữa, nó xóa trắng luôn các dòng bị ẩn dưới nó
 

File đính kèm

Upvote 0
Bác @HieuCD ơi, xem lại giúp em code insert Mã với, khi em để lọc cột A hoặc B thì chạy code phần chế độ CK không còn đúng nữa, nó xóa trắng luôn các dòng bị ẩn dưới nó
bạn chạy thử code
Mã:
Sub InsertMa()
Dim DLarr, TenDLarr, SParr, CKarr, DSParr, Arr
Dim i, j As Long, Rws As Long, Tem As String, Dic As Object
With Sheets("Bang ma")
    DLarr = .Range("A5:A" & .Range("A5").End(xlDown).Row)
    TenDLarr = .Range("B5:B" & .Range("A5").End(xlDown).Row)
    SParr = .Range("D5:D" & .Range("D5").End(xlDown).Row)
    DSParr = .Range("E5:E" & .Range("E5").End(xlDown).Row)
End With
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 20)
Application.ScreenUpdating = False
Sheets("Che do CK").Select
CKarr = Range("A5:T" & Range("A5").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "#" & CKarr(i, 3)
    If Not Dic.exists(Tem) Then Dic.Add Tem, i
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = TenDLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 3) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Arr(i, 4) = DSParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "#" & Arr(i, 3)
    Rws = Dic.Item(Tem)
    If Rws > 0 Then
    For j = 1 To 16
        Arr(i, j + 4) = CKarr(Rws, j + 4)
    Next j
    End If
Next i
Set Dic = Nothing
Range("A5:T" & Range("A5").End(xlDown).Row).Clear
ActiveSheet.ListObjects("Table1").Resize Range("A4").Resize(UBound(Arr) + 1, 5)
Range("A5").Resize(UBound(Arr), 20) = Arr
Range("A4").Resize(UBound(Arr) + 1, 20).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
 
Upvote 0
bạn chạy thử code
Mã:
Sub InsertMa()
Dim DLarr, TenDLarr, SParr, CKarr, DSParr, Arr
Dim i, j As Long, Rws As Long, Tem As String, Dic As Object
With Sheets("Bang ma")
    DLarr = .Range("A5:A" & .Range("A5").End(xlDown).Row)
    TenDLarr = .Range("B5:B" & .Range("A5").End(xlDown).Row)
    SParr = .Range("D5:D" & .Range("D5").End(xlDown).Row)
    DSParr = .Range("E5:E" & .Range("E5").End(xlDown).Row)
End With
ReDim Arr(1 To UBound(DLarr) * UBound(SParr), 1 To 20)
Application.ScreenUpdating = False
Sheets("Che do CK").Select
[COLOR=#ff0000]ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=1[/COLOR]
CKarr = Range("A5:T" & Range("A5").End(xlDown).Row).Formula
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "#" & CKarr(i, 3)
    If Not Dic.exists(Tem) Then Dic.Add Tem, i
Next i
For i = 1 To UBound(Arr)
    Arr(i, 1) = DLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 2) = TenDLarr(Int((i - 1) / UBound(SParr)) + 1, 1)
    Arr(i, 3) = SParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Arr(i, 4) = DSParr(((i - 1) Mod UBound(SParr)) + 1, 1)
    Tem = Arr(i, 1) & "#" & Arr(i, 3)
    Rws = Dic.Item(Tem)
    If Rws > 0 Then
    For j = 1 To 16
        Arr(i, j + 4) = CKarr(Rws, j + 4)
    Next j
    End If
Next i
Set Dic = Nothing
Range("A5:T" & Range("A5").End(xlDown).Row).Clear
ActiveSheet.ListObjects("Table1").Resize Range("A4").Resize(UBound(Arr) + 1, 5)
Range("A5").Resize(UBound(Arr), 20) = Arr
Range("A4").Resize(UBound(Arr) + 1, 20).Borders.LineStyle = xlContinuous
Application.ScreenUpdating = True
End Sub
Không được bác ơi, code này vẫn giống code trước mà, cứ quên không xóa lọc là mất dữ lieu.
PS: Em sửa được rồi bác ạ, chèn dòng màu đỏ vào là ok
 
Lần chỉnh sửa cuối:
Upvote 0
Bác @HieuCD ơi, nhờ bác xem giúp em đoạn sub "TINH" với, khi em để activesheet là "Che do CK" (bấm nút caculate bên sheet "Che do CK") thì bên sheet "Data input" cho kết quả đúng, nhưng nếu activesheet là Data input (Bấm nút "Caculate" bên sheet "Data input") thì sheet "Data input" chỉ cho ra kết quả đến dòng 48 thôi. Em thấy sheet che do Ck nhiều dữ liệu hơn thì nó tính đúng nhưng nếu trường hợp ít dữ liệu hơn data input thì lại thành sai. Em cám ơn bác nhiều!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bác @HieuCD ơi, nhờ bác xem giúp em đoạn sub "TINH" với, khi em để activesheet là "Che do CK" (bấm nút caculate bên sheet "Che do CK") thì bên sheet "Data input" cho kết quả đúng, nhưng nếu activesheet là Data input (Bấm nút "Caculate" bên sheet "Data input") thì sheet "Data input" chỉ cho ra kết quả đến dòng 48 thôi. Em thấy sheet che do Ck nhiều dữ liệu hơn thì nó tính đúng nhưng nếu trường hợp ít dữ liệu hơn data input thì lại thành sai. Em cám ơn bác nhiều!
code sót nhiều chổ, bạn sửa lại
Mã:
Sub TINH()
Soluong
Dim DTinput(), CKarr(), Arr()
Dim i, j As Long, Rws As Long, Tem As String, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Che do CK")
    CKarr = .Range("A4:T" & .Range("A4").End(xlDown).Row).Value
    For i = 1 To UBound(CKarr)
      Tem = CKarr(i, 1) & "#" & CKarr(i, 3)
      If Not Dic.exists(Tem) Then Dic.Add Tem, i
    Next i
End With
Application.ScreenUpdating = False
With Sheets("Data input")
DTinput = .Range("A5:D" & .Range("A5").End(xlDown).Row).Value
ReDim Arr(1 To UBound(DTinput), 1 To 15)
For i = 1 To UBound(DTinput)
  Tem = DTinput(i, 1) & "#" & DTinput(i, 2)
  If Dic.exists(Tem) Then
    Rws = Dic.Item(Tem)
    If Rws > 0 Then
      For j = 1 To 15
        If Right(CKarr(1, j + 5), 2) = "kg" Then
          Arr(i, j) = CKarr(Rws, j + 5) * DTinput(i, 3)
        Else
          Arr(i, j) = CKarr(Rws, j + 5) * DTinput(i, 4)
        End If
      Next j
    End If
  End If
Next i
Set Dic = Nothing
.Range("H5:V" & Range("H5").End(xlDown).Row).ClearContents
.Range("H5").Resize(UBound(Arr), 15) = Arr
.ListObjects("Table2").Resize .Range("A4:V" & Range("A5").End(xlDown).Row)
End With
Application.ScreenUpdating = True
End Sub

Sub Soluong()
Dim DTinput(), CKarr(), Arr()
Dim i, j As Long, Rws As Long, Tem As String, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Data input")
    DTinput = .Range("A5:D" & .Range("A5").End(xlDown).Row).Value
    For i = 1 To UBound(DTinput)
    Tem = DTinput(i, 1) & "#" & DTinput(i, 2)
    If Not Dic.exists(Tem) Then Dic.Add Tem, i
Next i
End With
Application.ScreenUpdating = False
With Sheets("Che do CK")
CKarr = .Range("A5:C" & .Range("A5").End(xlDown).Row).Value
ReDim Arr(1 To UBound(CKarr), 1 To 1)
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "#" & CKarr(i, 3)
    If Dic.exists(Tem) Then
    Rws = Dic.Item(Tem)
        If Rws > 0 Then
            Arr(i, 1) = DTinput(Rws, 3)
        End If
    End If
Next i
Set Dic = Nothing
.Range(.[E5], .[E65000].End(xlUp)).ClearContents
'.Range("C5:D" & Range("A5").End(xlDown).Row).ClearContents
.Range("E5").Resize(UBound(Arr), 1) = Arr
End With
Application.ScreenUpdating = True
End Sub
nếu 2 sub không có chạy riêng thì bạn bỏ luôn 2 sub trên, và dùng 1 sub sau (đã nhập 2 thành 1)
Mã:
Sub SL_CK()
Dim DTinput(), CKarr(), Arr()
Dim i, j As Long, Rws As Long, Tem As String, DicSL As Object, DicCK As Object
Set DicSL = CreateObject("Scripting.Dictionary")
Set DicCK = CreateObject("Scripting.Dictionary")
With Sheets("Data input")
    DTinput = .Range("A5:D" & .Range("A5").End(xlDown).Row).Value
    For i = 1 To UBound(DTinput)
    Tem = DTinput(i, 1) & "#" & DTinput(i, 2)
    If Not DicSL.exists(Tem) Then DicSL.Add Tem, i
Next i
End With
Application.ScreenUpdating = False


With Sheets("Che do CK")
CKarr = .Range("A4:T" & .Range("A4").End(xlDown).Row).Value
ReDim Arr(1 To UBound(CKarr), 1 To 1)
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "#" & CKarr(i, 3)
    If Not DicCK.exists(Tem) Then DicCK.Add Tem, i
    
    If DicSL.exists(Tem) Then
    Rws = DicSL.Item(Tem)
        If Rws > 0 Then
            Arr(i, 1) = DTinput(Rws, 3)
        End If
    End If
Next i
Set DicSL = Nothing
.Range(.[E5], .[E65000].End(xlUp)).ClearContents
.Range("E4").Resize(UBound(Arr), 1) = Arr
End With


With Sheets("Data input")
ReDim Arr(1 To UBound(DTinput), 1 To 15)
For i = 1 To UBound(DTinput)
  Tem = DTinput(i, 1) & "#" & DTinput(i, 2)
  If DicCK.exists(Tem) Then
    Rws = DicCK.Item(Tem)
    If Rws > 0 Then
      For j = 1 To 15
        If Right(CKarr(1, j + 5), 2) = "kg" Then
          Arr(i, j) = CKarr(Rws, j + 5) * DTinput(i, 3)
        Else
          Arr(i, j) = CKarr(Rws, j + 5) * DTinput(i, 4)
        End If
      Next j
    End If
  End If
Next i
Set DicCK = Nothing
.Range("H5:V" & Range("H5").End(xlDown).Row).ClearContents
.Range("H5").Resize(UBound(Arr), 15) = Arr
.ListObjects("Table2").Resize .Range("A4:V" & Range("A5").End(xlDown).Row)
End With
Application.ScreenUpdating = True
End Sub
 
Upvote 0
code sót nhiều chổ, bạn sửa lại
Mã:
Sub TINH()
Soluong
Dim DTinput(), CKarr(), Arr()
Dim i, j As Long, Rws As Long, Tem As String, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Che do CK")
    CKarr = .Range("A4:T" & .Range("A4").End(xlDown).Row).Value
    For i = 1 To UBound(CKarr)
      Tem = CKarr(i, 1) & "#" & CKarr(i, 3)
      If Not Dic.exists(Tem) Then Dic.Add Tem, i
    Next i
End With
Application.ScreenUpdating = False
With Sheets("Data input")
DTinput = .Range("A5:D" & .Range("A5").End(xlDown).Row).Value
ReDim Arr(1 To UBound(DTinput), 1 To 15)
For i = 1 To UBound(DTinput)
  Tem = DTinput(i, 1) & "#" & DTinput(i, 2)
  If Dic.exists(Tem) Then
    Rws = Dic.Item(Tem)
    If Rws > 0 Then
      For j = 1 To 15
        If Right(CKarr(1, j + 5), 2) = "kg" Then
          Arr(i, j) = CKarr(Rws, j + 5) * DTinput(i, 3)
        Else
          Arr(i, j) = CKarr(Rws, j + 5) * DTinput(i, 4)
        End If
      Next j
    End If
  End If
Next i
Set Dic = Nothing
.Range("H5:V" & Range("H5").End(xlDown).Row).ClearContents
.Range("H5").Resize(UBound(Arr), 15) = Arr
.ListObjects("Table2").Resize .Range("A4:V" & Range("A5").End(xlDown).Row)
End With
Application.ScreenUpdating = True
End Sub

Sub Soluong()
Dim DTinput(), CKarr(), Arr()
Dim i, j As Long, Rws As Long, Tem As String, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Data input")
    DTinput = .Range("A5:D" & .Range("A5").End(xlDown).Row).Value
    For i = 1 To UBound(DTinput)
    Tem = DTinput(i, 1) & "#" & DTinput(i, 2)
    If Not Dic.exists(Tem) Then Dic.Add Tem, i
Next i
End With
Application.ScreenUpdating = False
With Sheets("Che do CK")
CKarr = .Range("A5:C" & .Range("A5").End(xlDown).Row).Value
ReDim Arr(1 To UBound(CKarr), 1 To 1)
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "#" & CKarr(i, 3)
    If Dic.exists(Tem) Then
    Rws = Dic.Item(Tem)
        If Rws > 0 Then
            Arr(i, 1) = DTinput(Rws, 3)
        End If
    End If
Next i
Set Dic = Nothing
.Range(.[E5], .[E65000].End(xlUp)).ClearContents
'.Range("C5:D" & Range("A5").End(xlDown).Row).ClearContents
.Range("E5").Resize(UBound(Arr), 1) = Arr
End With
Application.ScreenUpdating = True
End Sub
nếu 2 sub không có chạy riêng thì bạn bỏ luôn 2 sub trên, và dùng 1 sub sau (đã nhập 2 thành 1)
Mã:
Sub SL_CK()
Dim DTinput(), CKarr(), Arr()
Dim i, j As Long, Rws As Long, Tem As String, DicSL As Object, DicCK As Object
Set DicSL = CreateObject("Scripting.Dictionary")
Set DicCK = CreateObject("Scripting.Dictionary")
With Sheets("Data input")
    DTinput = .Range("A5:D" & .Range("A5").End(xlDown).Row).Value
    For i = 1 To UBound(DTinput)
    Tem = DTinput(i, 1) & "#" & DTinput(i, 2)
    If Not DicSL.exists(Tem) Then DicSL.Add Tem, i
Next i
End With
Application.ScreenUpdating = False


With Sheets("Che do CK")
CKarr = .Range("A4:T" & .Range("A4").End(xlDown).Row).Value
ReDim Arr(1 To UBound(CKarr), 1 To 1)
For i = 1 To UBound(CKarr)
    Tem = CKarr(i, 1) & "#" & CKarr(i, 3)
    If Not DicCK.exists(Tem) Then DicCK.Add Tem, i
    
    If DicSL.exists(Tem) Then
    Rws = DicSL.Item(Tem)
        If Rws > 0 Then
            Arr(i, 1) = DTinput(Rws, 3)
        End If
    End If
Next i
Set DicSL = Nothing
.Range(.[E5], .[E65000].End(xlUp)).ClearContents
.Range("E4").Resize(UBound(Arr), 1) = Arr
End With


With Sheets("Data input")
ReDim Arr(1 To UBound(DTinput), 1 To 15)
For i = 1 To UBound(DTinput)
  Tem = DTinput(i, 1) & "#" & DTinput(i, 2)
  If DicCK.exists(Tem) Then
    Rws = DicCK.Item(Tem)
    If Rws > 0 Then
      For j = 1 To 15
        If Right(CKarr(1, j + 5), 2) = "kg" Then
          Arr(i, j) = CKarr(Rws, j + 5) * DTinput(i, 3)
        Else
          Arr(i, j) = CKarr(Rws, j + 5) * DTinput(i, 4)
        End If
      Next j
    End If
  End If
Next i
Set DicCK = Nothing
.Range("H5:V" & Range("H5").End(xlDown).Row).ClearContents
.Range("H5").Resize(UBound(Arr), 15) = Arr
.ListObjects("Table2").Resize .Range("A4:V" & Range("A5").End(xlDown).Row)
End With
Application.ScreenUpdating = True
End Sub
Vâng, cám ơn bác, e cũng tập toẹ nên code còn thiếu nhiều, mỗi lúc học 1 ít thôi ạ, em chưa hiểu tại sao phải thêm dấu # vào chuỗi Tem, bác giải thích giúp e được không ạ?
 
Upvote 0
Vâng, cám ơn bác, e cũng tập toẹ nên code còn thiếu nhiều, mỗi lúc học 1 ít thôi ạ, em chưa hiểu tại sao phải thêm dấu # vào chuỗi Tem, bác giải thích giúp e được không ạ?
thêm "#" là ký tự ít dùng để ngăn cách 2 mã nhằm đề phòng trường hợp có 2 nhóm mã khác nhau nhưng khi ghép lại thì giống nhau
ví dụ: nhóm 1 gồm 2 mã:15689 và 254, nhóm 2 gồm 2 mã là 1568 và 9254 khác nhau hoàn tòan, nhưng khi ghép lại cả 2 nhóm lại giống nhau:15689254
nên khi ghép phải có ký tự ít khi dùng chặn giửa: 15689#254, và 1568#9254 khác nhau
 
Upvote 0
Rất tiếc mất nút Cảm ơn.
Khi đọc bài này tôi cảm mến và xin có lời cảm ơn bạn HieuCD vì sự nhiệt thành của bạn khi giúp đỡ người khác; Dù trong hoàn cảnh nào cũng không một lời ca thán, Rất tận tình, rất chu đáo, chỉ bảo tận tình
 
Upvote 0
Rất tiếc mất nút Cảm ơn.
Khi đọc bài này tôi cảm mến và xin có lời cảm ơn bạn HieuCD vì sự nhiệt thành của bạn khi giúp đỡ người khác; Dù trong hoàn cảnh nào cũng không một lời ca thán, Rất tận tình, rất chu đáo, chỉ bảo tận tình
cám ơn bạn, mình cũng như các thành viên khác trên diễn đàn, đều có tâm huyết góp kiến thức và kinh nghiệm tích lũy cho cộng đồng Excel Việt Nam. các bạn vui khi nhận hổ trợ từ GPE hoặc biết thêm kiến thức mới, là mình vui rồi
 
Upvote 0

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

Back
Top Bottom