Lấy dữ liệu từ Web vào Excel (chỉ chạy cho một số dòng theo tiêu chí & lỗi lặp dữ liệu) / Scraping data from Web to Excel

Trạng thái
Không mở trả lời sau này.

randaubienghoc

Yêu THVBA
Anh/ chị trên diễn đàn thân mến,

Em rất mong được anh/ chị gỡ rối giúp em về 2 vấn đề trong lập trình VBA khi chạy lấy dữ liệu từ web:
vào Excel, với mục đích tự động lấy thông tin theo dõi container về cảng Cát Lái, hỗ trợ việc theo dõi thông tin hàng hóa về cảng, lĩnh vực xuất nhập khẩu.

* Bảng dưới đây từ file Excel là kết quả chạy macro để lấy dữ liệu về thời gian, vị trí, sự kiện của mỗi container trong cột Container. Chi tiết như file:

PortContainerEvent time1Event type1Location1Event time2Event type2Tim thay cont?Status
CTLCMAU01170285/4/2020 7:46UNLOAD000.00.0010/4/2020 15:07OUTGATETìm thấy 1 container.N
CTLTEMU33113204/4/2020 15:09OUTGATE10/4/2020 15:07OUTGATETìm thấy 1 container.Y
CTL4/4/2020 15:09OUTGATE10/4/2020 15:07OUTGATEKhông tìm thấy container.Y
CTLCGMU93464924/4/2020 15:09OUTGATE10/4/2020 15:07OUTGATEKhông tìm thấy container.N

* Dữ liệu từ web, nếu nhập thủ công theo các bước tra cứu thông tin container: 1- chọn khu vực cảng Cát Lái, 2- nhập thông tin số container, 3- bỏ chọn mục "chỉ vòng luân chuyển cuối", 4- click chọn "Tìm kiếm", 5- lấy dữ liệu liên quan (thời gian, vị trí, sự kiện) từ bảng dữ liệu.


Hiện tại code đã chạy lấy dữ liệu được, tuy nhiên còn gặp phải 2 vấn đề:

1/ Để giảm tải thời gian chạy macro cho những container đã kết thúc theo dõi tương ứng dữ liệu "Status: Y", chỉ chạy macro tìm kiếm container và lấy dữ liệu từ web với "Status: N" trong Excel. Em đã viết code điều kiện "if... then..." mà macro vẫn chạy hết cho tất cả các dòng. Như vậy nếu nhiều dòng mà chạy từ đầu sẽ rất mất thời gian.
2/ Hiện tại em gặp trường hợp nếu bị dữ liệu từ web trống nhưng khi chạy macro về, dữ liệu bị lặp từ thông tin dòng trước đó. Ví dụ sự kiện "4/4/2020 15:09" bị lặp từ dòng 2.

Rất mong anh/ chị có thể hướng dẫn giúp em, vì tự tìm tòi học hỏi trên mạng nên có nhiều vấn đề chưa được hiểu sâu.

Em xin cảm ơn.

Dương
Mobile/ Zalo: +84-35 273 6558
Skype: ran_dau_bieng_hoc
Mail: nguyenminhduong49@gmail.com

P/S: code được viết như trong file Excel đính kèm hoặc như dưới đây:

Mã:
Sub PullDataFromWeb()


Dim IE As Object

Dim doc As HTMLDocument

Dim lastRow As Integer


Set IE = CreateObject("InternetExplorer.Application")

IE.Visible = True 'hien cua so IE

IE.navigate "https://eport.saigonnewport.com.vn/Pages/Common/Containers_new"


Do While IE.Busy Or IE.readyState <> 4 'doi IE chay xong

Application.Wait DateAdd("s", 1, Now)

Loop


Set doc = IE.document



With ActiveSheet

lastRow = .Range("B" & .Rows.Count).End(xlUp).Row 'dong cuoi cung trong cot B container

End With


On Error Resume Next


For intRow = 2 To lastRow 'tu dong toi dong


Dim rng As Range

Set rng = Range("I2:I" & lastRow)

For Each cell In rng

