Tra cứu mã số thuế cá nhân về Excel

thanhphong

Thành viên
Dạ vâng, mọi người xem có cách nào hay thì cứ thực hiện thôi ạ. Vì ban đầu e cũng chưa hiểu được cách thức hoạt động của việc lấy dữ liệu từ HTML nên em mới thiết kế như thế ạ.
Khó đấy, cái web này không khả thi để ứng dụng VBA vào. Có lẽ phải chấp nhận đau thương là làm bằng tay thôi bạn ạ. Nếu trong nhóm có vài người, thì chia việc cho họ làm.
Chứ macro như thế này cũng không giảm thiểu bao nhiêu thời gian, ấy là chưa kể code còn chưa đâu vào với đâu.
 

khanhho

Thành viên mới
Khó đấy, cái web này không khả thi để ứng dụng VBA vào. Có lẽ phải chấp nhận đau thương là làm bằng tay thôi bạn ạ. Nếu trong nhóm có vài người, thì chia việc cho họ làm.
Chứ macro như thế này cũng không giảm thiểu bao nhiêu thời gian, ấy là chưa kể code còn chưa đâu vào với đâu.
Dạ vâng, em cảm ơn mọi người ạ.
 

vbano1

SMod
Thành viên BQT
Lựa chọn trang web này là lựa chọn rất tồi.
Mã:
http://tncnonline.com.vn/Pages/TracuuMST.aspx
Thay vào đó, nếu sử dụng trang web này để tra cứu thì thuận lợi hơn nhiều.
Mã:
https://masothue.vn/
 

Euler

Mod
Thành viên BQT
Với website masothue mà bài viết #23 giới thiệu, tôi khai thác tiếp.
Bạn cần đăng nhập để thấy hình ảnh

1. Tìm đoạn code ứng với ô tìm kiếm.
View source code ta tìm thấy đoạn sau:
Mã:
<input itemprop="query-input" type="text" id="search" class="form-control search-field tax-search-input" dir="ltr" value="" name="q"
Đoạn code VBA để nhập mã chứng minh nhân dân vào ô này là:
Mã:
Set ObjCollection = ie.Document.getElementById("search").Value = "1234567890"
2. Tìm đoạn code ứng với nút click tìm kiếm.
Mã:
<button type="submit" class="btn btn-secondary"><i class="ec ec-search"></i></button>
Vậy đoạn code VBA để thực thi việc click sẽ là:
Mã:
'Click
    For Each oHTML_Element In HTMLDoc.getElementsByClassName("btn btn-secondary")
            oHTML_Element.Click
            Exit For
    Next
Các topic các bạn có thể tham khảo thêm:
 

thanhphong

Thành viên
Theo tôi nếu là website masothue thì không cần rườm rà tìm ô nhập và tìm nút click.
Thực tế giả sử tôi có số chứng minh thư nhân dân là 225409687 :
Thì khi đó tôi chỉ cần truy cập địa chỉ sau là được:
Mã:
https://masothue.vn/Search/?q=225409687&type=identity
Như vậy công việc còn lại chỉ là lấy thông tin có được mà thôi.

Sau khi đã trình bày hướng đi trên, thì nội dung dưới đây không còn cần thiết lắm. Tuy nhiên tôi cung cấp thêm để mang tính tham khảo sau này nếu các bạn cần. Đây là phần code để nhập giá trị vào ô tìm kiếm (nếu các bạn không đi theo hướng trên):
Mã:
For Each oHTML_Element In HTMLDoc.getElementsByName("q")
    oHTML_Element.innerText = "225409687"
    Exit For
Next
 

bvtvba

Thành viên tích cực
Vậy tôi xin được tiếp nối ý tưởng sử dụng web masothue. Sau khi truy cập đường link :
Mã:
https://masothue.vn/Search/?q=225409687&type=identity
Ta sẽ được kết quả theo hai hướng.
Hướng 1: Đối tượng là cá nhân.
Hướng 2: Đối tượng là doanh nghiệp.

Trong trường hợp hướng 1, là cá nhân, ta sẽ được kết quả như sau:
Bạn cần đăng nhập để thấy hình ảnh

Có 7 trường thông tin chúng ta cần lấy, bao gồm họ tên, mã số thuế, địa chỉ, ...

Trường hợp hướng 2, là doanh nghiệp, ta sẽ được kết quả như sau:
Bạn cần đăng nhập để thấy hình ảnh

Có 10 trường thông tin chúng ta cần lấy. Như vậy có sự khác biệt về số trường thông tin so với ở trên.
Điều này sẽ dẫn tới phần code tổng hợp sẽ hơi phức tạp hơn một chút.

Quay trở lại về việc lấy thông tin từ web từ Excel. Sau khi truy cập đường link như đã nói ở trên, các bạn sẽ ra được trang kết quả như hai hình ảnh minh họa ở trên.
View source code ta thấy chúng đều nằm trong class :
Mã:
<table class="table-taxinfo">
Đến đây việc code không còn có khó khăn gì nữa. Vấn đề chỉ còn là thời gian.
 

khanhho

Thành viên mới
Theo tôi nếu là website masothue thì không cần rườm rà tìm ô nhập và tìm nút click.
Thực tế giả sử tôi có số chứng minh thư nhân dân là 225409687 :
Thì khi đó tôi chỉ cần truy cập địa chỉ sau là được:
Mã:
https://masothue.vn/Search/?q=225409687&type=identity
Như vậy công việc còn lại chỉ là lấy thông tin có được mà thôi.

