Công thức dò Tài khoản theo số chứng từ (1 người xem)

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

danhculao

Thành viên hoạt động
Tham gia
26/9/16
Bài viết
166
Được thích
18
Chào các A/c!
Nhờ các A/c chỉ giúp em Công thức dò Tài khoản theo số chứng từ như file đính kèm.
Khi em nhập 1 tài khoản bất kỳ thì sẽ hiện thông tin các tài khoản đối ứng theo số chứng từ bên sheet NKC. Nhờ các A/c chỉ giúp em ạ
Em cám ơn!
 

File đính kèm

Chào các A/c!
Nhờ các A/c chỉ giúp em Công thức dò Tài khoản theo số chứng từ như file đính kèm.
Khi em nhập 1 tài khoản bất kỳ thì sẽ hiện thông tin các tài khoản đối ứng theo số chứng từ bên sheet NKC. Nhờ các A/c chỉ giúp em ạ
Em cám ơn!
Dữ liệu sheet NKC bạn tự nhập hay lấy từ phần mềm nào khác?
Cột D và cột F có "cả đống" dấu cách trước sau.
Trả lời chuyện này rồi tính tiếp.;
 
đó là dữ liệu trên phần mềm em kết xúât ra nó như vậy anh à
 
Chào các A/c!
Nhờ các A/c chỉ giúp em Công thức dò Tài khoản theo số chứng từ như file đính kèm.
Khi em nhập 1 tài khoản bất kỳ thì sẽ hiện thông tin các tài khoản đối ứng theo số chứng từ bên sheet NKC. Nhờ các A/c chỉ giúp em ạ
Em cám ơn!
Không biết tài khoản đối ứng là gì nhưng xin giải thích dùm chỗ màu đỏ như nào? Sau khi nhập Tài khoản vào F7 thì chỗ màu đỏ nhập vào như nào?
"Khi nhập tài khoản ở ô F7 thì sẽ hiện thông tin bên dưới, dò tìm dựa theo Số chứng từ để biết các Ps nợ/Có (Dữ liệu bên sheet NKC"
 
@ Anh Ba Tê:
Thay F3= 51111, hoặc 144, nó vẫn chưa thể hiện hết các chứng từ liên quan. Miễn sao, khi cộng Nợ và Có lúc nào số cũng bằng nhau. Hiện tại Code chỉ tính từ dòng nó (TK đang truy lục tại F3) phát sinh trở xuống, chứ chưa tính các dòng có cùng số chứng từ ở trên nó.

Chào các A/c!
Nhờ các A/c chỉ giúp em Công thức dò Tài khoản theo số chứng từ như file đính kèm.
Khi em nhập 1 tài khoản bất kỳ thì sẽ hiện thông tin các tài khoản đối ứng theo số chứng từ bên sheet NKC. Nhờ các A/c chỉ giúp em ạ
Em cám ơn!

Thử bằng giải pháp cột phụ:
Sheet "SoChitietTK":
1/ Cột K: Liệt kê các chứng từ phát sinh trong kỳ liên hệ đến TK cần trích lục tại F3:
PHP:
K10=IFERROR(OFFSET(NKC!$D$1,MATCH(ROW($A1),INDEX(COUNTIF(OFFSET(NKC!$F$2,,,ROW($1:$500)),$F$3&"*"),),0),),"")
2/ Cột M: Số dòng mỗi chứng từ phát sinh.
PHP:
M10=(L9>0)*SUM($L$9:L9)
3/ Chi tiết dòng chứng từ phát sinh:
PHP:
D10=LOOKUP(ROW()-9,1/(1/$M$10:$M$40),$K$10:$K$40)
E10=IFERROR(T(OFFSET(NKC!E$1,MATCH(COUNTIF($D$10:$D10,$D10),INDEX(COUNTIF(OFFSET(NKC!$D$2,,,ROW($1:$500)),$D10),),0),)),"")
Fill xuống và copy cho các cột tương ứng.

Bạn tham khảo file kèm.

Chúc anh em ngày cuối tuần vui vẻ.
 

File đính kèm

Lần chỉnh sửa cuối:
@ Anh Ba Tê:
Thay F3= 51111, hoặc 144, nó vẫn chưa thể hiện hết các chứng từ liên quan. Miễn sao, khi cộng Nợ và Có lúc nào số cũng bằng nhau. Hiện tại Code chỉ tính từ dòng nó (TK đang truy lục tại F3) phát sinh trở xuống, chứ chưa tính các dòng có cùng số chứng từ ở trên nó.



Thử bằng giải pháp cột phụ:
Sheet "SoChitietTK":
1/ Cột K: Liệt kê các chứng từ phát sinh trong kỳ liên hệ đến TK cần trích lục tại F3:
PHP:
K10=IFERROR(OFFSET(NKC!$D$1,MATCH(ROW($A1),INDEX(COUNTIF(OFFSET(NKC!$F$2,,,ROW($1:$500)),$F$3&"*"),),0),),"")
2/ Cột M: Số dòng mỗi chứng từ phát sinh.
PHP:
M10=(L9>0)*SUM($L$9:L9)
3/ Chi tiết dòng chứng từ phát sinh:
PHP:
D10=LOOKUP(ROW()-9,1/(1/$M$10:$M$40),$K$10:$K$40)
E10=IFERROR(T(OFFSET(NKC!E$1,MATCH(COUNTIF($D$10:$D10,$D10),INDEX(COUNTIF(OFFSET(NKC!$D$2,,,ROW($1:$500)),$D10),),0),)),"")
Fill xuống và copy cho các cột tương ứng.

Bạn tham khảo file kèm.

Chúc anh em ngày cuối tuần vui vẻ.
Tui có biết nghiệp vụ kế toán là gì "chết liền". Thấy sao làm vậy đúng kết quả mẫu là may lắm rồi.
Ví dụ thì kết quả phải có vài trường hợp khác nhau mới "mò mẫm, sờ sẫm, rờ rẫm" cho "nó ra" kết quả giống mẫu.
Tui "làm cho nó ra" như vậy thì "hết sức" rồi.
 
Chào các A/c!
Nhờ các A/c chỉ giúp em Công thức dò Tài khoản theo số chứng từ như file đính kèm.
Khi em nhập 1 tài khoản bất kỳ thì sẽ hiện thông tin các tài khoản đối ứng theo số chứng từ bên sheet NKC. Nhờ các A/c chỉ giúp em ạ
Em cám ơn!
Bài này dùng Countif mảng là hợp lý, bạn dùng CT mảng sau tại B10 sheet SoChiTietTK:
Mã:
B10=IFERROR(INDEX(NKC!$B$2:$I$43,SMALL(IF(MMULT(--(NKC!$D$2:$D$43=TRANSPOSE(IF(IFERROR(SEARCH($F$3&"*",NKC!$F$2:$F$43),),NKC!$D$2:$D$43))),NKC!$B$2:$B$43^0),NKC!$B$2:$B$43),ROW(A1)),COLUMN(A1)),"")
Ctrl+Shift+Enter fill xuống vừa đủ, sau đó fill sang trái!!!!
 

File đính kèm

Tui có biết nghiệp vụ kế toán là gì "chết liền". Thấy sao làm vậy đúng kết quả mẫu là may lắm rồi.
Ví dụ thì kết quả phải có vài trường hợp khác nhau mới "mò mẫm, sờ sẫm, rờ rẫm" cho "nó ra" kết quả giống mẫu.
Tui "làm cho nó ra" như vậy thì "hết sức" rồi.
Không sao đâu anh! /-*+/

Làm vài ve là lấy lại "sức" ngay, rồi chiến đấu tiếp. Công thức làm là để giải trí làm "mồi đưa cay", chứ Nhật ký chung đến mấy ngàn dòng lận, nên giải pháp VBA là tối ưu.

Chúc anh em ngày thiệt vui.
 
Chào các A/c!
Nhờ các A/c chỉ giúp em Công thức dò Tài khoản theo số chứng từ như file đính kèm.
Khi em nhập 1 tài khoản bất kỳ thì sẽ hiện thông tin các tài khoản đối ứng theo số chứng từ bên sheet NKC. Nhờ các A/c chỉ giúp em ạ
Em cám ơn!
Dùng mảng 2 chiều hơi nặng khi dữ liệu nhiều, mình chỉnh lại CT dùng mảng 1 chiều để CT nhẹ hơn, bạn dùng CT mảng ở B10:
Mã:
B10=IFERROR(INDEX(NKC!$B$2:$I$1000,SMALL(IF(ISNUMBER(MATCH(NKC!$D$2:$D$1000,IF(SEARCH($F$3&"*",NKC!$F$2:$F$1000),NKC!$D$2:$D$1000),)),NKC!$B$2:$B$1000),ROW(A1)),COLUMN(A1)),"")
Ctrl+Shift+Enter rồi fill xuống vừa đủ, rồi fill sang phải!!!
 

File đính kèm

Không sao đâu anh! /-*+/

Làm vài ve là lấy lại "sức" ngay, rồi chiến đấu tiếp. Công thức làm là để giải trí làm "mồi đưa cay", chứ Nhật ký chung đến mấy ngàn dòng lận, nên giải pháp VBA là tối ưu.

Chúc anh em ngày thiệt vui.
Tui hổng biết uống bia nên thường chỉ "1 ve đế" là xong. (Có nhiều TV GPE "chứng miêng"), 1 ngày sau mới biết còn "chiến đấu" được hông.
Nếu tác giả yêu cầu như vậy thì phải thêm 1 vòng lặp, ghi lại tất cả các số chứng từ phát sinh liên quan rồi mới lấy dữ liệu.
PHP:
Public Sub GPE()
Dim sArr(), dArr(), Tmp, I As Long, J As Long, K As Long, R As Long, DK As String, SCT As String
With Sheets("NKC")
    sArr = .Range("B2", .Range("B2").End(xlDown)).Resize(, 8).Value
    R = UBound(sArr)
End With
ReDim dArr(1 To R, 1 To 8)
DK = UCase(CStr(Sheets("SoChiTietTK").Range("F3")))
With CreateObject("Scripting.Dictionary")
    For I = 1 To R
        SCT = CStr(Trim(sArr(I, 3)))
        If UCase(CStr(Trim(sArr(I, 5)))) = DK Then .Item(SCT) = ""
    Next I
    For I = 1 To R
        SCT = CStr(Trim(sArr(I, 3)))
        If .Exists(SCT) Then
            K = K + 1: dArr(K, 1) = K
            For J = 2 To 8
                dArr(K, J) = Trim(sArr(I, J))
            Next J
        End If
    Next I
End With
With Sheets("SoChiTietTK")
    .Range("B10").Resize(1000, 8).ClearContents
    If K Then .Range("B10").Resize(K, 8) = dArr
End With
End Sub
 
@ Anh Ba Tê:
Thay F3= 51111, hoặc 144, nó vẫn chưa thể hiện hết các chứng từ liên quan. Miễn sao, khi cộng Nợ và Có lúc nào số cũng bằng nhau. Hiện tại Code chỉ tính từ dòng nó (TK đang truy lục tại F3) phát sinh trở xuống, chứ chưa tính các dòng có cùng số chứng từ ở trên nó.



