Copy tỷ giá ngoại tệ từ website của 12 tháng

Liên hệ QC

hoamattroicoi

Thành viên gắn bó
Thành viên BQT
Moderator
Tham gia
19/12/10
Bài viết
2,579
Được thích
5,742
Nghề nghiệp
Công nhân vệ sinh số liệu
Em có nhu cầu cần lấy lại toàn bộ tỷ giá của 12 tháng từ ngày 01/01/2015 đến ngày 31/12/2015 từ 2 website :

1. Vietcombank :
https://www.vietcombank.com.vn/exchangerates/default.aspx
2. Eximbank :
https://www.eximbank.com.vn/home/Static/Exchangerate.aspx

Và copy vào 2 sheet VietCombank và Eximbank tương ứng như file đính kèm. Em đang cố gắng tìm cách nào giải pháp nào phù hợp để có thể copy một cách tự động nhưng chưa tìm được nên post bài lên đây. Nếu anh, chị hoặc sư phụ nào có phương án hay thì chia sẻ để em học hỏi với nhé.

Em xin cảm ơn.

HMT.
 

File đính kèm

  • Lay ty gia 12 thang.xlsx
    436.8 KB · Đọc: 75
tôi mới xem trang VietCombank thấy truy vấn chỉ cho phép lấy từng ngày thôi à
hoamattroicoi muốn lấy cả năm chắc chỉ có nước chạy code của từng ngày rồi ... đợi đến khi xong quá . !$@!!!$@!!!$@!!
trong khả năng của mình thì chỉ làm được có vậy , nếu không có ai tham gia cách nào khả quan hơn thì tôi mới bàn tiếp

=========================================================
đây là file lấy dữ liệu của Eximbank tặng các bạn
đối với Vietcombank các bạn xem code ở các bài phía dưới
 

File đính kèm

  • getExim.xlsb
    62.8 KB · Đọc: 114
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn doveandrose,

Nếu mình chạy từng ngày thì code chạy mất khoảng bao nhiêu thời gian để lấy được hết 12 tháng, nếu nhanh hơn làm thủ công thì vẫn tốt doveandrose ạ.

HMT.
 
Upvote 0
Cảm ơn bạn doveandrose,

Nếu mình chạy từng ngày thì code chạy mất khoảng bao nhiêu thời gian để lấy được hết 12 tháng, nếu nhanh hơn làm thủ công thì vẫn tốt doveandrose ạ.

HMT.
Vấn đề này có thể liên quan đến sự thiết lập hiển thị CSDL của nhà quản trị CSDL đó, họ chỉ cho phép chọn theo ngày thôi.
 
Upvote 0
Vấn đề này có thể liên quan đến sự thiết lập hiển thị CSDL của nhà quản trị CSDL đó, họ chỉ cho phép chọn theo ngày thôi.
Em cảm ơn anh,

Em không mong chờ giải pháp hoàn hảo, chỉ mong giảm thiếu tối đa thời gian có thể thôi ạ. Em không biết làm cách nào điều khiển được cái ô nhập ngày trên website đó để mình có thể đứng ở excel gõ ngày thì trang web đó tự load tỷ giá của ngày vừa nhập sau đó mình có thể tự động copy về vị trí mình đã định vị trong file excel tỷ giá ngày đó. Nếu làm được như thế cũng đã đỡ tháo tác với 2 cửa sổ rồi ạ.

Nếu anh có giải pháp gì hay thì chia sẻ cho em học hỏi với ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn anh,

Em không mong chờ giải pháp hoàn hảo, chỉ mong giảm thiếu tối đa thời gian có thể thôi ạ. Em không biết làm cách nào điều khiển được cái ô nhập ngày trên website đó để mình có thể đứng ở excel gõ ngày thì trang web đó tự load tỷ giá của ngày vừa nhập sau đó mình có thể tự động copy về vị trí mình đã định vị trong file excel tỷ giá ngày đó. Nếu làm được như thế cũng đã đỡ tháo tác với 2 cửa sổ rồi ạ.

Nếu anh có giải pháp gì hay thì chia sẻ cho em học hỏi với ạ.

ủa ở trên bạn nói là lấy hết cả năm 2015 mừ , sao xuống đây lại chỉ lấy 1 ngày . híc !$@!!!$@!!!$@!!