Sau khi đã trình bày hướng đi trên, thì nội dung dưới đây không còn cần thiết lắm. Tuy nhiên tôi cung cấp thêm để mang tính tham khảo sau này nếu các bạn cần. Đây là phần code để nhập giá trị vào ô tìm kiếm (nếu các bạn không đi theo hướng trên):
Mã:
For Each oHTML_Element In HTMLDoc.getElementsByName("q")
    oHTML_Element.innerText = "225409687"
    Exit For
Next
Dạ em nghĩ cũng ko cần form làm j nữa anh ạ, vì nếu lấy từ trang này được thì tạo một list trên excel rồi dùng vòng lặp để lấy lần lượt thôi ạ. Em cám ơn mọi người ạ.
 

khanhho

Thành viên mới
Em làm theo hướng dẫn của bài điều khiển IE bằng VBA ra được đến đây rồi. Nhưng không biết lấy những dòng text như em khoanh vùng về excel như thế nào. Nhờ mọi người hướng dẫn giúp em với ạ.
Em cám ơn mọi người nhiều.
Bạn cần đăng nhập để thấy hình ảnh
 

bvtvba

Thành viên tích cực
Theo cách làm ở , tôi gợi ý như sau:
Bạn cần đăng nhập để thấy hình ảnh

Ở đây tôi ghi tạm nội dung ra cells A1:
Mã:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) 'De su dung duoc ham sleep, chung ta nhat dinh phai khai bao kernel32
Sub truycapweb()

  Dim objIE             As InternetExplorer 'mo trang web duoc chi dinh
  Dim HTMLDoc     As HTMLDocument 'Lay ma html cua trang web duoc mo
  Dim oHTML_Element     As IHTMLElement
  Dim timeOut           As Date
  Dim s                 As String

  'Tao object IE
  Set objIE = CreateObject("InternetExplorer.Application")


  'Hien thi trinh duyet IE
  objIE.Visible = True

  'Truy cap dia chi web
  lktem = "https://masothue.vn/Search/?q=225409687&type=identity"
  objIE.navigate lktem

  'Chung ta mong muon trang web duoc load hoan toan trong 20s. Cac ban co the chinh lai thong so nay
  timeOut = Now + TimeSerial(0, 0, 5)

  Do While objIE.Busy = True Or objIE.readyState <> 4
    DoEvents
    Sleep 1
    If Now > timeOut Then
      objIE.Refresh
      timeOut = Now + TimeSerial(0, 0, 5)
    End If
  Loop
  'Chung ta mong muon trang web duoc load hoan toan trong 5s. Cac ban co the chinh lai thong so nay
  timeOut = Now + TimeSerial(0, 0, 5)

  Do While objIE.document.readyState <> "complete"
    DoEvents
    Sleep 1
    If Now > timeOut Then
      objIE.Refresh
      timeOut = Now + TimeSerial(0, 0, 5)
    End If
  Loop
  sens = False
  Set HTMLDoc = objIE.document
  'lan thu nhat
  s = ""
  For Each oHTML_Element In HTMLDoc.getElementsByClassName("table-taxinfo")
    s = oHTML_Element.outerHTML
    Exit For
  Next
    ThisWorkbook.Sheets(1).Cells(1, 1) = s

   objIE.Quit
   Set objIE = Nothing
End Sub
Nếu lấy nội dung này copy cho ra file notepad, lưu thành abc.html (chú ý lưu định dạng UTF-8). Ta sẽ được:
Bạn cần đăng nhập để thấy hình ảnh


Bây giờ chỉ cần record macro thao tác bằng tay là sẽ thu được code.
Bạn cần đăng nhập để thấy hình ảnh

Nhập địa chỉ web vào như dưới đây và ấn nút import:
Bạn cần đăng nhập để thấy hình ảnh

Kết quả:
Bạn cần đăng nhập để thấy hình ảnh


Cụ thể thao tác import bằng tay ở trên sau khi record code VBA thì thu được là:
Mã:
Sub Macro1()
'
' Macro1 Macro
'

'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;file:///C:/Users/user/Desktop/abc.html", Destination:=Range("$A$1"))
        .CommandType = 0
        .Name = "abc_1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub
Như vậy bài toán từ web chuyển thành xử lý dữ liệu trên Excel. Đến đây bài toán trở nên đơn giản.
 

Euler

Mod
Thành viên BQT
Phần code lưu thành html dưới dạng UTF-8:
Mã:
'Tao file html
's la noi dung file html
'lktem la duong link file html, vd: C:\VBA\1.html'
Sub CreatehtmlFile(ByVal s As String, ByVal lktem As String)
 
    Dim FSO As Object
    Dim myFile
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set myFile = FSO.CreateTextFile( _
                    Filename:=lktem, _
                    overwrite:=True, _
                    Unicode:=True)
    
    myFile.write s
 
    myFile.Close
    Set FSO = Nothing
End Sub
 

khanhho

Thành viên mới
Có cách nào để mình lấy trực tiếp từng dòng dữ liệu trong TD Class mà ko cần phải lưu thành html ko anh?
 

Euler

Mod
Thành viên BQT
@khanhho : Bạn tham khảo . Bằng cách chỉ định chính xác phần tử thứ bao nhiêu trong collection, bạn có thể lấy trường thông tin mong muốn.
Tuy nhiên làm việc với Excel sẽ dễ hình dung và dễ thao tác hơn, vì vậy trích xuất thông tin từ web ra trang html chứa thông tin cần thiết, rồi import ngược thì dễ làm hơn.
 
Top