quangthanhdu
Thành viên chính thức
- Tham gia
- 21/5/10
- Bài viết
- 51
- Được thích
- 4
Cảm ơn Các Bác đã giúp đỡ.
Vọc chơi thôi chứ thú thật là tôi chưa hiểu hết về WMI đâu
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.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?
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.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.
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ề.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?
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òngMà 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.
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ì 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
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?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.
Sao lạ thế này!!!
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?
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2