bạn cùng làm với tôi nhé , ở đây có 3 Sub
1/sub hello dùng để Post Request đến trang vietcombank

Mã:
Public Sub hello()
Dim doc As Object, req As Object, r As Long, arr(1 To 100000, 1 To 6), k As Long
Dim strData As String, VIEWSTATE As String, VIEWSTATEGENERATOR As String, VIEWSTATEENCRYPTED As String
Dim tcount As Double
tcount = Timer
Set doc = CreateObject("htmlfile")
Set req = CreateObject("Msxml2.XMLHTTP")
getHiddenParam VIEWSTATE, VIEWSTATEGENERATOR, VIEWSTATEENCRYPTED


'42005  42369  :  1/1/2015 -> 31/12/2015
k = 1
For r = 42005 To 42300 Step 1
    strData = "__VIEWSTATE=" & VIEWSTATE & _
          "&__VIEWSTATEGENERATOR=" & VIEWSTATEGENERATOR & _
          "&__VIEWSTATEENCRYPTED=" & VIEWSTATEENCRYPTED & _
          "&ctl00%24Content%24BranchList=[COLOR=#ff0000][B]68[/B][/COLOR]" & _
          "&ctl00%24Content%24DateText=" & WorksheetFunction.EncodeURL(Format(r, "dd/MM/yyyy")) & _
          "&ctl00%24Content%24ViewButton=xem"
    req.Open "POST", "http://www.vietcombank.com.vn/exchangerates/default.aspx", False
    req.setRequestHeader "host", "www.vietcombank.com.vn"
    req.setRequestHeader "Content-Length", Len(strData)
    req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    req.send strData
    doc.body.innerHTML = req.responseText
    getdatafromResponse arr, k, doc
Next


Sheet2.Range("A2").Resize(k, 6).Value = arr
MsgBox Timer - tcount
End Sub

mã số 68 là của Hội Sở chính , các cơ sở khác thì dùng mã số khác

2/sub getHiddenParam để lấy các giá trị ẩn trong trang web để có cái mà gửi Request

Mã:
Private Sub getHiddenParam(outVIEWSTATE As String, outVIEWSTATEGENERATOR As String, outVIEWSTATEENCRYPTED As String)
Dim req As Object, doc As Object
Set req = CreateObject("Msxml2.XMLHTTP")
Set doc = CreateObject("htmlfile")
req.Open "GET", "http://www.vietcombank.com.vn/exchangerates/default.aspx", False
req.send
doc.body.innerHTML = req.responseText
outVIEWSTATE = WorksheetFunction.EncodeURL(doc.getElementById("__VIEWSTATE").Value)
outVIEWSTATEGENERATOR = WorksheetFunction.EncodeURL(doc.getElementById("__VIEWSTATEGENERATOR").Value)
outVIEWSTATEENCRYPTED = WorksheetFunction.EncodeURL(doc.getElementById("__VIEWSTATEENCRYPTED").Value)
End Sub

3/sub getdatafromResponse () dùng để xử lý giá trị nhận về từ Server

Mã:
Private Sub getdatafromResponse(arr, k As Long, doc As Object)
Dim tds As Object, lenTds As Long, r As Long, table As Object, dateCreated As String


Set table = doc.getElementById("ctl00_Content_ExrateView")
dateCreated = table.parentElement.NextSibling.innerText
dateCreated = Mid(dateCreated, InStr(dateCreated, "lúc") + 4, 10)
'MsgBox dateCreated
Set tds = table.getElementsByTagName("td")
lenTds = tds.Length


Do While r + 4 < lenTds
    arr(k, 1) = "'" & dateCreated
    arr(k, 2) = tds.Item(r).innerText
    arr(k, 3) = tds.Item(r + 1).innerText
    arr(k, 4) = tds.Item(r + 2).innerText
    arr(k, 5) = tds.Item(r + 3).innerText
    arr(k, 6) = tds.Item(r + 4).innerText
    r = r + 5: k = k + 1
Loop


End Sub

máy của mình lấy hết cả năm thì hết 2 phút
lưu ý : 1 số ngày , 1 số cơ sở không có dữ liệu
hàm WorksheetFunction.EncodeURL nghe đồn chỉ có từ đời excel 2013 trở lên
bạn có thể vui lòng chỉnh sửa lại theo ý bạn để cộng đồng có tài liệu tham khảo nhé , chúc vui
 
