Nhờ tạo code lấy dữ liệu từ các tờ khai vào file tổng hợp

Liên hệ QC

huevantran

Thành viên chính thức
Tham gia
27/4/22
Bài viết
55
Được thích
42
Em chào các Anh/Chị thành viên GPE,
Hàng ngày em có nhiều tờ khai hải quan cần trích xuất thông tin để kiểm tra và theo dõi, nhờ các Anh/Chị viết code giúp em để có thể chọn nhiều tờ khai và lấy dữ liệu vào file tổng hợp như file mẫu.
Em có đính kèm 4 tờ khai mẫu và 1 file tổng hợp, rất mong nhận được sự giúp đỡ từ các Anh/Chị.


1651046971246.png
 

File đính kèm

  • TK 1.xls
    89 KB · Đọc: 53
  • TK 2.xls
    96.5 KB · Đọc: 29
  • TK 3.xls
    109.5 KB · Đọc: 20
  • TK 4.xls
    98.5 KB · Đọc: 31
  • Tong Hop.xlsx
    11.9 KB · Đọc: 38
Yêu cầu của em có nhiều quá không ạ :)
Nếu được nhờ các Anh/Chị viết code giúp em phần lấy số tờ khai cũng được, mấy cái sau em mò mò làm theo cũng được ạ
 
Upvote 0
Yêu cầu của em có nhiều quá không ạ :)
Nếu được nhờ các Anh/Chị viết code giúp em phần lấy số tờ khai cũng được, mấy cái sau em mò mò làm theo cũng được ạ
Tôi đọc qua rồi bạn chảng bảo lấy như thế nào lấy từ ô nào vào ô nào mà nó có cố định hay không.Bạn phải giải thích rõ ra chứ ai mà đi mò cho bạn được.
 
Upvote 0
Em chào các Anh/Chị thành viên GPE,
Hàng ngày em có nhiều tờ khai hải quan cần trích xuất thông tin để kiểm tra và theo dõi, nhờ các Anh/Chị viết code giúp em để có thể chọn nhiều tờ khai và lấy dữ liệu vào file tổng hợp như file mẫu.
Em có đính kèm 4 tờ khai mẫu và 1 file tổng hợp, rất mong nhận được sự giúp đỡ từ các Anh/Chị.
Mình bập bẹ tập viết code nên mò thử. Bạn xem thử xem có dùng được không nhé. Bạn bấm nút "Tong hop" rồi chọn file tờ khai cần tổng hợp dữ liệu.
 

File đính kèm

  • Tong Hop.xlsm
    25.2 KB · Đọc: 37
Upvote 0
Tôi đọc qua rồi bạn chảng bảo lấy như thế nào lấy từ ô nào vào ô nào mà nó có cố định hay không.Bạn phải giải thích rõ ra chứ ai mà đi mò cho bạn được.
Cảm ơn anh đã chỉ, do em sơ sót không giải thích kỹ. Các tờ khai có bố cục hoàn toàn giống nhau, dữ liệu em cần trích xuất sẽ nằm trong các vùng như bảng ở dưới:

Số Tờ khaiNgày TKTên NCCSố vận đơnSố hóa đơnNgày phát hành hóa đơnTổng trị giá hóa đơn(Phí vận chuyển)Tổng tiềnĐơn vị tiền tệTỷ giá quy đổi sang VNDThuế NKThuế GTGTThuế BVMTSố quản lý nội bộ
E4:K4G8:K8H23:AF23H23:AF23J41:AH41J43:AH43P45:X45L55:U55X70:Z70AB70:AE70H68:K68H70:K70H69:K69K87:T87

Chỉ có mục thuế sẽ không cố định vùng, ví dụ như trong 4 tờ khai em gửi mẫu, có một số tờ khai sẽ có 1 loại thuế, có tờ sẽ có 2, có 3 loại, thậm chí sẽ có những loại tờ khai không có thuế.
Như vậy việc trích xuất cần có điều kiện để có thể điền đúng loại thuế vào trong bảng tổng hợp. Nhờ anh xem giúp em, nếu cần thêm thông tin gì anh phản hồi thêm giúp em với nha.
Em cảm ơn ạ.
Bài đã được tự động gộp:

