Code VBA tính tồn kho (1 người xem)

  • Thread starter Thread starter Dong Le
  • Ngày gửi Ngày gửi
Liên hệ QC

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

Dong Le

Thành viên chính thức
Tham gia
27/4/12
Bài viết
95
Được thích
1
Dear các Anh/chị, Nhờ các anh chị hổ trợ giúp mình chỉnh sửa lại đoạn code trong file đính kèm với ạ.(mình đã ghi lại yêu cầu trong file đính kèm)
 

File đính kèm

Lần chỉnh sửa cuối:
Nhờ các anh/chị cao thủ giúp mình đoạn code này với.
 
Upvote 0
Xin lỗi anh/chị, mình cập nhật nhầm file, mình gửi lại.
 

File đính kèm

Upvote 0
Anh/chị có ai giúp được mình hiệu chỉnh đoạn code này ko ạ.
 
Upvote 0
Mình có doaw file của bạn về nhưng chẳng thấy yêu cầu giúp đỡ trong file của bạn là gì cả. Bạn xem lại
. File gốc mình mở vẫn còn yêu cầu mà sao vậy nhỉ, đổi tên file xem có lỗi nữa không, nhờ anh/chị xem giúp.
 

File đính kèm

Upvote 0
Các anh/chị không ai hiệu chỉnh giúp em đoạn code này được ạ?
 
Upvote 0
Bạn thay thử bằng Code này xem sao:

Mã:
Private Sub CommandButton1_Click()
Dim Dic As Object, d1, Tmp, Arr(), Arr1()
Dim i, j, n, Id
Set Dic = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = 0
Rows("5:3000").ClearContents
ReDim Arr(1 To 3000, 1 To 18)
ReDim Arr1(1 To 3000, 1 To 18)
'TH nhap
Tmp = Sheet1.Range(Sheet1.[A4], Sheet1.[A65536].End(3)).Resize(, 11)
For i = 1 To UBound(Tmp, 1)
If Not Dic.Exists(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9)) Then
j = j + 1
Dic.Add Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9), j
For n = 1 To 11
Arr(j, n) = Tmp(i, n)
Next
d1 = DateDiff("d", Tmp(i, 2), DateTime.Date)
Select Case d1
Case Is < 8: Arr(j, 12) = d1
Case Is < 15: Arr(j, 13) = d1
Case Is < 31: Arr(j, 14) = d1
Case Is < 61: Arr(j, 15) = d1
Case Is < 91: Arr(j, 16) = d1
Case Is < 181: Arr(j, 17) = d1
End Select
Else
Id = Dic.Item(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9))
Arr(Id, 11) = Arr(Id, 11) + Tmp(i, 11)
End If
Next
'TH xuat
Tmp = Sheet8.Range(Sheet8.[A5], Sheet8.[A65536].End(3)).Resize(, 11)
For i = 1 To UBound(Tmp, 1)
Tmp(i, 11) = Tmp(i, 11) * -1
If Not Dic.Exists(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9)) Then
j = j + 1
Dic.Add Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9), j
For n = 1 To 11
Arr(j, n) = Tmp(i, n)
Next
Else
Id = Dic.Item(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9))
Arr(Id, 11) = Arr(Id, 11) + Tmp(i, 11)
End If
Next
Id = 0
For i = 1 To j
If Arr(i, 11) <> 0 Then
Id = Id + 1
Arr1(Id, 1) = Id
For n = 2 To 18
Arr1(Id, n) = Arr(i, n)
Next
End If
Next
Sheet3.[A5].Resize(UBound(Arr, 1), UBound(Arr, 2)) = Arr1
Application.ScreenUpdating = 1
Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
mình copy dán vào thì nó báo lỗi debug bạn ạ.
 
Upvote 0
Bạn chép làm sao ấy, xem file nha
(Mình tách theo cả cột I (Màu) nếu không cần thì xoá bớt đi. Đáng lý bạn phải nêu rõ lỗi gì chứ lỗi code thì Debug nhưng không biết lỗi gì)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn chép làm sao ấy, xem file nha
(Mình tách theo cả cột I (Màu) nếu không cần thì xoá bớt đi. Đáng lý bạn phải nêu rõ lỗi gì chứ lỗi code thì Debug nhưng không biết lỗi gì)
Cảm ơn bạn sealand, file này nếu đầy đủ 4 điều kiện thì tồn kho = nhập kho - xuất kho, tuy nhiên nếu như mình xóa đi 1 hoặc 2 hoặc 3 hoặc 4 trong 4 điều kiện bên sheet xuất kho hoặc nhập kho thì bên tồn kho nó bị double lên, bạn xem lại giúp mình với. Cảm ơn bạn.
 
