Chào mọi người,em muốn đoạn code đứng từ máy tính A lấy thông tin ngày tháng năm giờ phút của một máy tính B trong cùng hệ thống mạng, mọi người xem giúp em với.
Nếu IP thay đổi liên tục thì có thể thử dùng computer name. Cứ thử bừa đi, có cái gì nổ hay cháy đâu mà sợ. Computer name là gì? Vd. trong Windows 10 tôi phải chuột và chọn Properties thì sẽ nhìn thấy computer name. Giả sử computer name = hichic-blala
Tôi chưa bao giờ phải thực hành nên không biết sẽ thế nào. Nhưng về mặt lý thuyết nếu là tôi thì tôi sẽ: mở CMD (dòng lệnh) -> gõ
net time \\hichic-blala -> ENTER
Nếu có IP tĩnh thì thử tiếp nhưng thay cho hichic-blala thì nhập IP.
Trước hết hãy thử thế xem nó ra cái gì, mặt mũi ra sao. Sau đó muốn hỏi gì thì hỏi tiếp.
A chú!ý của cháu là cháu cần đoạn code lấy ngày giờ nghĩa là chạy code là nó lấy được thông tin ngày giờ của máy tính theo địa chỉ IP nhập vào rồi đổ xuống ô nào đó chẳng hạn.
Chứ vào CMD xong phải làm thế thì bất tiện quá chú ơi.
A chú!ý của cháu là cháu cần đoạn code lấy ngày giờ nghĩa là chạy code là nó lấy được thông tin ngày giờ của máy tính theo địa chỉ IP nhập vào rồi đổ xuống ô nào đó chẳng hạn.
Chứ vào CMD xong phải làm thế thì bất tiện quá chú ơi.
Vâng thế chú cho cháu xin đoạn code để thực hiện câu lệnh: net time \\192.168.252.2
Trong cửa sổ cmd thay vì cháu phải vào cửa sổ cmd để gõ câu lệnh này.
Thông tin lấy được sẽ gán vào ô nào đó trên bảng tính.
Vâng thế chú cho cháu xin đoạn code để thực hiện câu lệnh: net time \\192.168.252.2
Trong cửa sổ cmd thay vì cháu phải vào cửa sổ cmd để gõ câu lệnh này.
Thông tin lấy được sẽ gán vào ô nào đó trên bảng tính.
Function ngaygio(ByVal computer As String) As String
Dim sCmd As String, tmpFile As String, text As String, fso As Object, sh As Object, re As Object
Set sh = CreateObject("Wscript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set re = CreateObject("VBScript.RegExp")
tmpFile = ThisWorkbook.Path & "\" & Format(Time, "hh_mm_ss") & ".txt"
sCmd = "net time \\" & computer & ">" & tmpFile
sh.Run "cmd /c " & sCmd, 0, True
text = fso.OpenTextFile(tmpFile).ReadLine
fso.DeleteFile tmpFile
re.Pattern = ".*(.{10} \d{2}:\d{2}:\d{2}).*"
ngaygio = re.Replace(text, "$1")
Set sh = Nothing
Set fso = Nothing
Set re = Nothing
End Function
Sub test()
Dim ngaythang As String
ngaythang = ngaygio("desktop-13iclt9")
Sheet1.Range("A1").Value = CDate(ngaythang)
End Sub
Function ngaygio(ByVal computer As String) As String
Dim sCmd As String, tmpFile As String, text As String, fso As Object, sh As Object, re As Object
Set sh = CreateObject("Wscript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set re = CreateObject("VBScript.RegExp")
tmpFile = ThisWorkbook.Path & "\" & Format(Time, "hh_mm_ss") & ".txt"
sCmd = "net time \\" & computer & ">" & tmpFile
sh.Run "cmd /c " & sCmd, 0, True
text = fso.OpenTextFile(tmpFile).ReadLine
fso.DeleteFile tmpFile
re.Pattern = ".*(.{10} \d{2}:\d{2}:\d{2}).*"
ngaygio = re.Replace(text, "$1")
Set sh = Nothing
Set fso = Nothing
Set re = Nothing
End Function
Sub test()
Dim ngaythang As String
ngaythang = ngaygio("desktop-13iclt9")
Sheet1.Range("A1").Value = CDate(ngaythang)
End Sub
Function ngaygio(ByVal computer As String) As String
Dim sCmd As String, tmpFile As String, text As String, fso As Object, sh As Object, re As Object
Set sh = CreateObject("Wscript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set re = CreateObject("VBScript.RegExp")
tmpFile = ThisWorkbook.Path & "\" & Format(Time, "hh_mm_ss") & ".txt"
sCmd = "net time \\" & computer & ">" & tmpFile
sh.Run "cmd /c " & sCmd, 0, True
text = fso.OpenTextFile(tmpFile).ReadLine
fso.DeleteFile tmpFile
re.Pattern = ".*(.{10} \d{2}:\d{2}:\d{2}).*"
ngaygio = re.Replace(text, "$1")
Set sh = Nothing
Set fso = Nothing
Set re = Nothing
End Function
Sub test()
Dim ngaythang As String
ngaythang = ngaygio("desktop-13iclt9")
Sheet1.Range("A1").Value = CDate(ngaythang)
End Sub
99,99% trong trường hợp này nguyên nhân như tôi viết ở bài #14. Nếu code chạy trong tập tin đã được lưu thì tmpFile có đường dẫn đầy đủ và sẽ không có lỗi gì cả. Trong thư mục chứa tập tin Excel chắc chắn có thể tạo các tập tin mới. Nếu không có quyền đó thì bản thân tập tin Excel cũng không thể lưu được trong thư mục.
Truy cập không cho phép vì
C:\Users\DESKTOP-L8C0O6S>net time \\192.168.25.2>\10_23_02.txt
Rõ ràng \10_23_02.txt không là đường dẫn đầy đủ nên có lỗi, hoăc trong trường hợp \... thì Windows có thể coi là thư mục C:\. Trong Windows 10 thì mặc định C:\ sẽ có Access is denied.
Chắc chắn sau khi lưu tập tin thì tmpFile có đường dẫn đầy đủ và không còn lỗi nữa. Bản thân tôi cũng kiểm tra thấy:
Nhưng nếu tôi dán code vào tập tin mới chưa lưu, tức ThisWorkbook.Path = RỖNG thì khi chạy code có lỗi File not found trong code. Và khi gõ trong cmd
net time \\.... >\hichic.txt
thì có Access is denied.
Cái này ai cũng có thể kiểm tra mà.
Làm như sau: mở tập tin mới -> dán code bài #11 -> không lưu tập tin mới mà chạy luôn code test -> đảm bảo 100% là sẽ có lỗi như bài #13 -> lưu lại tập tin Excel -> chạy lại code test -> đảm bảo 100% là sẽ KHÔNG còn lỗi
99,99% trong trường hợp này nguyên nhân như tôi viết ở bài #14. Nếu code chạy trong tập tin đã được lưu thì tmpFile có đường dẫn đầy đủ và sẽ không có lỗi gì cả. Trong thư mục chứa tập tin Excel chắc chắn có thể tạo các tập tin mới. Nếu không có quyền đó thì bản thân tập tin Excel cũng không thể lưu được trong thư mục.
Truy cập không cho phép vì
C:\Users\DESKTOP-L8C0O6S>net time \\192.168.25.2>\10_23_02.txt
Rõ ràng \10_23_02.txt không là đường dẫn đầy đủ nên có lỗi, hoăc trong trường hợp \... thì Windows có thể coi là thư mục C:\. Trong Windows 10 thì mặc định C:\ sẽ có Access is denied.
Chắc chắn sau khi lưu tập tin thì tmpFile có đường dẫn đầy đủ và không còn lỗi nữa. Bản thân tôi cũng kiểm tra thấy:
Nhưng nếu tôi dán code vào tập tin mới chưa lưu, tức ThisWorkbook.Path = RỖNG thì khi chạy code có lỗi File not found trong code. Và khi gõ trong cmd
net time \\.... >\hichic.txt
thì có Access is denied.
Cái này ai cũng có thể kiểm tra mà.
Làm như sau: mở tập tin mới -> dán code bài #11 -> không lưu tập tin mới mà chạy luôn code test -> đảm bảo 100% là sẽ có lỗi như bài #13 -> lưu lại tập tin Excel -> chạy lại code test -> đảm bảo 100% là sẽ KHÔNG còn lỗi
Cảm ơn chú nhiều, hiện tại cháu cũng chưa test được nên cháu hỏi thêm một ý nữa. Vậy sửa thế này máy của chú đọc ngon chứ vì máy của chú đang khác của cháu và sửa như vậy liệu system ở mỗi máy khác nhau ngày trước tháng sau hay tháng trước ngày sau, 1 số hoặc 2 số v.v.. thì có vấn đề gì không chú?
Cảm ơn chú nhiều, hiện tại cháu cũng chưa test được nên cháu hỏi thêm một ý nữa. Vậy sửa thế này máy của chú đọc ngon chứ vì máy của chú đang khác của cháu và sửa như vậy liệu system ở mỗi máy khác nhau ngày trước tháng sau hay tháng trước ngày sau, 1 số hoặc 2 số v.v.. thì có vấn đề gì không chú?
Ta thử lần cuối. Nếu không thành công thì bạn chờ người khác, hoặc lập chủ đề mới.
Để khỏi rắc rối ta không dùng NET TIME nữa, ta thử dùng WMI. Không phải lăn tăn chuyện ngày hay tháng trước, vì ta nhận được ngày tháng năm giờ phút giây riêng rẽ. ngaygioWMI trả về Double là ngày tháng + thời gian. Nếu chỉ lấy ngày tháng thì lấy phần nguyên, nếu chỉ lấy thời gian thì lấy phần thập phân.
Mã:
Function ngaygioWMI(ByVal computer As String) As Double
Dim wmi As Object, items As Object, item As Object
Set wmi = GetObject("winmgmts:\\" & computer & "\root\cimv2")
Set items = wmi.ExecQuery("Select * from Win32_LocalTime")
For Each item In items
ngaygioWMI = DateSerial(item.Year, item.Month, item.Day) + TimeSerial(item.Hour, item.Minute, item.Second)
Exit For
Next
End Function
Sub test()
Dim ngaythang As Double
ngaythang = ngaygioWMI("desktop-13iclt9")
Sheet1.Range("A1").Value = CDate(ngaythang)
End Sub
Ta thử lần cuối. Nếu không thành công thì bạn chờ người khác, hoặc lập chủ đề mới.
Để khỏi rắc rối ta không dùng NET TIME nữa, ta thử dùng WMI. Không phải lăn tăn chuyện ngày hay tháng trước, vì ta nhận được ngày tháng năm giờ phút giây riêng rẽ. ngaygioWMI trả về Double là ngày tháng + thời gian. Nếu chỉ lấy ngày tháng thì lấy phần nguyên, nếu chỉ lấy thời gian thì lấy phần thập phân.
Mã:
Function ngaygioWMI(ByVal computer As String) As Double
Dim wmi As Object, items As Object, item As Object
Set wmi = GetObject("winmgmts:\\" & computer & "\root\cimv2")
Set items = wmi.ExecQuery("Select * from Win32_LocalTime")
For Each item In items
ngaygioWMI = DateSerial(item.Year, item.Month, item.Day) + TimeSerial(item.Hour, item.Minute, item.Second)
Exit For
Next
End Function
Sub test()
Dim ngaythang As Double
ngaythang = ngaygioWMI("desktop-13iclt9")
Sheet1.Range("A1").Value = CDate(ngaythang)
End Sub
Cảm ơn chú rất nhiều,các làm này thì cháu thấy chuẩn và khả thi hơn cách trước nhiều.
Nhưng cháu thử chạy thì có vấn đề như sau, nếu chú biết nguyên nhân chỉ giúp cháu cách khắc phục với:
Cháu chạy net time như bài 11 thì không lỗi, như vậy là mạng có thông.
Cảm ơn chú rất nhiều,các làm này thì cháu thấy chuẩn và khả thi hơn cách trước nhiều.
Nhưng cháu thử chạy thì có vấn đề như sau, nếu chú biết nguyên nhân chỉ giúp cháu cách khắc phục với:
Cháu chạy net time như bài 11 thì không lỗi, như vậy là mạng có thông.
Chú ơi,cháu đã thử thay địa chỉ IP bằng tên máy tính, với câu lệnh Net Time thì OK, nhưng với câu lệnh WMI thì lỗi "Permission denied",chú xem có cần điều chỉnh gì thêm không?
Chú ơi,cháu đã thử thay địa chỉ IP bằng tên máy tính, với câu lệnh Net Time thì OK, nhưng với câu lệnh WMI thì lỗi "Permission denied",chú xem có cần điều chỉnh gì thêm không? View attachment 267130
Dùng IP 127.0.0.1 xem có được không( địa chỉ này là ko của chính máy chạy code. Ko được là code cần chỉnh lại). Hình như phải cấu hình bên máy kia mới được
Chú ơi,cháu đã thử thay địa chỉ IP bằng tên máy tính, với câu lệnh Net Time thì OK, nhưng với câu lệnh WMI thì lỗi "Permission denied",chú xem có cần điều chỉnh gì thêm không?