Mình bập bẹ tập viết code nên mò thử. Bạn xem thử xem có dùng được không nhé. Bạn bấm nút "Tong hop" rồi chọn file tờ khai cần tổng hợp dữ liệu.
Cảm ơn anh đã quan tâm, em có chạy thử thì thấy báo lỗi, có phải bị lỗi tên sheet name không anh, vì ko phải tờ khai nào cũng có tên sheet là TKN.
Và số thuế mỗi tờ khai cũng không theo thứ tự nhất định, nên dữ liệu điền vào file tổng hợp bị lệch cột. Nhờ anh xem giúp em.

1651128642858.png
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh đã quan tâm, em có chạy thử thì thấy báo lỗi, có phải bị lỗi tên sheet name không anh, vì ko phải tờ khai nào cũng có tên sheet là TKN.
Và số thuế mỗi tờ khai cũng không theo thứ tự nhất định, nên dữ liệu điền vào file tổng hợp bị lệch cột. Nhờ anh xem giúp em.
Đúng rồi bạn. Tại mình mới mò thử tờ khai "TK4" theo ví dụ bạn đưa nên không để ý mấy tờ kia. Để mình mò thêm xem. Mình chỉ bập bẹ tập viết thôi nên giải pháp của mình không được tối ưu như của các canh chị đâu.
 
Upvote 0
Trên mỗi tờ khai có số tờ không cố định. Nếu không nói rõ. Ai cũng cứ nghĩ là lấy ở mỗi trang số 1 của mỗi file
 
Upvote 0
Trên mỗi tờ khai có số tờ không cố định. Nếu không nói rõ. Ai cũng cứ nghĩ là lấy ở mỗi trang số 1 của mỗi file
Dạ, 99% thông tin nằm ở trang 1 anh ạ, chỉ có số theo dõi nội bộ nằm ở trang 2.
Mỗi tờ khai đều có ít nhất là 3 trang, nên chỉ cần lấy thông tin ở trang 1 và 2 là được anh ạ.
 
Upvote 0
Cảm ơn anh đã quan tâm, em có chạy thử thì thấy báo lỗi, có phải bị lỗi tên sheet name không anh, vì ko phải tờ khai nào cũng có tên sheet là TKN.
Và số thuế mỗi tờ khai cũng không theo thứ tự nhất định, nên dữ liệu điền vào file tổng hợp bị lệch cột. Nhờ anh xem giúp em.
Bạn xem thử lại nhé. Mình đang để nếu sheet nào ô số tờ khai mà khác rỗng thì lấy dữ liệu thì sheet đó. Thêm 2 cột tên sheet với tên file để bạn biết được số liệu đó lấy từ sheet nào của file nào.
 

File đính kèm

  • Tong Hop.xlsm
    26.8 KB · Đọc: 55
Upvote 0
Em chào các Anh/Chị thành viên GPE,
Hàng ngày em có nhiều tờ khai hải quan cần trích xuất thông tin để kiểm tra và theo dõi, nhờ các Anh/Chị viết code giúp em để có thể chọn nhiều tờ khai và lấy dữ liệu vào file tổng hợp như file mẫu.
Em có đính kèm 4 tờ khai mẫu và 1 file tổng hợp, rất mong nhận được sự giúp đỡ từ các Anh/Chị.
Kiểm tra lại kết quả
Mã:
Sub ABC()
  Dim aDC, aThue, res(), fso As Object, wb As Object
  Dim sRow&, i&, r&, j&, t
 
  aDC = Array("", "E4", "G8", "H23", "D31", "J41", "J43", "P45", "L55", _
              "", "X70", "AB70", "", "", "", "K87") 'X1: tinh tong cot 9,"H68", "H69", "H70"
  aThue = Array("NK", "GT", "MT")
  Application.ScreenUpdating = False
  With Application.FileDialog(msoFileDialogFilePicker)
    .Title = "Chon Cac File to khai"
    .Filters.Add "Excel Files", "*.xls", 1
    .AllowMultiSelect = True
    If .Show Then
      sRow = .SelectedItems.Count
      ReDim res(1 To sRow, 1 To 15)
      For i = 1 To sRow
        Set wb = Workbooks.Open(.SelectedItems(i))
        res(i, 1) = Mid(Range(aDC(1)).Value, 1, 11)
        t = Range(aDC(2)).Value
        res(i, 2) = DateValue(Mid(t, 7, 4) & Mid(t, 3, 4) & Mid(t, 1, 2))
        For j = 3 To 15
          If aDC(j) <> "" Then res(i, j) = Range(aDC(j)).Value
        Next j
        res(i, 5) = Mid(res(i, 5), 5)
        res(i, 6) = DateValue(Mid(res(i, 6), 7, 4) & Mid(res(i, 6), 3, 4) & Mid(res(i, 6), 1, 2))
        If res(i, 7) <> Empty Then res(i, 7) = CDbl(Replace(Replace(res(i, 7), ".", ""), ",", "."))
        If res(i, 8) <> Empty Then res(i, 8) = CDbl(Replace(Replace(res(i, 8), ".", ""), ",", "."))
        res(i, 9) = res(i, 7) + res(i, 8)
        If res(i, 11) <> Empty Then res(i, 11) = CDbl(Replace(Replace(res(i, 11), ".", ""), ",", "."))
        For r = 68 To 73
          If Range("D" & r).Value = Empty Then Exit For
          t = Right(Range("D" & r).Value, 2)
          For j = 0 To 2
            If aThue(j) = t Then
              res(i, 12 + j) = CDbl(Replace(Replace(Range("H" & r).Value, ".", ""), ",", ".")) 'Range("H" & r).Value
              Exit For
            End If
          Next j
        Next r
        wb.Close False
      Next i
    End If
  End With
  i = Range("A" & Rows.Count).End(xlUp).Row
  If i > 10 Then Range("A11:O" & i).ClearContents
  If sRow Then Range("A11").Resize(sRow, 15) = res
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
Bạn xem thử lại nhé. Mình đang để nếu sheet nào ô số tờ khai mà khác rỗng thì lấy dữ liệu thì sheet đó. Thêm 2 cột tên sheet với tên file để bạn biết được số liệu đó lấy từ sheet nào của file nào.
Code em đã có chạy thử, định dạng các số ở dạng text nên tính tổng chưa được anh ạ, em có lấy thử tờ khai số 3 thì thuế GTGT điền vào cột thuế NK. Cảm ơn anh đã nhiệt tình giúp đỡ, em đã học được thêm từ code của anh.

Kiểm tra lại kết quả
Mã:
Sub ABC()
  Dim aDC, aThue, res(), fso As Object, wb As Object
  Dim sRow&, i&, r&, j&, t
 
  aDC = Array("", "E4", "G8", "H23", "D31", "J41", "J43", "P45", "L55", _
              "", "X70", "AB70", "", "", "", "K87") 'X1: tinh tong cot 9,"H68", "H69", "H70"
  aThue = Array("NK", "GT", "MT")
  Application.ScreenUpdating = False
  With Application.FileDialog(msoFileDialogFilePicker)
    .Title = "Chon Cac File to khai"
    .Filters.Add "Excel Files", "*.xls", 1
    .AllowMultiSelect = True
    If .Show Then
      sRow = .SelectedItems.Count
      ReDim res(1 To sRow, 1 To 15)
      For i = 1 To sRow
        Set wb = Workbooks.Open(.SelectedItems(i))
        res(i, 1) = Mid(Range(aDC(1)).Value, 1, 11)
        t = Range(aDC(2)).Value
        res(i, 2) = DateValue(Mid(t, 7, 4) & Mid(t, 3, 4) & Mid(t, 1, 2))
        For j = 3 To 15
          If aDC(j) <> "" Then res(i, j) = Range(aDC(j)).Value
        Next j
        res(i, 5) = Mid(res(i, 5), 5)
        res(i, 6) = DateValue(Mid(res(i, 6), 7, 4) & Mid(res(i, 6), 3, 4) & Mid(res(i, 6), 1, 2))
        If res(i, 7) <> Empty Then res(i, 7) = CDbl(Replace(Replace(res(i, 7), ".", ""), ",", "."))
        If res(i, 8) <> Empty Then res(i, 8) = CDbl(Replace(Replace(res(i, 8), ".", ""), ",", "."))
        res(i, 9) = res(i, 7) + res(i, 8)
        If res(i, 11) <> Empty Then res(i, 11) = CDbl(Replace(Replace(res(i, 11), ".", ""), ",", "."))
        For r = 68 To 73
          If Range("D" & r).Value = Empty Then Exit For
          t = Right(Range("D" & r).Value, 2)
          For j = 0 To 2
            If aThue(j) = t Then
              res(i, 12 + j) = CDbl(Replace(Replace(Range("H" & r).Value, ".", ""), ",", ".")) 'Range("H" & r).Value
              Exit For
            End If
          Next j
        Next r
        wb.Close False
      Next i
    End If
  End With
  i = Range("A" & Rows.Count).End(xlUp).Row
  If i > 10 Then Range("A11:O" & i).ClearContents
  If sRow Then Range("A11").Resize(sRow, 15) = res
  Application.ScreenUpdating = True
