báo cáo xuất nhập tồn

Liên hệ QC

dungvnanh

Thành viên mới
Tham gia
16/3/19
Bài viết
3
Được thích
1
Em mới mày mò học vba, mong mọi người giúp đỡ
Em có sheet 1 là sheet các mặt hàng và số lượng, sheet 2 và 3 là số lượng các cửa hàng lấy
Em muốn sheet 4 sẽ là sheet hiển thị toàn bộ các mặt hàng cùng số lượng từ sheet 2, 3 cũng như hàng tồn
Nhưng khi em khởi chạy thì nó chạy không đúng, em cũng không biết mình sai chỗ nào, mong mọi người hướng dẫn chi tiết giúp em ạ


Function solonnhat()
solonnhat = Application.WorksheetFunction.Max(Sheet1.Range("A:A"))
End Function
Sub locdulieu()
Dim a As Long
Dim dulieu1 As Range
Dim giatri1 As Long
Dim dulieu2 As Range
Dim giatri2 As Long
Dim dulieu3 As Range
Dim giatri3 As Long
Dim socantim As Long
Dim lrow As Long
lrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row + 1
For a = 1 To solonnhat
Set dulieu1 = Sheet1.Range("A:A").Find(what:=a, LookIn:=xlFormulas, LookAt:=xlWhole)
dulieu1.Offset(0, 2).Value = giatri1
Set dulieu2 = Sheet2.Range("A:A").Find(what:=a, LookIn:=xlFormulas, LookAt:=xlWhole)
If dulieu2 Is Nothing Then
giatri2 = 0
Sheet4.Range("A" & lrow).Offset(0, 4).Value = giatri2
Else
dulieu2.Offset(0, 2).Value = giatri2
Sheet4.Range("A" & lrow).Offset(0, 4).Value = giatri2
End If
Set dulieu3 = Sheet3.Range("A:A").Find(what:=a, LookIn:=xlFormulas, LookAt:=xlWhole)
If dulieu3 Is Nothing Then
giatri3 = 0
Sheet4.Range("A" & lrow).Offset(0, 5).Value = giatri3
Else
dulieu3.Offset(0, 2).Value = giatri3
Sheet4.Range("A" & lrow).Offset(0, 5).Value = giatri3
End If
socantim = giatri1 - (giatri2 + giatri3)
Sheet4.Range("A" & lrow).Value = a
Sheet4.Range("A" & lrow).Offset(0, 1).Value = dulieu1.Offset(0, 1).Value
Sheet4.Range("A" & lrow).Offset(0, 2).Value = dulieu1.Offset(0, 2).Value
Sheet4.Range("A" & lrow).Offset(0, 3).Value = socantim
Next a
End Sub
 

File đính kèm

Em mới mày mò học vba, mong mọi người giúp đỡ
Em có sheet 1 là sheet các mặt hàng và số lượng, sheet 2 và 3 là số lượng các cửa hàng lấy
Em muốn sheet 4 sẽ là sheet hiển thị toàn bộ các mặt hàng cùng số lượng từ sheet 2, 3 cũng như hàng tồn
Nhưng khi em khởi chạy thì nó chạy không đúng, em cũng không biết mình sai chỗ nào, mong mọi người hướng dẫn chi tiết giúp em ạ


Function solonnhat()
solonnhat = Application.WorksheetFunction.Max(Sheet1.Range("A:A"))
End Function
Sub locdulieu()
Dim a As Long
Dim dulieu1 As Range
Dim giatri1 As Long
Dim dulieu2 As Range
Dim giatri2 As Long
Dim dulieu3 As Range
Dim giatri3 As Long
Dim socantim As Long
Dim lrow As Long
lrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row + 1
For a = 1 To solonnhat