If cell.Value = "Y" Then


End If

Next cell



IE.document.getElementById("txtItemNo_I").Value = ThisWorkbook.Sheets("Sheet1").Range("B" & intRow).Value 'so cont

doc.getElementById("cbSite_VI").Value = "CTL" 'cang Cat Lai CTL

doc.getElementById("chkInYard_I").Checked = False

doc.getElementById("ContentPlaceHolder2_btnSearch").Click 'click Search


Do While IE.Busy Or IE.readyState <> 4

Application.Wait DateAdd("s", 1, Now)

Loop

strFindContainer = doc.getElementById("ContentPlaceHolder2_lblNotice").innerText

ThisWorkbook.Sheets("Sheet1").Range("H" & intRow).Value = strFindContainer


strEventtime1 = doc.getElementById("grdContainer_DXDataRow0").Cells(0).innerText

strEventtype1 = doc.getElementById("grdContainer_DXDataRow0").Cells(1).innerText

strLocation1 = doc.getElementById("grdContainer_DXDataRow0").Cells(2).innerText


strEventtime2 = doc.getElementById("grdContainer_DXDataRow1").Cells(0).innerText

strEventtype2 = doc.getElementById("grdContainer_DXDataRow1").Cells(1).innerText


ThisWorkbook.Sheets("Sheet1").Range("C" & intRow).Value = strEventtime1

ThisWorkbook.Sheets("Sheet1").Range("D" & intRow).Value = strEventtype1

ThisWorkbook.Sheets("Sheet1").Range("E" & intRow).Value = strLocation1


ThisWorkbook.Sheets("Sheet1").Range("F" & intRow).Value = strEventtime2

ThisWorkbook.Sheets("Sheet1").Range("G" & intRow).Value = strEventtype2


Do While IE.Busy Or IE.readyState <> 4

Application.Wait DateAdd("s", 1, Now)

Loop


Next


IE.Quit

Set IE = Nothing 'Cleaning up

Set objElement = Nothing

Set objCollection = Nothing

Application.StatusBar = ""

Application.DisplayAlerts = True



End Sub
 

tuhocvba

Administrator
Thành viên BQT
Bạn có thể bớt chút thời gian để trình bày lại cho dễ hiểu không ạ?
  • Nếu bạn không biết cách upload ảnh lên diễn đàn, bạn vui lòng tham khảo topic sau: .
  • Bạn lưu ý phải sử dụng thẻ Code khi viết code trên forum. Xin xem mục 4 trong . Lần này tôi đã sửa lại bài viết cho bạn rồi. Bạn bỏ qua mục này.
  • Bạn nên có file demo. Bạn có thể upload file lên google drive hoặc mediafire.com rồi dẫn link về diễn đàn.

Một bài viết trình bày dễ hiểu là một bài viết sử dụng hình minh họa trực quan. Một bài viết chỉ toàn chữ sẽ khiến người khác không muốn đọc.

1. Trang này có phải đăng ký tài khoản không bạn?
2. Mình truy cập nhưng có thấy mục nào ghi là cảng Cát Lái đâu nhỉ.
Bạn cần đăng nhập để thấy hình ảnh


Muốn code cho web thì người code cần biết cái web đó như nào. Thông tin thao tác thủ công của bạn, không giúp chúng tôi tái hiện được thao tác bằng tay (Tên cảng không tìm thấy, mã Container không biết nhập vào đó là gì để ra dữ liệu). Do đó không thể hỗ trợ code được.
 

Euler

Administrator
Thành viên BQT
1-Bạn nên chụp cái ảnh minh họa như thế này để chúng tôi hình dung cách tìm kiếm.
Bạn cần đăng nhập để thấy hình ảnh

Mọi người rất ngại đọc chữ, nên đứng trên lập trường người đọc để cung cấp thông tin dễ hiểu.

2-Bạn nên upload file macro của bạn lên mediafire hoặc google drive (chú ý nén lại trước khi upload), rồi kéo link về đây.
3-Như thế nào là trạng thái N, Y-thể hiện ở đâu. Nhìn vào kết quả của web, tôi thực sự không hiểu Y và N là ở cột nào. Tôi cũng không muốn đoán, bạn nên chỉ rõ ra.
 
T

thanhphong

Guest
Sau khi viết bài trên diễn đàn thì không thấy chủ topic đâu nữa. Có lẽ bạn ấy nghĩ mình đã để lại mail, zalo-ai cần thì sẽ liên lạc. Cứ như thể là mọi người cần cậu ta, còn cậu ta không cần mọi người.
Vài lời với chủ topic:
-Code cho web đôi khi không yêu cầu tốc độ được. Lấy tự động cho là tốt rồi, trong thời gian đó bạn có thể làm việc khác. Cứ ưu tiên lấy được dữ liệu về Excel đi đã.
-Việc dữ liệu trùng hay không hợp lệ, thì có thể xử lý bằng code trên Excel sau. Việc này đơn giản hơn lấy dữ liệu từ web về.
-Ý kiến nho nhỏ: Lấy dữ liệu từ web về thì không mới. Sử dụng IE cũng không mới. Nhưng trước khi tuhocvba.net ra đời, tôi chưa thấy ai ở VN làm vậy. Thậm chí trên diễn đàn toàn thầy với chuyên gia, có người còn chê cách làm này.
Có thể nói, trang web đầu tiên ở VN hệ thống kiến thức này ra tiếng việt chính là tuhocvba.net .
Tôi đếm thì có đến mấy topic trên diễn đàn, khi nhờ vả thì đều nói chung một kiểu "sau khi tham khảo internet thì em đã làm được...", sao các bạn không nói rõ cái internet đó là cái trang nào.
.
.

Và lạ nhất là, các nick vừa mới tham gia đã vào hỏi luôn về IE, cứ như thể biết rõ khả năng của diễn đàn là sẽ hỗ trợ được.
 

randaubienghoc

Yêu THVBA
Dạ xin lỗi mọi người về việc trình bày chưa rõ ràng ạ.
Em xin gửi lại link file Excel:

Hiện tại em đã khắc phục được vấn đề 1, nhưng còn vấn đề 2 về việc dữ liệu bị lặp thì chưa khắc phục được, ví dụ dữ liệu Eventime 2 "10/4/2020 15:07" bị lặp cho thông tin container 2 "TEMU3311320" (lặp từ container 1 "CMAU0117028") trong khi thực chất container 2 không có dữ liệu Eventime 2.

Port​
Container​
Event time1​
Event type1​
Location1​
Event time2​
Event type2​
Tim thay cont?​
Status​
CTL​
CMAU0117028​
5/4/2020 7:46​
UNLOAD​
000.00.00​
10/4/2020 15:07
OUTGATE​
Tìm thấy 1 container.​
N​
CTL​
TEMU3311320​
4/4/2020 15:09​
OUTGATE​
10/4/2020 15:07
OUTGATE​
Tìm thấy 1 container.​
N​
CTL​
N​
CTL​
CGMU9346492​
Không tìm thấy container.​
N​
CTL​
DFSU1071316​
Y​
CTL​
HDMU2871651​
1/4/2020 21:34​
INGATE​
009.02.82​
9/4/2020 5:39​
LOAD​
Tìm thấy 1 container.​
N​
 

randaubienghoc

Yêu THVBA
Bạn cần đăng nhập để thấy đa phương tiện
Như hình ảnh chụp từ web, sau khi nhập đầy đủ các thông tin, chọn Port (cảng Cát Lái), điền số container "TEMU3311320", bỏ chọn mục "Chỉ vòng luân chuyển cuối" thì sẽ ra bảng dữ liệu. Bảng dữ liệu này được trích lấy thông tin về Excel như bảng trên (Event time, Event type, Location...).
 

giaiphapvba

Administrator
Thành viên BQT
Thành viên này đã viết yêu cầu trên hai website cùng lúc. Vì vậy diễn đàn không hỗ trợ topic này.
 
Trạng thái
Không mở trả lời sau này.
Top