End Sub
Cảm ơn anh HieuCD nhiều, code chạy rất chính xác, hy vọng em có thể đọc và hiểu được code của anh, chắc chắn em sẽ học được nhiều. :)
 
Upvote 0
Hay quá anh ơi. Em lại phải ngồi F8 từng dòng rồi học lỏm rồi. hi
Bài này có gì hay (với ổng) vì có nhiều bài phức tạp lắm nhưng ổng giải còn hay hơn nhiều --=0

Bài này bạn chú ý học 3 "chiêu"
1. Dùng Application.FileDialog để mở từng .SelectedItems(i)
2. Dùng array aDC xác định địa chỉ các ô trên tờ khai sẽ lấy thông tin (lưu ý việc dùng các giá trị rỗng trong array)
3. thay dấu chấm bằng rỗng và thay dấu phẩy bằng dấu chấm rồi dùng CDbl để chuyển về kiểu double.
 
Upvote 0
Bài này có gì hay (với ổng) vì có nhiều bài phức tạp lắm nhưng ổng giải còn hay hơn nhiều --=0

Bài này bạn chú ý học 3 "chiêu"
1. Dùng Application.FileDialog để mở từng .SelectedItems(i)
2. Dùng array aDC xác định địa chỉ các ô trên tờ khai sẽ lấy thông tin (lưu ý việc dùng các giá trị rỗng trong array)
3. thay dấu chấm bằng rỗng và thay dấu phẩy bằng dấu chấm rồi dùng CDbl để chuyển về kiểu double.
Rất hay đối với em anh ạ. 1. và 3. thì em hơi hiểu hiểu rồi. Nhưng còn 2. thì em chưa hiểu lắm. Anh giải thích sơ qua giúp em được không ạ?
 
Upvote 0
Rất hay đối với em anh ạ. 1. và 3. thì em hơi hiểu hiểu rồi. Nhưng còn 2. thì em chưa hiểu lắm. Anh giải thích sơ qua giúp em được không ạ?
Tôi không xem file, chỉ đọc code nên tạm giải thích thế này:
1. Vì cần lấy thông tin từ các ô rải rác trên sheet và không thể cù cưa như thuở mới tập viết code được là:
res(i, 1) = Range("H23").Value
res(i, 2) = Range("D31").Value

....
mà phải đặt ra 1 dãy liên tục để chạy trong vòng lặp (ở đây mảng aDC có 16 phần tử)
2. Trong khi chạy vòng lặp để lấy thông tin For j = 3 To 15, bởi do không muốn lấy gì cả vào mảng res ở vị trí j nhất định nên mới đặt ra giá trị rỗng trong mảng aDC ở đúng vị trí ấy, để rồi ở đây mới đặt điều kiện If aDC(j) <> "" Then res(i, j) = Range(aDC(j)).Value
 
Upvote 0
Code em đã có chạy thử, định dạng các số ở dạng text nên tính tổng chưa được anh ạ, em có lấy thử tờ khai số 3 thì thuế GTGT điền vào cột thuế NK. Cảm ơn anh đã nhiệt tình giúp đỡ, em đã học được thêm từ code của anh.