Set dulieu1 = Sheet1.Range("A:A").Find(what:=a, LookIn:=xlFormulas, LookAt:=xlWhole)
dulieu1.Offset(0, 2).Value = giatri1
Set dulieu2 = Sheet2.Range("A:A").Find(what:=a, LookIn:=xlFormulas, LookAt:=xlWhole)
If dulieu2 Is Nothing Then
giatri2 = 0
Sheet4.Range("A" & lrow).Offset(0, 4).Value = giatri2
Else
dulieu2.Offset(0, 2).Value = giatri2
Sheet4.Range("A" & lrow).Offset(0, 4).Value = giatri2
End If
Set dulieu3 = Sheet3.Range("A:A").Find(what:=a, LookIn:=xlFormulas, LookAt:=xlWhole)
If dulieu3 Is Nothing Then
giatri3 = 0
Sheet4.Range("A" & lrow).Offset(0, 5).Value = giatri3
Else
dulieu3.Offset(0, 2).Value = giatri3
Sheet4.Range("A" & lrow).Offset(0, 5).Value = giatri3
End If
socantim = giatri1 - (giatri2 + giatri3)
Sheet4.Range("A" & lrow).Value = a
Sheet4.Range("A" & lrow).Offset(0, 1).Value = dulieu1.Offset(0, 1).Value
Sheet4.Range("A" & lrow).Offset(0, 2).Value = dulieu1.Offset(0, 2).Value
Sheet4.Range("A" & lrow).Offset(0, 3).Value = socantim
Next a
End Sub
Những chỗ chữ đỏ là những chỗ code sai làm cho kết quả không đúng với cái mà bạn mong muốn.
Lỗi 1.
Mã:
lrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row + 1
For a = 1 To solonnhat
Lỗi sai: Biến lrow đặt bên ngoài vòng lặp nên trong quá trình chạy vòng lặp, biến này không thay đổi dẫn đến kết quả của tất cả các mã hàng được ghi vào 1 vị trí, cái sau đè cái trước và kết quả cuối cùng chỉ có mã hàng được vòng lặp duyệt cuối cùng là còn lại trên sheet
Cách sửa: Với mỗi mã hàng cần phải xác định lại biến lrow, vì vậy dòng lệnh xác định lrow phải đặt trong vòng lặp
Mã:
For a = 1 To solonnhat
lrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row + 1
Lỗi 2.
Mã:
dulieu1.Offset(0, 2).Value = giatri1
Dòng lệnh này dùng để ghi giá trị của biến giatri1 vào ô dulieu1.Offset(0, 2). Nhưng nếu tôi hiểu đúng thì bạn đang muốn gán giá trị của ô dulieu1.Offset(0, 2) vào biến giatri1. Nếu đúng vậy thì bạn cần phải đảo ngược lại.
Mã:
giatri1 = dulieu1.Offset(0, 2).Value
Hai chỗ còn lại tương tự như lỗi 2.
 
Upvote 0
Những chỗ chữ đỏ là những chỗ code sai làm cho kết quả không đúng với cái mà bạn mong muốn.
Lỗi 1.
Mã:
lrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row + 1
For a = 1 To solonnhat
Lỗi sai: Biến lrow đặt bên ngoài vòng lặp nên trong quá trình chạy vòng lặp, biến này không thay đổi dẫn đến kết quả của tất cả các mã hàng được ghi vào 1 vị trí, cái sau đè cái trước và kết quả cuối cùng chỉ có mã hàng được vòng lặp duyệt cuối cùng là còn lại trên sheet
Cách sửa: Với mỗi mã hàng cần phải xác định lại biến lrow, vì vậy dòng lệnh xác định lrow phải đặt trong vòng lặp
Mã:
For a = 1 To solonnhat
lrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row + 1
Lỗi 2.
Mã:
dulieu1.Offset(0, 2).Value = giatri1
Dòng lệnh này dùng để ghi giá trị của biến giatri1 vào ô dulieu1.Offset(0, 2). Nhưng nếu tôi hiểu đúng thì bạn đang muốn gán giá trị của ô dulieu1.Offset(0, 2) vào biến giatri1. Nếu đúng vậy thì bạn cần phải đảo ngược lại.
Mã:
giatri1 = dulieu1.Offset(0, 2).Value
Hai chỗ còn lại tương tự như lỗi 2.
Đúng chuẩn mấy lỗi này luôn bạn ạ, cộng thêm mình đếm số cột bị sai nữa. Cảm ơn bạn nhiều nhiều, làm mấy ngày nay mà hoài không được :D <3
 
Upvote 0
Web KT

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

Back
Top Bottom