Trước hết, chúng ta cùng đồng ý với nhau là việc tính km giữa 02 điểm hay nhiều điểm bất kỳ trên Google Map [miễn là bạn có địa chỉ chính xác và phương thức vận tải phù hợp - tức không đi xe tải ra đảo là được] sẽ thực hiện rất dễ dàng thông qua Google Maps được cung cấp sẵn và miễn phí. Tuy nhiên, bài toán hôm nay tôi đặt ra là bạn cần tìm số km của khoảng 300 quãng đường cùng lúc. Vậy bạn sẽ mất thời gian là bao lâu để vừa lên website vừa nhập liệu, vừa đo lường và vừa ghi nhận lại. Chắc hẳn sẽ tốn khá nhiều thời gian [mà thực ra nhiều người thậm chí nhiều Công ty cung cấp dịch vụ Logistics vẫn làm như vậy hàng ngày].
Liệu có cách làm nào khác hơn không? Chắc chắn là có nhé, bạn hãy theo dõi các bước mà tôi tư duy và tiến hành.
-
Số km được tính trên Google Map mà bạn thấy chính là nhờ 1 hàm API [tạm gọi là hàm "Distance" - khoảng cách] dựa trên địa chỉ mà bạn nhập vào từ đó nó sẽ tính ra kinh độ, vĩ độ và đo lường các điểm với nhau. Nếu vậy ta chỉ cần có hàm API Distance là làm được. Thât may mắn, bạn có thể tìm thấy các API này khi đăng ký tài khoản Console với Google.
-
Bạn phải có tài khoản ngân hàng có giao dịch quốc tế [tôi dùng thẻ VISA] để đăng ký tài khoản với Google thì mới mua được API.
-
-
Excel và VBA là một bộ đôi hoàn hảo để thực hiện việc xử lý từ địa chỉ nhập vào đến việc tính toán số km [dựa trên địa chỉ] thông qua hàm API Distance vừa đề cập ở trên.
-
Tôi không đề cập cách thiết lập VBA cũng như giúp bạn hiểu VBA tại bài viết này. Bạn có thể tìm trên Google nhé hoặc đọc bài viết khác trên website của chúng tôi.
-
-
Dùng 1 file Excel có VBA kết hợp với hàm API bạn sẽ có 1 "tool" lấy được số km [và cả thời gian di chuyển] từ nhiều địa chỉ khác nhau một cách nhanh chóng.
Nào bắt đầu việc thiết lập file Excel và hàm API thôi các bạn!
Trước hết, bạn cần mở VBE của 1 file Excel bất kỳ và copy & paste code sau vào 1 module, sau đó lưu file dưới dạn ".xlsm" hoặc ".xlsb" [để macro hoạt động].
Có 03 code [mỗi code bạn paste vào 1 module], ứng với từng mục đích khác nhau:
Code1 - tính km và thời gian di chuyển
Public Function get_dis_and_time2[origin_address As String, destination_address As String]
Dim surl As String
Dim oXH As Object
Dim bodytxt As String
Dim tim_e As String
Dim distanc_e As String
Dim APIkey As String
APIkey = "xxx" '//developers.google.com/maps/documentation/javascript/get-api-key
surl = "//maps.googleapis.com/maps/api/distancematrix/xml?origins=" & _
Replace[Replace[Replace[origin_address, " ", "+"], ",", "+"], "++", "+"] & _
"&destinations=" & _
Replace[Replace[Replace[destination_address, " ", "+"], ",", "+"], "++", "+"] & _
"&mode=driving&sensor=false&units=metric&key=" & APIkey
Set oXH = CreateObject["msxml2.xmlhttp"]
With oXH
.Open "get", surl, False
.send
bodytxt = .responseText
End With
bodytxt = Right[bodytxt, Len[bodytxt] - InStr[1, bodytxt, ""] - 6]
tim_e = Left[bodytxt, InStr[1, bodytxt, ""] - 1]
bodytxt = Right[bodytxt, Len[bodytxt] - InStr[1, bodytxt, ""] - 6]
distanc_e = Left[bodytxt, InStr[1, bodytxt, ""] - 1]
get_dis_and_time2 = tim_e & " | " & distanc_e
Set oXH = Nothing
End Function
Code2 - Chỉ tính km
Public Function get_dis[origin_address As String, destination_address As String]
Dim surl As String
Dim oXH As Object
Dim bodytxt As String
Dim tim_e As String
Dim distanc_e As String
Dim APIkey As String
APIkey = "xxx" '//developers.google.com/maps/documentation/javascript/get-api-key
surl = "//maps.googleapis.com/maps/api/distancematrix/xml?origins=" & _
Replace[Replace[Replace[origin_address, " ", "+"], ",", "+"], "++", "+"] & _
"&destinations=" & _
Replace[Replace[Replace[destination_address, " ", "+"], ",", "+"], "++", "+"] & _
"&mode=driving&sensor=false&units=metric&key=" & APIkey
Set oXH = CreateObject["msxml2.xmlhttp"]
With oXH
.Open "get", surl, False
.send
bodytxt = .responseText
End With
bodytxt = Right[bodytxt, Len[bodytxt] - InStr[1, bodytxt, ""] - 6]
tim_e = Left[bodytxt, InStr[1, bodytxt, ""] - 1]
bodytxt = Right[bodytxt, Len[bodytxt] - InStr[1, bodytxt, ""] - 6]
distanc_e = Left[bodytxt, InStr[1, bodytxt, ""] - 1]
get_dis = distanc_e / 1000
Set oXH = Nothing
End Function
Code3 - Chỉ tính thời gian
Public Function get_time[origin_address As String, destination_address As String]
Dim surl As String
Dim oXH As Object
Dim bodytxt As String
Dim tim_e As String
Dim distanc_e As String
Dim APIkey As String
APIkey = "xxx" '//developers.google.com/maps/documentation/javascript/get-api-key
surl = "//maps.googleapis.com/maps/api/distancematrix/xml?origins=" & _
Replace[Replace[Replace[origin_address, " ", "+"], ",", "+"], "++", "+"] & _
"&destinations=" & _
Replace[Replace[Replace[destination_address, " ", "+"], ",", "+"], "++", "+"] & _
"&mode=driving&sensor=false&units=metric&key=" & APIkey
Set oXH = CreateObject["msxml2.xmlhttp"]
With oXH
.Open "get", surl, False
.send
bodytxt = .responseText
End With
bodytxt = Right[bodytxt, Len[bodytxt] - InStr[1, bodytxt, ""] - 6]
tim_e = Left[bodytxt, InStr[1, bodytxt, ""] - 1]
get_time = tim_e / 86400
Set oXH = Nothing
End Function
Lưu ý APIkey = "xxx" ==> xxx chính là hàm API mà bạn phải mua từ Google.
Đây là dạng "hàm người dùng tự tạo", bạn có thể tham khảo cách sử dụng trên Google [từ khóa: user defined function]
Đến đây thì việc còn lại là mua 1 hàm API Distance. Nào chúng ta cùng xem cách mua như sau:
- Truy cập vào trang //developers.google.com/maps/documentation/javascript/get-api-key Bạn cần đăng ký 1 tài khoản Cloud Console và 1 tài khoản ngân hàng có thanh toán quốc tế.
- Đăng ký xong tài khoản Cloud Console thì vào đăng ký API như sau:
Và cuối cùng là tạo được 1 API như sau:
Bạn cần chọn vào "Restrict Key" - tìm hiểu thêm trên Google nhé [bước này giúp bạn giới hạn quyền truy vấn của API, tránh bị lạm dụng tài nguyên...]. Thú thực người viết cũng không hoàn toàn hiểu hết API của Google nên bạn tự tìm hiểu giúp nhé.
Và bây giờ chúng ta có 1 API được active như sau:
Thế là xong! Bạn có thể vào file Excel để thử đưa 2 địa chỉ vào 2 ô rồi dùng các hàm tự tạo nêu trên để lấy thông tin. Kết quả chắc chắn sẽ rất nhanh và chính xác nhé [bạn có thể tự kiểm chứng lại bằng cách nhập vào Google Map].
Lưu ý: với hàm API Distance và code VBA mình đang cung cấp là dùng cho Mode "Driving" - tức xe hơi/xe tải nhé. Hàm sẽ ưu tiên chọn đường "chính thống" nhất [cũng có thể sẽ là đường dài nhất] ví dụ như đi qua Quốc Lộ 1A hơn là đi theo đường núi....
Minh họa tính từ Excel:
Minh họa tính từ Google Map