Upvote 0
Bạn để ý khi xoá điều kiện phải điều chỉnh các dòng màu đỏ sau phải giống nhau:
Mã:
Private Sub CommandButton1_Click()
 Dim Dic As Object, d1, Tmp, Arr(), Arr1()
 Dim i, j, n, Id
 Set Dic = CreateObject("Scripting.Dictionary")
 Application.ScreenUpdating = 0 
Rows("5:3000").ClearContents
 ReDim Arr(1 To 3000, 1 To 18)
 ReDim Arr1(1 To 3000, 1 To 18) 
'TH nhap
 Tmp = Sheet1.Range(Sheet1.[A4], Sheet1.[A65536].End(3)).Resize(, 11)
 For i = 1 To UBound(Tmp, 1)
 If Not Dic.Exists([B][COLOR=#ff0000]Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9)[/COLOR][/B]) Then 
j = j + 1
 Dic.Add [B][COLOR=#ff0000]Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9)[/COLOR][/B], j 
For n = 1 To 11
 Arr(j, n) = Tmp(i, n) 
Next
 d1 = DateDiff("d", Tmp(i, 2), DateTime.Date)
 Select Case d1
 Case Is < 8: Arr(j, 12) = d1
 Case Is < 15: Arr(j, 13) = d1
 Case Is < 31: Arr(j, 14) = d1
 Case Is < 61: Arr(j, 15) = d1
 Case Is < 91: Arr(j, 16) = d1
 Case Is < 181: Arr(j, 17) = d1
 End Select
 Else Id = Dic.Item([B][COLOR=#ff0000]Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9)[/COLOR][/B])
 Arr(Id, 11) = Arr(Id, 11) + Tmp(i, 11)
 End If 
Next 
'TH xuat
 Tmp = Sheet8.Range(Sheet8.[A5], Sheet8.[A65536].End(3)).Resize(, 11)
 For i = 1 To UBound(Tmp, 1) Tmp(i, 11) = Tmp(i, 11) * -1 
If Not Dic.Exists([B][COLOR=#ff0000]Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9)[/COLOR][/B]) Then
 j = j + 1
 Dic.Add [B][COLOR=#ff0000]Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9)[/COLOR][/B], j
 For n = 1 To 11 
Arr(j, n) = Tmp(i, n)
 Next
 Else Id = Dic.Item([B][COLOR=#ff0000]Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9)[/COLOR][/B]) 
Arr(Id, 11) = Arr(Id, 11) + Tmp(i, 11)
 End If
 Next
 Id = 0 
For i = 1 To j
 If Arr(i, 11) <> 0 Then
 Id = Id + 1 
Arr1(Id, 1) = Id 
For n = 2 To 18 
Arr1(Id, n) = Arr(i, n)
 Next 
End If
 Next 
Sheet3.[A5].Resize(UBound(Arr, 1), UBound(Arr, 2)) = Arr1 
Application.ScreenUpdating = 1 
Set Dic = Nothing 
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Theo ý của bạn là khi xóa điều kiện thì phải xóa các cột giống nhau của tương ứng của 2 sheet Nhạp kho và xuat kho đúng không? ý của mình là nếu xóa 1 trong các điều kiện của 2 sheet đó thì hệ thống không trừ, nhưng hiện tại thì nó lại double dòng đó lên trên sheet tồn kho,
 
Upvote 0
Bạn để ý rằng:


Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8) & ";" & Tmp(i, 9)


Tmp(i,x) có nghĩa là dòng i cột x. Nếu xoá bớt điều kiện cột nào thì xoá bớt 1 Tmp(i, cọt bỏ)
Giả sử không cần lọc theo cột mầu nữa thì câu lệnh là


Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8)
 
Lần chỉnh sửa cuối:
Upvote 0
Sao mình copy vào file thực hiện, nó cứ báo lỗi debug ở dòng lệnh này bạn nhỉ? bạn xem lại giúp mình với,
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đây là code mình thay và đã Test

Mã:
Private Sub CommandButton1_Click()
Dim Dic As Object, d1, Tmp, Arr(), Arr1()
Dim i, j, n, Id
Set Dic = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = 0
Rows("5:3000").ClearContents
ReDim Arr(1 To 3000, 1 To 18)
ReDim Arr1(1 To 3000, 1 To 18)
'TH nhap
Tmp = Sheet1.Range(Sheet1.[A4], Sheet1.[A65536].End(3)).Resize(, 11)
For i = 1 To UBound(Tmp, 1)
If Not Dic.Exists(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8)) Then
j = j + 1
Dic.Add Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8), j
For n = 1 To 11
Arr(j, n) = Tmp(i, n)
Next
d1 = DateDiff("d", Tmp(i, 2), DateTime.Date)
Select Case d1
Case Is < 8: Arr(j, 12) = d1
Case Is < 15: Arr(j, 13) = d1
Case Is < 31: Arr(j, 14) = d1
Case Is < 61: Arr(j, 15) = d1
Case Is < 91: Arr(j, 16) = d1
Case Is < 181: Arr(j, 17) = d1
End Select
Else
Id = Dic.Item(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8))
Arr(Id, 11) = Arr(Id, 11) + Tmp(i, 11)
End If
Next
'TH xuat
Tmp = Sheet8.Range(Sheet8.[A5], Sheet8.[A65536].End(3)).Resize(, 11)
For i = 1 To UBound(Tmp, 1)
Tmp(i, 11) = Tmp(i, 11) * -1
If Not Dic.Exists(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8)) Then
j = j + 1
Dic.Add Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8), j
For n = 1 To 11
Arr(j, n) = Tmp(i, n)
Next
Else
Id = Dic.Item(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8))
Arr(Id, 11) = Arr(Id, 11) + Tmp(i, 11)
End If
Next
Id = 0
For i = 1 To j
If Arr(i, 11) <> 0 Then
Id = Id + 1
Arr1(Id, 1) = Id
For n = 2 To 18
Arr1(Id, n) = Arr(i, n)
Next
End If
Next
Sheet3.[A5].Resize(UBound(Arr, 1), UBound(Arr, 2)) = Arr1
Application.ScreenUpdating = 1
Set Dic = Nothing
End Sub
 
Upvote 0
Sao kỳ vậy nhỉ, mình copy bỏ vào nó vẫn báo lỗi như cũ.
 
Upvote 0
Vậy thì bạn xem file nha
 

File đính kèm

Upvote 0
mình down về thì đã chạy được nhưng nó bắt buộc trong sheet xuất kho phải có dữ liệu không thì nó báo lỗi, nếu ko có xuất kho thì tồn kho = nhập kho chứ bạn, bạn xem lại giúp mình với.
 
Upvote 0
Những điều đó thì mình nghĩ bạn làm được, ví dụ if ubound(Tmp,1)> 0 then....
Mình mới viết Code cơ bản thôi, còn ráp vào thực tế bạn cũng còn phải hiệu chỉnh nữa mà.
 
Upvote 0
Cảm ơn bạn đã hổ trợ mình, VBA mình cũng mới tập tọe nên mới hỏi kỹ vậy.
 
Upvote 0
Và đây là code đã chặn lỗi bạn phát hiện:

Mã:
Private Sub CommandButton1_Click()
Dim Dic As Object, d1, Tmp, Arr(), Arr1()
Dim i, j, n, Id
Set Dic = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = 0
Rows("5:3000").ClearContents
ReDim Arr(1 To 3000, 1 To 18)
ReDim Arr1(1 To 3000, 1 To 18)
'TH nhap
If Sheet1.[A65536].End(3).Row = 3 Then Exit Sub
Tmp = Sheet1.Range(Sheet1.[A4], Sheet1.[A65536].End(3)).Resize(, 11)
For i = 1 To UBound(Tmp, 1)
If Not Dic.Exists(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8)) Then
j = j + 1
Dic.Add Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8), j
For n = 1 To 11
Arr(j, n) = Tmp(i, n)
Next
d1 = DateDiff("d", Tmp(i, 2), DateTime.Date)
Select Case d1
Case Is < 8: Arr(j, 12) = d1
Case Is < 15: Arr(j, 13) = d1
Case Is < 31: Arr(j, 14) = d1
Case Is < 61: Arr(j, 15) = d1
Case Is < 91: Arr(j, 16) = d1
Case Is < 181: Arr(j, 17) = d1
End Select
Else
Id = Dic.Item(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8))
Arr(Id, 11) = Arr(Id, 11) + Tmp(i, 11)
End If
Next
'TH xuat
If Sheet8.[A65536].End(3).Address <> "$A$4" Then
Tmp = Sheet8.Range(Sheet8.[A5], Sheet8.[A65536].End(3)).Resize(, 11)
For i = 1 To UBound(Tmp, 1)
Tmp(i, 11) = Tmp(i, 11) * -1
If Not Dic.Exists(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8)) Then
j = j + 1
Dic.Add Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8), j
For n = 1 To 11
Arr(j, n) = Tmp(i, n)
Next
Else
Id = Dic.Item(Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8))
Arr(Id, 11) = Arr(Id, 11) + Tmp(i, 11)
End If
Next
End If
Id = 0
If j > 0 Then
For i = 1 To j
If Arr(i, 11) <> 0 Then
Id = Id + 1
Arr1(Id, 1) = Id
For n = 2 To 18
Arr1(Id, n) = Arr(i, n)
Next
End If
Next
Sheet3.[A5].Resize(UBound(Arr, 1), UBound(Arr, 2)) = Arr1
End If
Application.ScreenUpdating = 1
Set Dic = Nothing
End Sub
 