Thử bằng giải pháp cột phụ:
Sheet "SoChitietTK":
1/ Cột K: Liệt kê các chứng từ phát sinh trong kỳ liên hệ đến TK cần trích lục tại F3:
PHP:
K10=IFERROR(OFFSET(NKC!$D$1,MATCH(ROW($A1),INDEX(COUNTIF(OFFSET(NKC!$F$2,,,ROW($1:$500)),$F$3&"*"),),0),),"")
2/ Cột M: Số dòng mỗi chứng từ phát sinh.
PHP:
M10=(L9>0)*SUM($L$9:L9)
3/ Chi tiết dòng chứng từ phát sinh:
PHP:
D10=LOOKUP(ROW()-9,1/(1/$M$10:$M$40),$K$10:$K$40)
E10=IFERROR(T(OFFSET(NKC!E$1,MATCH(COUNTIF($D$10:$D10,$D10),INDEX(COUNTIF(OFFSET(NKC!$D$2,,,ROW($1:$500)),$D10),),0),)),"")
Fill xuống và copy cho các cột tương ứng.

Bạn tham khảo file kèm.

Chúc anh em ngày cuối tuần vui vẻ.
Công thức này em đã làm giống anh và đã ra kết quả, anh có thể giải thích giúp em công thức ô E10 có chữ "T" được không ạ?
 
Tui hổng biết uống bia nên thường chỉ "1 ve đế" là xong. (Có nhiều TV GPE "chứng miêng"), 1 ngày sau mới biết còn "chiến đấu" được hông.
Nếu tác giả yêu cầu như vậy thì phải thêm 1 vòng lặp, ghi lại tất cả các số chứng từ phát sinh liên quan rồi mới lấy dữ liệu.
PHP:
Public Sub GPE()
Dim sArr(), dArr(), Tmp, I As Long, J As Long, K As Long, R As Long, DK As String, SCT As String
With Sheets("NKC")
    sArr = .Range("B2", .Range("B2").End(xlDown)).Resize(, 8).Value
    R = UBound(sArr)
End With
ReDim dArr(1 To R, 1 To 8)
DK = UCase(CStr(Sheets("SoChiTietTK").Range("F3")))
With CreateObject("Scripting.Dictionary")
    For I = 1 To R
        SCT = CStr(Trim(sArr(I, 3)))
        If UCase(CStr(Trim(sArr(I, 5)))) = DK Then .Item(SCT) = ""
    Next I
    For I = 1 To R
        SCT = CStr(Trim(sArr(I, 3)))
        If .Exists(SCT) Then
            K = K + 1: dArr(K, 1) = K
            For J = 2 To 8
                dArr(K, J) = Trim(sArr(I, J))
            Next J
        End If
    Next I
End With
With Sheets("SoChiTietTK")
    .Range("B10").Resize(1000, 8).ClearContents
    If K Then .Range("B10").Resize(K, 8) = dArr
End With
End Sub
Em không giỏi về VBA anh có thể giúp em làm sao để đưa Code này vào file excel này với ạ?
 
Em không giỏi về VBA anh có thể giúp em làm sao để đưa Code này vào file excel này với ạ?
Bạn tải file bài #4, chọn Enable macros khi mở file, ấn Alt+F11, xoá sub cũ trong module, copy sub bài #11 paste vào thay. Nhập mã TK vào F3, code sẽ làm việc.
 
Dùng mảng 2 chiều hơi nặng khi dữ liệu nhiều, mình chỉnh lại CT dùng mảng 1 chiều để CT nhẹ hơn, bạn dùng CT mảng ở B10:
Mã:
B10=IFERROR(INDEX(NKC!$B$2:$I$1000,SMALL(IF(ISNUMBER(MATCH(NKC!$D$2:$D$1000,IF(SEARCH($F$3&"*",NKC!$F$2:$F$1000),NKC!$D$2:$D$1000),)),NKC!$B$2:$B$1000),ROW(A1)),COLUMN(A1)),"")
Ctrl+Shift+Enter rồi fill xuống vừa đủ, rồi fill sang phải!!!
kế toán trong Excel dùng mảng 2, 1 chiều cũng chạy đua với rùa hết
ngứa nghề nên cũng góp vui
công thức dùng 4 cột phụ cho nhẹ file
thêm 1 sheet dùng code VBA
Mã:
Sub TK_ChungTu()
Dim Arr(), Darr(), LastR As Long, i As Long, j As Long, k As Long, iR As Long, TK As String, SCT As String
LastR = Sheets("NKC").Range("C" & Rows.Count).End(xlUp).Row
If LastR < 2 Then Exit Sub
Darr = Sheets("NKC").Range("B2:I" & LastR).Value
ReDim Arr(1 To UBound(Darr), 1 To 8)
TK = UCase(CStr(Sheets("ChungTu_TK").Range("F3")))
For i = 1 To UBound(Darr)
  If Darr(i, 3) <> SCT Then iR = i: SCT = Darr(i, 3)
  If UCase(CStr(Trim(Darr(i, 5)))) = TK Then
    For n = iR To UBound(Darr)
      If Darr(n, 3) = SCT Then
        k = k + 1: Arr(k, 1) = k
        For j = 2 To 8
          Arr(k, j) = Trim(Darr(n, j))
        Next j
      Else
        i = n - 1
        Exit For
      End If
    Next n
  End If
Next i
Sheets("ChungTu_TK").Range("B10:I2000").ClearContents
If k Then Sheets("ChungTu_TK").Range("B10").Resize(k, 8) = Arr
End Sub
 

File đính kèm

Công thức này em đã làm giống anh và đã ra kết quả, anh có thể giải thích giúp em công thức ô E10 có chữ "T" được không ạ?
Nếu không có hàm T(), thì khi lấy dữ liệu từ NKC qua nếu dòng tương ứng trống rỗng thì nó trả về số 0, để tránh hiện tượng này dùng T() sẽ loại bỏ được.
Ví dụ: Giả sử F3= 144, và từ E10 trở xuống bạn dùng công thức bỏ T() thì sẽ thấy ngay:
=IFERROR(OFFSET(NKC!E$1,MATCH(COUNTIF($D$10:$D10,$D10),INDEX(COUNTIF(OFFSET(NKC!$D$2,,,ROW($1:$500)),$D10),),0),),"")

Tuy nhiên, theo kinh nghiệm của riêng tôi, thì sheet NKC thông thường tệ lắm cũng trên 2->3000 dòng dữ liệu (tùy theo mô hình DN nhỏ/lớn, giao dịch ít nhiều nữa), cho nên bạn nên nghiên cứu 2 đoạn chương trình của anh Ba Tê và bạn HieuCD, sẽ giúp ích cho file của bạn nhiều lắm. Biết sử dụng sở trường sở đoản của từng giải pháp: nên dùng công thức? hay dùng công cụ? hoặc nên dùng VBA? hoàn toàn phụ thuộc vào yếu tố tình trạng dữ liệu thực tế của bạn, và khuyên bạn không nên thiên lệch vào 1 giải pháp nào đó, nếu được vậy thì bạn sẽ thấy cái hay, cái đẹp của "toàn cảnh" Excel trong công việc quản lý số liệu của mình: nhanh, gọn và chính xác.

Chúc bạn học tập vui với đại gia đình GPE. /-*+//-*+//-*+/
 
Tui hổng biết uống bia nên thường chỉ "1 ve đế" là xong. (Có nhiều TV GPE "chứng miêng"), 1 ngày sau mới biết còn "chiến đấu" được hông.
Nếu tác giả yêu cầu như vậy thì phải thêm 1 vòng lặp, ghi lại tất cả các số chứng từ phát sinh liên quan rồi mới lấy dữ liệu.
Anh được "1 ve đế" thì là bậc "cao thủ", đệ tử của Lưu Linh rồi, còn gì cần "chứng miêng"! khà khà khà. --=0--=0--=0

Tiếc là anh em mình không có cơ hội, để "chén tạc chén thù".

Chúc anh ngày vui.
 
kế toán trong Excel dùng mảng 2, 1 chiều cũng chạy đua với rùa hết
ngứa nghề nên cũng góp vui
công thức dùng 4 cột phụ cho nhẹ file
thêm 1 sheet dùng code VBA....
Quên! nếu nói về nghề thì phải "thọ giáo Phương trượng" chứ há!

Chúc bạn hiền ngày thiệt vui. /-*+//-*+//-*+/
 
Chào các A/c!
Nhờ các A/c chỉ giúp em Công thức dò Tài khoản theo số chứng từ như file đính kèm.
Khi em nhập 1 tài khoản bất kỳ thì sẽ hiện thông tin các tài khoản đối ứng theo số chứng từ bên sheet NKC. Nhờ các A/c chỉ giúp em ạ
Em cám ơn!
Theo tôi thì nên tìm số chứng từ thì sẽ dễ dàng hơn nhiều dù cho nó có bao nhiêu số tài khoản cũng không quan trọng (sau khi xem File thì tôi chỉ ý kiến khách quan chứ tôi không là dân kế toán).
 
Quên! nếu nói về nghề thì phải "thọ giáo Phương trượng" chứ há!

Chúc bạn hiền ngày thiệt vui. /-*+//-*+//-*+/
đâu dám nhận, chỉ làm nhiều nên quen tay và trở thành "thợ già" có kinh nghiệm xử lý dữ liệu kế toán:pimp:
dùng cột phụ, bảng phụ và ...nhiều thứ phụ để chia nhỏ và đơn giản hóa công thức phức tạp làm nhẹ file là tiêu chí quan trọng của mình. Thậm chí mình cũng không dùng hàm SumifS mà tìm cách chuyển về Sumif cho nhẹ như thêm cột phụ
kiến thức kế toán của mình thua bạn xa:wiggle:
chúc bạn một ngày vui /-*+//-*+//-*+/
 
kế toán trong Excel dùng mảng 2, 1 chiều cũng chạy đua với rùa hết
ngứa nghề nên cũng góp vui
công thức dùng 4 cột phụ cho nhẹ file
thêm 1 sheet dùng code VBA
Mã:
Sub TK_ChungTu()
Dim Arr(), Darr(), LastR As Long, i As Long, j As Long, k As Long, iR As Long, TK As String, SCT As String
LastR = Sheets("NKC").Range("C" & Rows.Count).End(xlUp).Row
If LastR < 2 Then Exit Sub
Darr = Sheets("NKC").Range("B2:I" & LastR).Value
ReDim Arr(1 To UBound(Darr), 1 To 8)
TK = UCase(CStr(Sheets("ChungTu_TK").Range("F3")))
For i = 1 To UBound(Darr)
  If Darr(i, 3) <> SCT Then iR = i: SCT = Darr(i, 3)
  If UCase(CStr(Trim(Darr(i, 5)))) = TK Then
    For n = iR To UBound(Darr)
      If Darr(n, 3) = SCT Then
        k = k + 1: Arr(k, 1) = k
        For j = 2 To 8
          Arr(k, j) = Trim(Darr(n, j))
        Next j
      Else
        i = n - 1
        Exit For
      End If
    Next n
  End If