Cảm ơn anh HieuCD nhiều, code chạy rất chính xác, hy vọng em có thể đọc và hiểu được code của anh, chắc chắn em sẽ học được nhiều. :)
Bạn ơi, bạn thử gửi file tổng hợp khi copy code của a. HieuCD chạy có được chưa bạn. Minh tham khảo với mình làm không được.
 
Upvote 0
Kiểm tra lại kết quả
Mã:
Sub ABC()
  Dim aDC, aThue, res(), fso As Object, wb As Object
  Dim sRow&, i&, r&, j&, t
 
  aDC = Array("", "E4", "G8", "H23", "D31", "J41", "J43", "P45", "L55", _
              "", "X70", "AB70", "", "", "", "K87") 'X1: tinh tong cot 9,"H68", "H69", "H70"
  aThue = Array("NK", "GT", "MT")
  Application.ScreenUpdating = False
  With Application.FileDialog(msoFileDialogFilePicker)
    .Title = "Chon Cac File to khai"
    .Filters.Add "Excel Files", "*.xls", 1
    .AllowMultiSelect = True
    If .Show Then
      sRow = .SelectedItems.Count
      ReDim res(1 To sRow, 1 To 15)
      For i = 1 To sRow
        Set wb = Workbooks.Open(.SelectedItems(i))
        res(i, 1) = Mid(Range(aDC(1)).Value, 1, 11)
        t = Range(aDC(2)).Value
        res(i, 2) = DateValue(Mid(t, 7, 4) & Mid(t, 3, 4) & Mid(t, 1, 2))
        For j = 3 To 15
          If aDC(j) <> "" Then res(i, j) = Range(aDC(j)).Value
        Next j
        res(i, 5) = Mid(res(i, 5), 5)
        res(i, 6) = DateValue(Mid(res(i, 6), 7, 4) & Mid(res(i, 6), 3, 4) & Mid(res(i, 6), 1, 2))
        If res(i, 7) <> Empty Then res(i, 7) = CDbl(Replace(Replace(res(i, 7), ".", ""), ",", "."))
        If res(i, 8) <> Empty Then res(i, 8) = CDbl(Replace(Replace(res(i, 8), ".", ""), ",", "."))
        res(i, 9) = res(i, 7) + res(i, 8)
        If res(i, 11) <> Empty Then res(i, 11) = CDbl(Replace(Replace(res(i, 11), ".", ""), ",", "."))
        For r = 68 To 73
          If Range("D" & r).Value = Empty Then Exit For
          t = Right(Range("D" & r).Value, 2)
          For j = 0 To 2
            If aThue(j) = t Then
              res(i, 12 + j) = CDbl(Replace(Replace(Range("H" & r).Value, ".", ""), ",", ".")) 'Range("H" & r).Value
              Exit For
            End If
          Next j
        Next r
        wb.Close False
      Next i
    End If
  End With
  i = Range("A" & Rows.Count).End(xlUp).Row
  If i > 10 Then Range("A11:O" & i).ClearContents
  If sRow Then Range("A11").Resize(sRow, 15) = res
  Application.ScreenUpdating = True
End Sub
Sao không viết ADO hả anh Hiếu.
 
Upvote 0
Sao không viết ADO hả anh Hiếu.
ADO thường dùng cho dữ liệu sơ cấp, các dạng dữ liệu trên 1 cột phải thống nhất, các tờ khai theo dạng báo cáo không phải là dạng dữ liệu nên mình không dùng, mở từng file tuy chậm hơn nhưng yên tâm hơn :)
 
Upvote 0
Bạn ơi, bạn thử gửi file tổng hợp khi copy code của a. HieuCD chạy có được chưa bạn. Minh tham khảo với mình làm không được.
Hiện tại mình đang dùng điện thoại nên không gửi file cho bạn được.
Tuy nhiên mình đoán vấn đề của bạn nằm ở protected View, các tờ khai của bạn nếu đang ở trạng thái này thì sẽ không chạy được nha. Cách làm của mình là tạo 1 thư mục cố định, đánh dấu đó là Trusted Locations, mình sẽ cho tất cả các tờ khai vào đấy và chạy code trên của anh Hiếu.
Bạn thử lại xem nha. Chúc bạn thành công.
 
Upvote 0
Web KT

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

Back
Top Bottom