Upvote 0
Dear bạn sealand, khi ứng dụng file này thì mình thấy có một lỗi là: trong Sheet NHAPKHO, nếu có 2 dòng trùng nhau ở các cột D;G;H nhưng cột I khác nhau thì nó lại tong hợp lên TONKHO là 2, mục đích của bắt điều kiện này là nếu trùng 4 cột đó của 2 sheet NHAPKHO va XUATKHO thì sẽ trừ bên TONKHO, còn nếu 1 hoặc 2 hoặc 3 hoặc 4 cột đó không trùng nhau thì không trừ, vẫn lên TONKHO bình thường. sheet NHAPKHO có thể trùng dữ liệu đến 3 cột bất kỳ trong 4 cột D;G;H;I hoặc thiếu đến 2 trong 3 điều kiện ở cột G;H;I(nghĩa là trong 3 cột này có thể có 2 cột để trống) thì vẫn lên được TONKHO. Bạn xem lại giúp mình với.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình vừa chép 1 dòng nào đó xuống thành ba dòng và sửa cột I và J đi nó tổng hợp bình thường.
Bạn thấy rằng diều kiện là:


Tmp(i, 4) & ";" & Tmp(i, 7) & ";" & Tmp(i, 8)

Vậy thì mình khẳng định cột D,G,H giống nhau chắc chắn sẽ tính vào 1 hàng , chỉ cần 1 khác biệt sẽ tính 1 hàng khác. Nếu bạn chứng minh được điều bạn nói thì đưa file lên đây.
 
