nguyenvietcuong
Thành viên mới
- Tham gia
- 26/3/08
- Bài viết
- 19
- Được thích
- 1
Em đã xem các hàm a lập trong VBA & đã ngộ ra đc một chút... tuy nhiên,vì file này a làm trên cơ sở file excel cũ chưa hoàn chỉnh, nên vẫn mắc một số lỗi. VD:
với chứng từ như sau:
(ta theo dõi cho khoản mục TAM)
Số CT---- Ngày CT ----- Số tiền -----TK Nợ -----TK Có ---- Km nợ ----KM có
007 -----01/06/2007 ---1,363,637 ----1331 ------141 -------CDC ------TAM
thì như vậy, với các hàm trong VBA a lập, chứng từ này thoả mã điều kiện, nhưng khi tính sumproduct đã nhặt cả TK 1331 vào là thừa (mà lẽ ra TK này chỉ nhặt khi theo dõi mã CDC). Đối với chứng từ này thì chỉ nhặt 141 vào TAM mà thôi
Lỗi là do thiết lập hàm sumproduct:
.Range("F" & 11 + i).FormulaR1C1 = "=SUMPRODUCT((left(TkNo,3)=""133"")*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
vấn đề này, trong hàm của excel đã được sửa:
ở cột TK 1331, nhập hàm:
=SUMPRODUCT((LEFT(TkNo,3)="133")*(CtNg=Out!$C14)*(CtSo=Out!$B14)*(CtSt)*(KMno=MaKM))
hàm VBA trên bị thiếu fần xét điều kiện Mã khoản mục nợ phải bằng Mã khoản mục mà mình nhập ở ô nhập mã khoản mục thì mới tính tổng. Tương tự cho các cột của các TK khác cũng như vậy.
Em thử thêm vào hàm VBA đkiện trên như sau:
trong excel, em thêm name KMno, KMco tương tự như a đã làm với TkNo, TkCo... sau đó trong VBA e tiến hành sửa như sau:
- ở đoạn này e thêm phần đánh dấu đỏ:
With Sheet4
eR = .Range("I65000").End(xlUp).Row 'dong cuoi
Set CtDg = .Range("C2:C" & eR)
.Range("P1" & eR).ClearContents
.Range("I1:I" & eR).Name = "SoCt"
.Range("A2:A" & eR).Name = "CtSo"
.Range("D2" & eR).Name = "CtSt"
.Range("B2:B" & eR).Name = "CtNg"
.Range("E2:E" & eR).Name = "TkNo"
.Range("F2:F" & eR).Name = "TkCo"
.Range("G2:G" & eR).Name = "KmNo"
.Range("H2:H" & eR).Name = "KmCo"
End With
và ở phần sau, e thử sửa đối với TK1331: (em thêm phần đánh dấu đỏ)
Sheet2.Select
With Sheet2
.Range("A12:L1000").ClearContents
For i = 1 To eR - 1
iR = WorksheetFunction.Match(SoCtLoc(i), Range("Soct"), 0)
.Range("A" & 11 + i) = WorksheetFunction.Index(Range("CtSo"), iR, 0)
.Range("B" & 11 + i) = WorksheetFunction.Index(Range("CtNg"), iR, 0)
.Range("C" & 11 + i) = WorksheetFunction.Index(CtDg, iR, 0)
.Range("D" & 11 + i).FormulaR1C1 = "=SUMPRODUCT(((left(TkNo,3)=""336"")+(left(TkNo,3)=""141""))*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
.Range("E" & 11 + i).FormulaR1C1 = "=SUMPRODUCT(((left(TkCo,3)=""336"")+(left(TkCo,3)=""141""))*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
.Range("F" & 11 + i).FormulaR1C1 = "=SUMPRODUCT((left(TkNo,3)=""133"")*(KmNo=E7)*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
.Range("G" & 11 + i).FormulaR1C1 = "=SUMPRODUCT((left(TkNo,3)=""621"")*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
.Range("H" & 11 + i).FormulaR1C1 = "=SUMPRODUCT((left(TkNo,3)=""622"")*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
.Range("I" & 11 + i).FormulaR1C1 = "=SUMPRODUCT((left(TkNo,3)=""627"")*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
Next
End With
trong đó E7 là ô trong sheet2 mà mình phải nhập mã khoản mục vào, tuy nhiên câu lệnh ko đc chấp nhận. Em thử thay bằng (KMno="E7") cũng ko đc. Em thay bằng (KMno=""TAM"") thì lại đc, tuy nhiên như thế thì lại chỉ lọc với mã TAM thoai, mà ý em có nghĩa là mún đối chiếu đk KMno có giống với mã mà mình nhập vào ô E7 ko... Đoạn này trong excel thì em chỉ việc gõ (KMno=E7) là xong, nhưng trong VBA e ko bít fải khai báo thế nào để VBA hiểu như thế...
Thêm nữa là nếu a thử nhập mã CDC vào thì sẽ thấy là ở sheet out, từ dòng thứ 25 trở đi là ngày tháng hiển thị thế nào ấy, e chả hỉu j cả... a xem lại dùm... với lại các ô trống thì bị thay bằng số 0, phía bên trên, các ô trống bị thay bằng dấu gạch ngang, nhìn rất khó chịu... có cách nào để trống các ô ko có dữ liệu ko ạ?
Thêm nữa, phần khoá sổ chưa có, thì e phải làm thế nào để nó xuất hiện liền sau chứng từ cuối cùng?
với chứng từ như sau:
(ta theo dõi cho khoản mục TAM)
Số CT---- Ngày CT ----- Số tiền -----TK Nợ -----TK Có ---- Km nợ ----KM có
007 -----01/06/2007 ---1,363,637 ----1331 ------141 -------CDC ------TAM
thì như vậy, với các hàm trong VBA a lập, chứng từ này thoả mã điều kiện, nhưng khi tính sumproduct đã nhặt cả TK 1331 vào là thừa (mà lẽ ra TK này chỉ nhặt khi theo dõi mã CDC). Đối với chứng từ này thì chỉ nhặt 141 vào TAM mà thôi
Lỗi là do thiết lập hàm sumproduct:
.Range("F" & 11 + i).FormulaR1C1 = "=SUMPRODUCT((left(TkNo,3)=""133"")*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
vấn đề này, trong hàm của excel đã được sửa:
ở cột TK 1331, nhập hàm:
=SUMPRODUCT((LEFT(TkNo,3)="133")*(CtNg=Out!$C14)*(CtSo=Out!$B14)*(CtSt)*(KMno=MaKM))
hàm VBA trên bị thiếu fần xét điều kiện Mã khoản mục nợ phải bằng Mã khoản mục mà mình nhập ở ô nhập mã khoản mục thì mới tính tổng. Tương tự cho các cột của các TK khác cũng như vậy.
Em thử thêm vào hàm VBA đkiện trên như sau:
trong excel, em thêm name KMno, KMco tương tự như a đã làm với TkNo, TkCo... sau đó trong VBA e tiến hành sửa như sau:
- ở đoạn này e thêm phần đánh dấu đỏ:
With Sheet4
eR = .Range("I65000").End(xlUp).Row 'dong cuoi
Set CtDg = .Range("C2:C" & eR)
.Range("P1" & eR).ClearContents
.Range("I1:I" & eR).Name = "SoCt"
.Range("A2:A" & eR).Name = "CtSo"
.Range("D2" & eR).Name = "CtSt"
.Range("B2:B" & eR).Name = "CtNg"
.Range("E2:E" & eR).Name = "TkNo"
.Range("F2:F" & eR).Name = "TkCo"
.Range("G2:G" & eR).Name = "KmNo"
.Range("H2:H" & eR).Name = "KmCo"
End With
và ở phần sau, e thử sửa đối với TK1331: (em thêm phần đánh dấu đỏ)
Sheet2.Select
With Sheet2
.Range("A12:L1000").ClearContents
For i = 1 To eR - 1
iR = WorksheetFunction.Match(SoCtLoc(i), Range("Soct"), 0)
.Range("A" & 11 + i) = WorksheetFunction.Index(Range("CtSo"), iR, 0)
.Range("B" & 11 + i) = WorksheetFunction.Index(Range("CtNg"), iR, 0)
.Range("C" & 11 + i) = WorksheetFunction.Index(CtDg, iR, 0)
.Range("D" & 11 + i).FormulaR1C1 = "=SUMPRODUCT(((left(TkNo,3)=""336"")+(left(TkNo,3)=""141""))*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
.Range("E" & 11 + i).FormulaR1C1 = "=SUMPRODUCT(((left(TkCo,3)=""336"")+(left(TkCo,3)=""141""))*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
.Range("F" & 11 + i).FormulaR1C1 = "=SUMPRODUCT((left(TkNo,3)=""133"")*(KmNo=E7)*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
.Range("G" & 11 + i).FormulaR1C1 = "=SUMPRODUCT((left(TkNo,3)=""621"")*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
.Range("H" & 11 + i).FormulaR1C1 = "=SUMPRODUCT((left(TkNo,3)=""622"")*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
.Range("I" & 11 + i).FormulaR1C1 = "=SUMPRODUCT((left(TkNo,3)=""627"")*(CtNg=RC2)*(CtSo=RC1)*CtSt)"
Next
End With
trong đó E7 là ô trong sheet2 mà mình phải nhập mã khoản mục vào, tuy nhiên câu lệnh ko đc chấp nhận. Em thử thay bằng (KMno="E7") cũng ko đc. Em thay bằng (KMno=""TAM"") thì lại đc, tuy nhiên như thế thì lại chỉ lọc với mã TAM thoai, mà ý em có nghĩa là mún đối chiếu đk KMno có giống với mã mà mình nhập vào ô E7 ko... Đoạn này trong excel thì em chỉ việc gõ (KMno=E7) là xong, nhưng trong VBA e ko bít fải khai báo thế nào để VBA hiểu như thế...
Thêm nữa là nếu a thử nhập mã CDC vào thì sẽ thấy là ở sheet out, từ dòng thứ 25 trở đi là ngày tháng hiển thị thế nào ấy, e chả hỉu j cả... a xem lại dùm... với lại các ô trống thì bị thay bằng số 0, phía bên trên, các ô trống bị thay bằng dấu gạch ngang, nhìn rất khó chịu... có cách nào để trống các ô ko có dữ liệu ko ạ?
Thêm nữa, phần khoá sổ chưa có, thì e phải làm thế nào để nó xuất hiện liền sau chứng từ cuối cùng?