Next i
Sheets("ChungTu_TK").Range("B10:I2000").ClearContents
If k Then Sheets("ChungTu_TK").Range("B10").Resize(k, 8) = Arr
End Sub
Anh HieuCD ơi, làm thế nào để đưa code này vào file này ạ, em không rành về VBA, anh chỉ giúp em với ạ
 
Anh HieuCD ơi, làm thế nào để đưa code này vào file này ạ, em không rành về VBA, anh chỉ giúp em với ạ
trong file mình gởi lên có code trong đó, chạy trong sheet ChungTu_TK (file của bạn đặt tên là sochitiet là không ổn vì sẽ gây hiểu nhầm là sổ chi tiết, sổ chi tiết đâu có giống như vậy) bấm ngôi sao chạy code, để xem code bạn bấm Alt+F11 chọn Mudule để xem
trên file thật của bạn:
lưu lại với đuôi là .xlsb hoặc .xlsm
bấm Alt+F11, chọn insert module và chép code vào, bạn sửa tên sheet trong dấu "" lại cho phù hợp
 
Hi, anh HieuCD, nhân tiện topic em muốn hỏi vẫn từ data của bạn danhculao, em muốn ở ô F3 gõ số chứng từ thì sẽ hiện ra tất cả các dòng dữ liệu chứa số chứng từ đó bằng VBA có được không, mong anh giúp em với ạ.
 

File đính kèm

kế toán trong Excel dùng mảng 2, 1 chiều cũng chạy đua với rùa hết
ngứa nghề nên cũng góp vui
công thức dùng 4 cột phụ cho nhẹ file
thêm 1 sheet dùng code VBA
Có lẽ còn tùy thuộc vào công việc anh ạ, công việc của em là phân tích dạng "mì ăn liền", nên chỉ quan trong kết quả với thời gian nhanh nhất, đôi khi kết quả đó chỉ sài một lần duy nhất, khi đã quá gấp rút thời gian thì chỉ cần có hướng đi là được nói chung cách nào cũng được, còn vấn đề nặng nhẹ do phần mềm thì không thành vấn đề, xử lý được hết,với excel chuyển sang Manual và bấm F9 ngồi đợi, với những máy mạnh như I7 thế hệ 7, hay ryzen 1800x 20.000 excel với công thức mảng 2 chiều không quá 2 phút, yếu do mạng thì nâng cấp mạng, yếu do server thì nâng cấp server.... công việc kế toán là dạng công việc phần lớn khuôn mẫu vì nó lặp đi lặp lại, anh có quá nhiều thời gian để thiết kế để đạt mục đích tối ưu nhất, đôi khi kế toán cũng gặp rơi vào trường hợp thời gian này nên cũng phải giải quyết theo cách này anh không có quá nhiều thời gian để suy nghĩ và lựa chọn, sau khi kết thúc anh có thể quay lại để tìm giải pháp khác tối ưu nhất để dự phòng để sử dụng lần nữa. Cách làm của anh rất hay có thể nói là tối ưu rồi, nhưng đó là anh có thời gian chọn lọc anh phải suy nghĩ và phân tích lựa chọn tối ưu, chưa kể có thể cách anh chọn nó tốn nhiều thời gian và suy nghĩ hơn. Nói chung cách nào cũng vậy được này mất kia nhưng mỗi cách sẽ phù hợp với các công việc khác nhau. Với kế toán hiện nay, gần như các phần mềm đã làm hết công việc của họ rồi, các công thức phức tạp ít khi nào dùng tới, lâu lâu phát sinh một vài trường hợp nhưng cũng phải đưa thuật toán lên phần mềm để tự động, trừ trường hợp anh thích làm thủ công để định hướng tâm lý của người khác...Đôi khi thấy mấy anh nói kế toán là... nhưng excel không phải chỉ dùng cho kế toán, nên cứ đưa lên giải pháp của mình còn đánh giá phù hợp hay không là người sử dụng, trong thời buổi kinh tế hiện nay cái quan trọng nhất là ý tưởng, đôi khi gò bó trong một tiêu chuẩn hay nguyên tắc nào đấy thì những ý tưởng hay sẽ bị loại bỏ...
Sorry anh nếu có gì nói không phải!!!
 
Có lẽ còn tùy thuộc ................. hiện nay cái quan trọng nhất là ý tưởng, đôi khi gò bó trong một tiêu chuẩn hay nguyên tắc nào đấy thì những ý tưởng hay sẽ bị loại bỏ...
Sorry anh nếu có gì nói không phải!!!

Câu này tôi thấy chưa đúng nè.

"Với kế toán hiện nay, gần như các phần mềm đã làm hết công việc của họ rồi"

Theo nhận xét của tôi, thì phần mềm chỉ đáp ứng được 1 phần ông việc thôi, còn tổng hợp báo cáo, phân tích dữ liệu đều phải nhờ Excel (tôi là công chức và không phải là dân kế toán), nên phán đại 1 câu xanh rờn như vậy? Nếu thành viên nào là dân kế toán thì giải đáp dùm.
 