Upvote 0
Mình xin lỗi, do mình nhầm lẫn là code của bạn có 3 điều kiện, mình thêm 1 điều kiện nữa nhưng khi copy thay đổi lại thì quên thêm vào.
 
Upvote 0
Chào Seland, Mình muốn mặc định 1 cell đó chứa số ký tự cố định thì dung câu lệnh như thế nào bạn, ví dụ như Cột A tất cả phải là 10 ký tự, ko được it hoặc nhiều hơn số ký tự đó. Cảm ơn bạn.
 
Upvote 0
Việc này chắc phải dùng Code dựa vào Event WorkSheet_Change thôi.
 
Upvote 0
Bạn giúp mình câu lệnh này với, cảm ơn bạn.
 
Upvote 0
Đây là Code buộc phải nhập dúng 10 ký tự với vùng Sheet1!A1:A30
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Row < 31 Then
If Not IsEmpty(Target.Value) And Len(Trim(Target.Value)) <> 10 Then
MsgBox "O nay phai du 10 ky tu"
Target.Value = ""
Target.Select
End If
End If
End Sub
 

File đính kèm

Upvote 0
Chào bạn Seland, mình đã dung code này để copy dòng dữ lieu từ sheet1-> sheet2, mình muốn nó đổi lại ngày của hiện tại nên mình chon là "=today()" như bên dưới. Tuy nhiên nếu như vậy thì ngày hôm sau mở lên nó cập nhật ngày của hệ thống thì không chính xác, nhờ bạn hổ trợ mình sửa câu lệnh để khi copy qua nó đổi thành ngày hiện tại và cố định ngày đó luôn. UCase(Target) = "CKHO" Then
With Sheets("sheets2").[a65536].End(3)
Range(Cells(Target.Row, 1), Cells(Target.Row, 13)).Copy .Offset(1)
.Offset(1, 1) = "=today()"
End With
End If
 
Upvote 0
Theo mình thì chỉ sửa 1 chút ở dòng này:

.Offset(1, 1) = "=today()"

Sửa thành

.Offset(1, 1) = Date
 
Upvote 0

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

Back
Top Bottom