Upvote 0
ủa ở trên bạn nói là lấy hết cả năm 2015 mừ , sao xuống đây lại chỉ lấy 1 ngày . híc !$@!!!$@!!!$@!!

máy của mình lấy hết cả năm thì hết 2 phút
lưu ý : 1 số ngày , 1 số cơ sở không có dữ liệu
hàm WorksheetFunction.EncodeURL nghe đồn chỉ có từ đời excel 2013 trở lên
bạn có thể vui lòng chỉnh sửa lại theo ý bạn để cộng đồng có tài liệu tham khảo nhé , chúc vui

Msgbox là số Giây đúng không bạn "Chim Hồng"? Thấy chạy xong nó báo 65... Vậy là máy mình chạy hơn 1 phút...--=0--=0--=0
Vậy là tuyệt vời rồi!

---------Thử chỉnh ngày lấy tới tận 31/12/2015. Chạy lại thấy...còn có 45 giây, rồi 32 giây....... Chả hiểu chỉnh nhiều hơn lại chạy nhanh hơn...:)
(P/s: trong code bạn ở trên mới để tới ngày 23/10/2015)
 
Lần chỉnh sửa cuối:
Upvote 0
Msgbox là số Giây đúng không bạn "Chim Hồng"? Thấy chạy xong nó báo 65... Vậy là máy mình chạy hơn 1 phút...--=0--=0--=0
Vậy là tuyệt vời rồi!

---------Thử chỉnh ngày lấy tới tận 31/12/2015. Chạy lại thấy...còn có 45 giây, rồi 32 giây....... Chả hiểu chỉnh nhiều hơn lại chạy nhanh hơn...:)
(P/s: trong code bạn ở trên mới để tới ngày 23/10/2015)

thực nghiệm cho thấy truy vấn đến CSDL (MSSQL,MySQL,..) lần sau sẽ nhanh hơn lần trước , lý do tại sao thì tôi không biết , chỉ có các nhà thông thái giải thích , tôi chỉ biết thực nghiệm cho thấy như vậy .
 
Upvote 0
@@@ doveandrose : cảm ơn bạn rất nhiều.

Không phải ý kiến của mình không nhất quán vì nếu lấy được tỷ giá của cả 12 tháng thì giải pháp quá tuyệt vời rồi.
 
Upvote 0
Bạn doveandrose cho mình hỏi : Với ngân hàng Eximbank thì sao ta? Hình như cấu trúc trang web khác nhau thì mình không xài chung code được phải không?

Nếu có thể bạn giúp mình chạy code của Eximbank để mình học hỏi nhé.

Cảm ơn bạn nhiều.
 
Upvote 0
Bạn doveandrose cho mình hỏi : Với ngân hàng Eximbank thì sao ta? Hình như cấu trúc trang web khác nhau thì mình không xài chung code được phải không?

Nếu có thể bạn giúp mình chạy code của Eximbank để mình học hỏi nhé.

Cảm ơn bạn nhiều.
Có một cách khác tự động lấy về Excel mà không cần phải dùng Code hay Excel đâu, không những vậy mà chính xác 1000%, hê hê, có điều code của anh doveandrose siêu quá, nên em rút bớt còn 100% !
 
Lần chỉnh sửa cuối:
Upvote 0
Có một cách khác tự động lấy về Excel mà không cần phải dùng Code hay Excel đâu, không những vậy mà chính xác 1000%, hê hê, có điều code của anh doveandrose siêu quá, nên em rút bớt còn 100% !
Đừng bảo mình là gọi điện xin ngân hàng Vietcombank và Eximbank cung cấp cho nhé. hihi.
 
Upvote 0
hê hê, thấy code của anh doveandrose đỉnh quá nên không dám bàn thêm, chỉnh code của anh ấy xíu là lấy Eximbank khỏe
Mình nghĩ code của người đẹp doveandrose chạy tốt nhưng mình chưa test được vì gia đình vẫn xài đồ cổ 2010 bạn à, đang vận động hành lang nhờ người test hộ. Buồn hết chỗ nói....hix
 