Có lẽ còn tùy thuộc vào công việc anh ạ,
Nói chung cách nào cũng vậy được này mất kia nhưng mỗi cách sẽ phù hợp với các công việc khác nhau.
Đôi khi thấy mấy anh nói kế toán là... nhưng excel không phải chỉ dùng cho kế toán...
bạn nói rất chính xác, tùy theo đặc thù của công việc mà chọn cách xử lý khác nhau và do yêu cầu công việc lặp đi lặp lại hằng ngày hình thành thói quen "bệnh nghề nghiệp"
do dữ liệu kế toán quá nhiều nên mình phải bỏ thời gian lựa chọn cách xử lý công thức nhẹ nhất, nếu excel cứ quay vòng vòng làm người sử dụng mất hứng, không thoải mái ảnh hưởng đến tâm lý làm việc.
có nhiều thao tác nhập liệu phải xử lý ngay, như nhập số hiệu tài khoản phải kiểm tra ngay tài khoản nầy có thực không, đồng thời các công thức cài đặt trước hiện ngay kết quả và nhân viên đánh giá tính hợp lý của dữ liệu...
do "bệnh nghề nghiệp" nên trước đây mình rất hạn chế dùng công thức mảng, hàm sumproduct, sumifs... những hàm bẩy và loại trừ lổi, vì dùng những hàm nầy nhìn màn hình nhiều khi không biết kết quả sai hay đúng
xử lý công tác kế toán sai,nếu nặng có thể mất việc và ngồi bóc lịch
bây giờ mình đụng gì chơi nấy hết kiêng cử rồi, ăn chay hoài cũng ngán
chúc bạn một ngày vui %#^#$%#^#$%#^#$
 
Hi, anh HieuCD, nhân tiện topic em muốn hỏi vẫn từ data của bạn danhculao, em muốn ở ô F3 gõ số chứng từ thì sẽ hiện ra tất cả các dòng dữ liệu chứa số chứng từ đó bằng VBA có được không, mong anh giúp em với ạ.
bạn chép code vào sheet sochitiet
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$F$3" Then
    Dim Arr(), Darr(), LastR As Long, i As Long, j As Long, k As Long, SCT As String
    Application.ScreenUpdating = False
    LastR = Range("C" & Rows.Count).End(xlUp).Row
    If LastR > 9 Then Range("B10:J" & LastR).ClearContents
    With Sheets("NKC")
      '.UsedRange.AutoFilter
      LastR = .Range("C" & Rows.Count).End(xlUp).Row
      If LastR < 2 Then Exit Sub
      Darr = .Range("B2:J" & LastR).Value
    End With
    ReDim Arr(1 To UBound(Darr), 1 To 8)
    SCT = UCase(Trim(CStr(Range("F3"))))
    For i = 1 To UBound(Darr)
      If UCase(Trim(CStr(Darr(i, 3)))) = SCT Then
        k = k + 1
        For j = 1 To 8
          Arr(k, j) = Trim(Darr(i, j))
        Next j
      End If
    Next i
    If k Then Range("B10").Resize(k, 8) = Arr
    Application.ScreenUpdating = True
  End If
End Sub
 
bạn chép code vào sheet sochitiet
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$F$3" Then
    Dim Arr(), Darr(), LastR As Long, i As Long, j As Long, k As Long, SCT As String
    Application.ScreenUpdating = False
    LastR = Range("C" & Rows.Count).End(xlUp).Row
    If LastR > 9 Then Range("B10:J" & LastR).ClearContents
    With Sheets("NKC")
      '.UsedRange.AutoFilter
      LastR = .Range("C" & Rows.Count).End(xlUp).Row
      If LastR < 2 Then Exit Sub
      Darr = .Range("B2:J" & LastR).Value
    End With
    ReDim Arr(1 To UBound(Darr), 1 To 8)
    SCT = UCase(Trim(CStr(Range("F3"))))
    For i = 1 To UBound(Darr)
      If UCase(Trim(CStr(Darr(i, 3)))) = SCT Then
        k = k + 1
        For j = 1 To 8
          Arr(k, j) = Trim(Darr(i, j))
        Next j
      End If
    Next i
    If k Then Range("B10").Resize(k, 8) = Arr
    Application.ScreenUpdating = True
  End If
End Sub
vào sheet Sochitiet -> nhấn Alt+F11 -> rồi copy code này như thế nào anh ? em ko giỏi bên VBA, em làm cho thực hiện mà ko được ạ?
 

File đính kèm

Anh HieuCD, Ba Tê có thể giúp em thêm 1 vài điều kiện mà sử dụng code VBA với ạ:
- Khi em nhập 1 Tài khoản bất kỳ vào ô F3 (tìm theo số chứng từ), đồng thời em chọn thêm các điều kiện ở các ô F4, F5, F6 nữa.
- Còn nếu nhập 1 Tài khoản bất kỳ vào ô F3 (tìm theo số chứng từ), đồng thời em không chọn thêm các điều kiện ở các ô F4, F5, F6 thì sẽ hiện lên tất cả các thông tin của TK đã chọn (theo số chứng từ)
 

File đính kèm

Anh HieuCD, Ba Tê có thể giúp em thêm 1 vài điều kiện mà sử dụng code VBA với ạ:
- Khi em nhập 1 Tài khoản bất kỳ vào ô F3 (tìm theo số chứng từ), đồng thời em chọn thêm các điều kiện ở các ô F4, F5, F6 nữa.
- Còn nếu nhập 1 Tài khoản bất kỳ vào ô F3 (tìm theo số chứng từ), đồng thời em không chọn thêm các điều kiện ở các ô F4, F5, F6 thì sẽ hiện lên tất cả các thông tin của TK đã chọn (theo số chứng từ)
Bạn xem thử file này, kiểm tra kết quả rồi cho ý kiến.
Chú ý F3:F6 nhập thủ công, đừng copy bên NKC vì sẽ dính 1 đống dấu cách bên đó.
 

File đính kèm

Hay quá, cám ơn anh, em rất muốn học VBA này tốc độ xử lý nhanh mà nhẹ file nữa.
 
Tôi cho rằng bài này khó mà làm được vì dữ liệu NKC kết xuất từ phần mềm ra đánh số chứng từ 1 cách tùy tiện quá. Tôi ví dụ chứng từ số 53 mà tác giả kê mẫu.
Thực tế không có 1 chứng từ nào lại hạch toán toàn bộ các bút toán như thế này (Thậm chí còn vi phạm nguyên tắc nhiều Nợ nhiều Có). Thường là phải như sau:
Trước hết, phải phân tích các nghiệp vụ kinh tế có liên quan tới chứng từ số 53 của bạn:

1/Căn cứ HĐ bán hàng (HĐ Tài chính, HĐ GTGT) hạch nghiệp vụ bán hàng
-Nợ TK 131 (Phải thu khách hàng): 142.062.240
-Có TK 511 (Doanhthu bán hàng: 142.062.240

2/Căn cứ phiếu xuất phiếu giao hàng hạch toán giá vốn hàng bán
Nợ TK 6321 (Giá vốn hàng bán): 140.782.400
Có TK 156 (Kho hàng hóa): 140.782.400

3/Căn cứ biên bản giao hàng và quy định sử lý thiếu hụt hàng hóa tồn kho HT hao hụt kho
Nợ TK 8111 (Chi phí khác): 17.600
Có TK 156 (Kho hàng hóa): 17.600

Vậy chứng từ số 53 của bạn phải được tách theo các chứng từ gốc như trên. (Hình như thiếu định khoản thuế GTGT phải nộp)
Việc kê chi tiết TK của bạn khi nhập TK 6321 thì chỉ lọc phần nghiệp vụ số 2 mới đúng. Nhưng cơ sở để tách TK đối ứng thật khó với trường hợp này. Tôi thường thấy các chứng từ trong phần mềm kết xuất có loại chứng từ thì chỉ căn cứ loại chứng từ để phân biệt là chính xác nhất
 
Lần chỉnh sửa cuối:
Thanks anh @HieuCD rất nhiều nhé. Hôm nọ chờ mãi không thấy mà cần sử dụng nên e vẫn dùng cách của anh như trên nhưng xài thêm cột phụ nên giải quyết vấn đề được rồi ạ. Giờ e sẽ thử phân tích đoạn code của a xem cách thức hoạt động mới ntn để học hỏi thêm. E chỉ hiểu mang máng cách thức chạy và sửa để nó chạy ra hướng mình muốn chứ không biết viết code. Mục đích duy nhất là ứng dụng được nó vào công việc.
P/s: @sealand: Kiểu như của bạn @danhculao e gặp kha khá rồi, nó không phải nhật ký chung mà dạng bảng kê chứng từ và tuỳ vào yêu cầu của đơn vị doanh nghiệp sử dụng phần mềm yêu cầu mà bên viết phần mềm họ viết ra chứ không phải cái gì cũng theo đúng nguyên tắc đâu. Hi, thanks all
 
Lần chỉnh sửa cuối:
Thanks anh @HieuCD rất nhiều nhé. Hôm nọ chờ mãi không thấy mà cần sử dụng nên e vẫn dùng cách của anh như trên nhưng xài thêm cột phụ nên giải quyết vấn đề được rồi ạ. Giờ e sẽ thử phân tích đoạn code của a xem cách thức hoạt động mới ntn để học hỏi thêm. E chỉ hiểu mang máng cách thức chạy và sửa để nó chạy ra hướng mình muốn chứ không biết viết code. Mục đích duy nhất là ứng dụng được nó vào công việc.
P/s: @sealand: Kiểu như của bạn @danhculao e gặp kha khá rồi, nó không phải nhật ký chung mà dạng bảng kê chứng từ và tuỳ vào yêu cầu của đơn vị doanh nghiệp sử dụng phần mềm yêu cầu mà bên viết phần mềm họ viết ra chứ không phải cái gì cũng theo đúng nguyên tắc đâu. Hi, thanks all
bạn dùng cột phụ là tốt rồi,
bạn có thể chạy thử code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("$F$3:SFS6")) Is Nothing Then
    Dim Arr(), Darr(), LastR As Long, i As Long, j As Long, k As Long, Dk As String
    Dim Tk As String, Ngay, SCT As String, MaKH As String, Str1, Str2, Str3, Str4
    Dim TkBln As Boolean, NgayBln As Boolean, SctBln As Boolean, MakhBln As Boolean, Msg As String
    Application.ScreenUpdating = False
    LastR = Range("C" & Rows.Count).End(xlUp).Row
    If LastR > 9 Then Range("B10:K" & LastR).ClearContents
    With Sheets("NKC")
      '.UsedRange.AutoFilter
      LastR = .Range("C" & Rows.Count).End(xlUp).Row
      If LastR < 2 Then Exit Sub
      Darr = .Range("B2:N" & LastR).Value
    End With
    ReDim Arr(1 To UBound(Darr), 1 To 11)
    Tk = UCase(Trim(CStr(Range("F3"))))
    Ngay = Range("F4")
    SCT = UCase(Trim(CStr(Range("F5"))))
    MaKH = UCase(Trim(CStr(Range("F6"))))
    Dk = Tk & "#" & Ngay & "#" & SCT & "#" & MaKH
    For i = 1 To UBound(Darr)
      Str1 = UCase(Trim(CStr(Darr(i, 9))))
      If Str1 = Tk Then TkBln = True
      If Ngay = "" Then
        Str2 = ""
      Else
          Str2 = Darr(i, 2):    If Str2 = Ngay Then NgayBln = True
      End If
      If SCT = "" Then
        Str3 = ""
      Else
          Str3 = UCase(Trim(CStr(Darr(i, 5)))):    If Str3 = SCT Then SctBln = True
      End If
      If MaKH = "" Then
        Str4 = ""
      Else
          Str4 = UCase(Trim(CStr(Darr(i, 6)))):     If Str4 = MaKH Then MakhBln = True
      End If
      If Str1 & "#" & Str2 & "#" & Str3 & "#" & Str4 = Dk Then
        k = k + 1
        Arr(k, 1) = Trim(Darr(i, 1))
        Arr(k, 2) = Darr(i, 3)
        Arr(k, 10) = Trim(Darr(i, 13))
        For j = 3 To 9
          Arr(k, j) = Trim(Darr(i, j + 2))
        Next j
      End If
    Next i
    If k Then
      Range("B10").Resize(k, 10) = Arr
    Else
      If TkBln = False Then Msg = "Tai Khoan Khong co, "
      If Ngay <> "" And NgayBln = False Then Msg = Msg & "Ngay Khong co, "
      If SCT <> "" And SctBln = False Then Msg = Msg & "So chung tu Khong co, "
      If MaKH <> "" And MakhBln = False Then Msg = Msg & "Ma KH Khong co, "
      MsgBox Msg
    End If
    Application.ScreenUpdating = True
  End If
