randaubienghoc
Thành viên mới
- Tham gia
- 28/1/13
- Bài viết
- 25
- Được thích
- 1
Anh/ chị trên diễn đàn GPE 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: https://eport.saigonnewport.com.vn/Pages/Common/Containers_new
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 đính kèm.
* Hình dưới đây mô phỏng 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:
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
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: https://eport.saigonnewport.com.vn/Pages/Common/Containers_new
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 đính kèm.
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. | Y |
CTL | 4/4/2020 15:09 | OUTGATE | | 10/4/2020 15:07 | OUTGATE | Không tìm thấy container. | Y | |
CTL | CGMU9346492 | 4/4/2020 15:09 | OUTGATE | | 10/4/2020 15:07 | OUTGATE | Không tìm thấy container. | N |
* Hình dưới đây mô phỏng 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:
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