Hàm nào lấy thông số CPU hay thông số ổ đĩa hay thông số gì đó tương tự???

Liên hệ QC
Vọc chơi thôi chứ thú thật là tôi chưa hiểu hết về WMI đâu

Cái này không liên quan gì tới WMI

Nguyên văn bởi tintam7251
Vòng lặp For Each objItem... duyệt và lấy S/N của cả 2 ổ cứng. Đoạn code thật ngắn gọn và hiệu quả. Tuy nhiên, có chỗ mình chưa hiểu lắm. Tại sao nó lặp 3 lần?
Không phải là vòng lặp For được lặp lại 3 lần mà hàm được gọi 3 lần.

Bạn hãy thay GetDiskSN = Trim(tmp) bằng Debug.Print Trim(tmp)

1. Khi bạn chạy code trong VBE (Run) thì bạn sẽ có 1 dòng số
2. Bạn thêm nút để kích hoạt macro GetDiskSN. Khi bạn Click nút thì bạn cũng chỉ có 1 dòng số.
3. Nếu trong sheet bạn chọn 1 cell và chọn Insert Function rồi chọn GetDiskSN (tức công thức cho cell là =GetDiskSN) thì sau khi hoàn tất bạn có 3 dòng số.

Như vậy Excel đã gọi hàm GetDiskSN 3 lần khi bạn nhập công thức vào cell. Điều này chứng tỏ số lần gọi hàm dính dáng tới chuyện "làm mới", "tính toán" của bảng tính.
Trong 2 th đầu hàm chỉ được gọi 1 lần vì nó chả dính dáng gì tới bảng tính cả.
 
Lần chỉnh sửa cuối:
Cái này không liên quan gì tới WMI
Không phải là vòng lặp For được lặp lại 3 lần mà hàm được gọi 3 lần.
1.Mình đã làm theo hướng dẫn, và kết quả đúng như ý của bạn. Khi insert vào sheet, hàm"bị" excel gọi 3 lần. Nhờ câu lệnh Debug.Print ta mới biết được. Xưa nay dùng hàm giờ mới biết. Cám ơn bạn nhiều.
2. Vấn đề mình nêu ra hoàn toàn khác. Mấu chốt ở câu lệnh: For Each objItem...Vòng lặp này gọi từng objItem của máy. Mỗi obj tương ứng với 1 ổ cứng. ( Không biết nó còn tương ứng với phần cứng nào nữa không?)Vòng For Each...Next này chỉ lặp 3 lần, có nghĩa nó chỉ lấy thông số của 3 ổ cứng. Trường hợp máy có nhiều hơn 3 ổ cứng thì sao? Tiếc là mình không có điều kiện để test trường hợp này.
 
1.Mình đã làm theo hướng dẫn, và kết quả đúng như ý của bạn. Khi insert vào sheet, hàm"bị" excel gọi 3 lần. Nhờ câu lệnh Debug.Print ta mới biết được. Xưa nay dùng hàm giờ mới biết. Cám ơn bạn nhiều.
2. Vấn đề mình nêu ra hoàn toàn khác. Mấu chốt ở câu lệnh: For Each objItem...Vòng lặp này gọi từng objItem của máy. Mỗi obj tương ứng với 1 ổ cứng. ( Không biết nó còn tương ứng với phần cứng nào nữa không?)Vòng For Each...Next này chỉ lặp 3 lần, có nghĩa nó chỉ lấy thông số của 3 ổ cứng. Trường hợp máy có nhiều hơn 3 ổ cứng thì sao? Tiếc là mình không có điều kiện để test trường hợp này.

Từ đâu bạn biết là nó chỉ lấy thông số của 3 ổ cứng? Bạn đã thử với 4, 5, 6 ổ chưa mà kết luận là nó chỉ lấy thông số của 3 ổ cứng?
Mà bạn nói FOR lặp 3 lần là không đúng. Vòng lặp FOR của tôi chỉ lặp có 2 lần thôi.- tôi đặt Debug.Print tmp ngay sau dòng For Each và chỉ có 2 dòng (tôi chỉ có 1 ổ cứng) - dòng serial và dòng có nội dung Null. Tôi nghĩ là nó sẽ lặp cho tất cả các Item trong Collection mà phương thức ExecQuery trả về. Tức có bao nhiêu đĩa thì trả về bấy nhiêu.
Còn chuyện 1, 2, 3, 4 đĩa thì tìm hiểu thêm. Nếu tôi không lầm thì không phải muốn mua và cài thêm bao nhiêu đĩa cũng được.
Và nếu thế thì con số 3, 4 không phải là nó không muốn làm thêm mà nó biết là system không phục vụ, không cho phép lắp nhiều đĩa hơn. Tôi nhấn mạnh "Và nếu thế".
 
Từ đâu bạn biết là nó chỉ lấy thông số của 3 ổ cứng? Bạn đã thử với 4, 5, 6 ổ chưa mà kết luận là nó chỉ lấy thông số của 3 ổ cứng?
Vì mình test trên máy mình, dù có 1 hay 2 ổ cứng, vòng For...luôn lặp lại 3 lần. Từ đó suy ra vòng lặp này có bước lặp cố định ( không phụ thuộc vào các Item trong Collection). Máy bạn có 1 ổ cứng mà nó lặp 2 lần, rõ ràng không phụ thuộc vào các Item do phương thức ExecQ trả về.
Mà bạn nói FOR lặp 3 lần là không đúng. Vòng lặp FOR của tôi chỉ lặp có 2 lần thôi.- tôi đặt Debug.Print tmp ngay sau dòng For Each và chỉ có 2 dòng (tôi chỉ có 1 ổ cứng) - dòng serial và dòng có nội dung Null. Tôi nghĩ là nó sẽ lặp cho tất cả các Item trong Collection mà phương thức ExecQuery trả về. Tức có bao nhiêu đĩa thì trả về bấy nhiêu.
Bạn nên đặt tmp = objItem.SerialNumber trước dòng Debug.Print tmp, mới có kết quả chính xác. Nếu lệnh Debug.Print tmp đặt trước sẽ cho một dòng trống đầu tiên. Nên kết quả chỉ còn 2 dòng
 