Upvote 0
Mình nghĩ code của người đẹp doveandrose chạy tốt nhưng mình chưa test được vì gia đình vẫn xài đồ cổ 2010 bạn à, đang vận động hành lang nhờ người test hộ. Buồn hết chỗ nói....hix
Tại sao, 2010 chạy bình thường, chắc chưa chọn Tool rồi, vào VBA chọn tool chọn References, chọn MS ...(14.0 hoặc, 16.0 ) Object Library, MS HTML Object Library, MS Interner Controls
rồi chạy thôi
 
Upvote 0
Mình nghĩ code của người đẹp doveandrose chạy tốt nhưng mình chưa test được vì gia đình vẫn xài đồ cổ 2010 bạn à, đang vận động hành lang nhờ người test hộ. Buồn hết chỗ nói....hix

excel 2010 ? lấy cái này về chạy thay cho sub hello , không chắc ăn nhưng cứ thử

Mã:
Public Sub helloHMTC()
Dim doc As Object, req As Object, r As Long, arr(1 To 100000, 1 To 6), k As Long
Dim strData As String, tcount As Double
tcount = Timer
Set doc = CreateObject("htmlfile")
Set req = CreateObject("Msxml2.XMLHTTP")


'42005  42369
k = 1
For r = 42005 To 42369 Step 1
    strData = "__VIEWSTATE=&__VIEWSTATEGENERATOR=&__VIEWSTATEENCRYPTED=" & _
          "&ctl00%24Content%24BranchList=68" & _
          "&ctl00%24Content%24DateText=" & Format(r, "dd%2FMM%2Fyyyy") & _
          "&ctl00%24Content%24ViewButton=xem"
    
    req.Open "POST", "http://www.vietcombank.com.vn/exchangerates/default.aspx", False
    req.setRequestHeader "host", "www.vietcombank.com.vn"
    req.setRequestHeader "Content-Length", Len(strData)
    req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    req.send strData
    doc.body.innerHTML = req.responseText
    getdatafromResponse arr, k, doc
Next


Sheet2.Range("A2").Resize(k, 6).Value = arr
MsgBox Timer - tcount
End Sub
 
Upvote 0
excel 2010 ? lấy cái này về chạy thay cho sub hello , không chắc ăn nhưng cứ thử
Anh doveandrose giỏi vậy, giúp em lấy dữ liệu trang web này được không anh? chỉ cần lấy một hàng duy nhất thôi là em mừng lắm rồi, mò mãi không ra
 
Lần chỉnh sửa cuối:
Upvote 0
hê hê, thấy code của anh doveandrose đỉnh quá nên không dám bàn thêm, chỉnh code của anh ấy xíu là lấy Eximbank khỏe

tôi chưa nhìn ra được chỉnh xíu là chỉnh làm sao đấy bạn . Xin bạn giúp tôi chỉnh xíu để lấy được dữ liệu của Eximbank hoặc nếu không cần dùng code như bạn nói thì quá hay , tôi đang ngoáy lỗ tai và rửa mắt chờ ý kiến của bạn .
 
Upvote 0
Anh doveandrose giỏi vậy, giúp em lấy dữ liệu trang web này được không anh? chỉ cần lấy một hàng duy nhất thôi là em mừng lắm rồi, mò mãi không ra

đây không phải là topic của bạn , nên những câu tương tự như này là vi phạm nội quy , bạn có quyền mở chủ đề mới để hỏi .
 
Upvote 0
tôi chưa nhìn ra được chỉnh xíu là chỉnh làm sao đấy bạn . Xin bạn giúp tôi chỉnh xíu để lấy được dữ liệu của Eximbank hoặc nếu không cần dùng code như bạn nói thì quá hay , tôi đang ngoáy lỗ tai và rửa mắt chờ ý kiến của bạn .
Vâng cái chỉnh thì em chưa chỉnh được ngay, còn lấy dữ liệu em dùng một ứng dụng bên thứ 3 để lấy dữ liệu về dạng Text, save .csv rồi vào Excel xử lí, còn Code của a em nói đỉnh vì lấy trực tiếp vào excel mà ko cần ứng dụng nào mà rất nhanh, em cần học hỏi thêm anh doveandrose nhiều
 
Upvote 0
Web KT
Back
Top Bottom