End Sub
 
Anh ơi, anh có thể chỉ giúp em học thêm Code nữa là: em insert thêm 2 dòng ở ô E7 là Từ ngày và ô E8 là Đến ngày, khi em cần xem từ ngày đến ngày luôn được không ạ. Cụ thể như:
- Tài khoản:
- Ngày lập chứng từ:
- Số chứng từ:
- Mã Khách hàng:
- Từ ngày:
- Đến ngày:

Em cám ơn anh nhiều!
 
Anh ơi, anh có thể chỉ giúp em học thêm Code nữa là: em insert thêm 2 dòng ở ô E7 là Từ ngày và ô E8 là Đến ngày, khi em cần xem từ ngày đến ngày luôn được không ạ. Cụ thể như:
- Tài khoản:
- Ngày lập chứng từ:
- Số chứng từ:
- Mã Khách hàng:
- Từ ngày:
- Đến ngày:

Em cám ơn anh nhiều!
chú ý địa chỉ các ô trong code để tạo ô nhập liệu cho đúng hoặc chỉnh code lại theo file thực tế
Mã:
    Tk = UCase(Trim(CStr(Range("F3")))) 'Tai khoan
    Ngayd = Range("F4") 'Ngay dau
    Ngayc = Range("G4") ' ngay cuoi
    SCT = UCase(Trim(CStr(Range("F5")))) 'so chung tu
    MaKH = UCase(Trim(CStr(Range("F6")))) 'Ma KH
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("$F$3:SFS6")) Is Nothing Then
    Dim Arr(), Darr(), LastR As Long, i As Long, j As Long, k As Long, Dk As String
    Dim Tk As String, Ngayd, Ngayc, SCT As String, MaKH As String, Str1, Str2, Str3, Str4
    Dim TkBln As Boolean, NgayBln As Boolean, Ngay As Boolean, DkNgay As Boolean, SctBln As Boolean, MakhBln As Boolean, Msg As String
    Application.ScreenUpdating = False
    LastR = Range("C" & Rows.Count).End(xlUp).Row
    If LastR > 9 Then Range("B10:K" & LastR).ClearContents
    With Sheets("NKC")
      '.UsedRange.AutoFilter
      LastR = .Range("C" & Rows.Count).End(xlUp).Row
      If LastR < 2 Then Exit Sub
      Darr = .Range("B2:N" & LastR).Value
    End With
    ReDim Arr(1 To UBound(Darr), 1 To 11)
    Tk = UCase(Trim(CStr(Range("F3"))))
    Ngayd = Range("F4")
    Ngayc = Range("G4")
    SCT = UCase(Trim(CStr(Range("F5"))))
    MaKH = UCase(Trim(CStr(Range("F6"))))
    Dk = Tk & "#" & SCT & "#" & MaKH
    If Ngayd = "" And Ngayc = "" Then DkNgay = True
    For i = 1 To UBound(Darr)
      Str1 = UCase(Trim(CStr(Darr(i, 9))))
      If Str1 = Tk Then TkBln = True
      If SCT = "" Then Str2 = "" Else Str2 = UCase(Trim(CStr(Darr(i, 5)))):  If Str2 = SCT Then SctBln = True
      If MaKH = "" Then Str3 = "" Else Str3 = UCase(Trim(CStr(Darr(i, 6)))): If Str3 = MaKH Then MakhBln = True
      If Not DkNgay Then
        Ngay = False
        If Ngayd = "" Then
          If Ngayc >= Darr(i, 2) Then: Ngay = True: NgayBln = True
        Else
          If Ngayc = "" Then
            If Ngayd <= Darr(i, 2) Then: Ngay = True: NgayBln = True
          Else
            If Ngayc >= Darr(i, 2) And Ngayd <= Darr(i, 2) Then: Ngay = True: NgayBln = True
          End If
        End If
      End If
      If Str1 & "#" & Str2 & "#" & Str3 = Dk Then
        If DkNgay Or Ngay Then
          k = k + 1
          Arr(k, 1) = Trim(Darr(i, 1))
          Arr(k, 2) = Darr(i, 3)
          Arr(k, 10) = Trim(Darr(i, 13))
          For j = 3 To 9
            Arr(k, j) = Trim(Darr(i, j + 2))
          Next j
        End If
      End If
    Next i
    If k Then
      Range("B10").Resize(k, 10) = Arr
    Else
      If TkBln = False Then Msg = "Tai Khoan Khong co, "
      If DkNgay = False And NgayBln = False Then Msg = Msg & "Ngay Khong co, "
      If SCT <> "" And SctBln = False Then Msg = Msg & "So chung tu Khong co, "
      If MaKH <> "" And MakhBln = False Then Msg = Msg & "Ma KH Khong co, "
      MsgBox Msg
    End If
    Application.ScreenUpdating = True
  End If
End Sub
 

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

Back
Top Bottom