Vì mình test trên máy mình, dù có 1 hay 2 ổ cứng, vòng For...luôn lặp lại 3 lần. Từ đó suy ra vòng lặp này có bước lặp cố định ( không phụ thuộc vào các Item trong Collection). Máy bạn có 1 ổ cứng mà nó lặp 2 lần, rõ ràng không phụ thuộc vào các Item do phương thức ExecQ trả về.
Bạn nên đặt tmp = objItem.SerialNumber trước dòng Debug.Print tmp, mới có kết quả chính xác. Nếu lệnh Debug.Print tmp đặt trước sẽ cho một dòng trống đầu tiên. Nên kết quả chỉ còn 2 dòng
Tôi viết nhầm. Tôi đặt ngay sau tmp = objItem.SerialNumber, vì đặt trong IF thì nó bỏ những Item không là String.
Và tôi được serial và Null
Bạn không cho Null cũng là Item à? Thế thì bạn hiểu sai. Null cũng là 1 Item. Còn chuyện tại sao hàm trả về thì lại chuyện khác. Tóm lại tôi chỉ có 2 vòng lặp = 1 serial + Null. Bạn có 3 vòng do bạn có 2 đĩa, 2 serial + Null. Đâu cứ phải luôn có 3 vòng lặp?

Bạn chú ý nhé. Tôi viết 1 dòng serial + 1 dòng Null nghĩa là 1 dòng có giá trị serial và 1 dòng có giá trị Null, chứ không phải dòng trống đâu nhé. Serial là 1 item và Null là 1 item.

Tôi luôn kiểm nghiệm trước, mắt thấy, có chứng cớ tôi mới viết. Vì đó là văn hóa tối thiểu trong tranh luận.
Tôi chỉ có 2 vòng lặp chứ không phải luôn là 3, như hình đính kèm.
 
Lần chỉnh sửa cuối:
Sao lạ thế này!!!




4d0ec78f.jpg


Nguyên văn bởi siwtom
Bạn không cho Null cũng là Item à? Thế thì bạn hiểu sai. Null cũng là 1 Item. Còn chuyện tại sao hàm trả về thì lại chuyện khác. Tóm lại tôi chỉ có 2 vòng lặp = 1 serial + Null. Bạn có 3 vòng do bạn có 2 đĩa, 2 serial + Null. Đâu cứ phải luôn có 3 vòng lặp?
Bạn chú ý nhé. Tôi viết 1 dòng serial + 1 dòng Null nghĩa là 1 dòng có giá trị serial và 1 dòng có giá trị Null, chứ không phải dòng trống đâu nhé. Serial là 1 item và Null là 1 item.
Item là do nói tắt thôi, đúng là ObjItem. Vòng lặp duyệt qua từng Object ( đĩa cứng). Null là một giá trị không thế là objitem được. Bạn nói "Null cũng là 1 Item" và " 1 dòng có giá trị Null. Như thế có mâu thuẫn không?
 
Lần chỉnh sửa cuối:
Sao lạ thế này!!!




4d0ec78f.jpg



Item là do nói tắt thôi, đúng là ObjItem. Vòng lặp duyệt qua từng Object ( đĩa cứng). Null là một giá trị không thế là objitem được. Bạn nói "Null cũng là 1 Item" và " 1 dòng có giá trị Null. Như thế có mâu thuẫn không?

Bạn buồn cười thật. Tôi không dùng "objitem" mà dùng "item" với nghĩa tiếng Anh là "khoản", "mục", "món"
Bây giờ bạn cố gán cho tôi là ý tôi muốn nói tới "objitem" rồi "trừng mất": "Null là một giá trị không thế là objitem (hàm ý object?)"
Bạn a, bạn có thấy là FOR của tôi được lặp 2 chứ không phải 3 lần? Thế là đủ, vì tranh luận chỉ về vấn đề này.
Tôi không có thời gian và hứng để đôi co, chầy bửa, bới bèo ra bọ.
Qua một loạt bài tôi chỉ muốn nói là FOR của tôi được lặp 2 lần chứ không phải là luôn luôn 3 lần.
Chấm hết. Tôi sẽ không viết gì nữa vì chỉ mất thời gian thôi chứ chả có ích gì nữa. Bạn thích thì xin mời.
 
Bạn đã nói thế thì mình chấm dứt ở đây. Bài trên, bạn đã hiểu nhầm ý mình. Mình không gán cho bạn cái gì cả bởi vì gán là không thực tâm, ý đồ không tốt. Mình cũng hiểu nghĩa chung của item là "khoản", "mục", "món". Nhưng chữ này luôn có nghĩa cụ thể khi dùng trong hoàn cảnh cụ thể. Trong trường hợp này, "khoản", "mục" , "món" đó là Object, là ổ cứng. Bây giờ mình vẫn hiểu như vây. Nói thế để bạn thấy mình không có ý đồ gì ngoài việc trao đổi học tập khi tranh luận. Tranh luận trong thế giới ảo này dễ gây hiểu nhầm vì chỉ viết và đọc thôi, không nghe được giọng nói, nhìn được cử chỉ và hiểu cá tính của nhau. Thôi mình kết ở đây vậy.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom