Tìm File gốc của Dictionary để thay thế. (1 người xem)

  • Thread starter Thread starter sealand
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

sealand

Thành viên gạo cội
Tham gia
16/5/08
Bài viết
4,883
Được thích
7,688
Giới tính
Nam
Nghề nghiệp
Kế Toán
Theo mình hiểu thì Dictionary là 1 ActiveX Object khi cài MS Excel là đã được tích hợp sẵn rồi. Nay mình giúp 1 anh em trên GPE nhưng lệnh sau bị lỗi:

Mã:
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")

Khi chạy báo lỗi Component can't create ActiveX Object.

Vậy lỗi này có phải là do ActiveX bị lỗi không? Nếu lỗi muốn thay thế thì file liên quan với Dictionary là những file nào.
Mong các bạn chỉ giùm.
 
Theo mình hiểu thì Dictionary là 1 ActiveX Object khi cài MS Excel là đã được tích hợp sẵn rồi. Nay mình giúp 1 anh em trên GPE nhưng lệnh sau bị lỗi:

Mã:
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")

Khi chạy báo lỗi Component can't create ActiveX Object.

Vậy lỗi này có phải là do ActiveX bị lỗi không? Nếu lỗi muốn thay thế thì file liên quan với Dictionary là những file nào.
Mong các bạn chỉ giùm.

Là cái này nè anh: (trong menu Tools\References\Microsoft Scripting Runtime)

Capture.JPG































Ngoài ra anh xem lại: Có khi nào liên quan đến vụ Office 64 bit không?
 
Upvote 0
Không chắc có phải thiếu thư viện không, nhưng trong references thì nó là Microsoft Scripting Runtime, file library là scrrun.dll trong thư mục system32
 
Upvote 0
Cám ơn các anh, để "khổ chủ" test lại đã rồi thông tin lại sau. (Trên máy khác không phải của mình)
 
Upvote 0
Nếu nhu cầu chỉ là kiểm tra danh sách duy nhất thì nên dùng mảng sẽ nhanh. Dùng Scripting.Dictionary không cần thiết và tốc độ chậm. Em làm nhiều ứng dụng VBA nhưng nói thật là chưa bao giờ muốn/dùng Scripting.Dictionary.
 
Upvote 0
Nếu nhu cầu chỉ là kiểm tra danh sách duy nhất thì nên dùng mảng sẽ nhanh. Dùng Scripting.Dictionary không cần thiết và tốc độ chậm. Em làm nhiều ứng dụng VBA nhưng nói thật là chưa bao giờ muốn/dùng Scripting.Dictionary.

Dùng mảng là dùng thế nào hả Tuân (chưa nghĩ ra)
Riêng tôi, nếu không dùng Dictionary thì tôi sẽ dùng thằng em Collection
 
Upvote 0
Mình thấy thế này nên khá kết sử dụng nó, vốn là mình dân kế toán khi cần tổng hợp phát sinh TK hay tổng hợp NXT thì áp dụng Dic cùng với Array cho tốc độ sử lý cũng như độ chính xác khá tốt. So với ADO hay DAO kết hợp với SQL thì cũng chưa chắc ăn nổi. Vậy mà nó lại cây nhà lá vườn không rào đón thêm thắt nhiều, ít ảnh hưởng đến người khác.
Thực tế các file kho hàng mình ráp dữ liệu 4-5 năm chạy rất êm, chỉ khi mở file thì ì ạch chút do load dữ liệu.
Hì, không hiểu có phải mình bảo thủ không nữa. Ngay cả Exc người ta dùng 2013 rồi mà mình vẫn chưa bỏ 2003 vì mình thấy nó dân dã và chẳng kém ai.
 
Upvote 0
Mình thấy thế này nên khá kết sử dụng nó, vốn là mình dân kế toán khi cần tổng hợp phát sinh TK hay tổng hợp NXT thì áp dụng Dic cùng với Array cho tốc độ sử lý cũng như độ chính xác khá tốt. So với ADO hay DAO kết hợp với SQL thì cũng chưa chắc ăn nổi. Vậy mà nó lại cây nhà lá vườn không rào đón thêm thắt nhiều, ít ảnh hưởng đến người khác.
Thực tế các file kho hàng mình ráp dữ liệu 4-5 năm chạy rất êm, chỉ khi mở file thì ì ạch chút do load dữ liệu.
Hì, không hiểu có phải mình bảo thủ không nữa. Ngay cả Exc người ta dùng 2013 rồi mà mình vẫn chưa bỏ 2003 vì mình thấy nó dân dã và chẳng kém ai.

Nói chung, cái nào ít bị lỗi, làm việc ổn định thì mình xài chứ đâu quan trọng phải là version mới nhất đâu anh!
Có điều phải nói rằng: Với Office 2007 trở lên thì khi anh lưu CSDL, anh sẽ thấy dung lượng nó nhỏ lại rất nhiều
 
Upvote 0
Dùng mảng là dùng thế nào hả Tuân (chưa nghĩ ra)
Riêng tôi, nếu không dùng Dictionary thì tôi sẽ dùng thằng em Collection

Em thấy mọi người dùng món Dictionary hay để kiểm tra sự tồn tại của một đối tượng rồi có thể add thêm.... Nếu dùng mảng thì cần khai báo arrList. Kiểm tra sự tồn tại của phần tử trong mảng thì dùng vòng lặp tìm từ phần tử cuối lên đầu. Kiểu dùng Dic.Exist() cũng có thể là dùng vòng lặp mà thôi. Em đọc mã nguồn của các hãng phần mềm lớn, nhiều hàm viết bằng Assembler tốc độ cự nhanh, còn các hàm kiểu tìm và so sánh chủ yếu vẫn dùng vòng lặp. Nếu các phần tử là đối tượng (object) thì dùng Collection cũng là giải pháp tốt.
 
Upvote 0
Sao mình không check Microsoft Scripting Runtime mà vẫn dùng Dictionary được ta?

Nếu vào Tools\References tới DLL thì mình sẽ nhìn thấy được các hàm, thủ tục, sự kiện, thuộc tính (trong VBA nhấn F2), hằng số của đối tượng, tóm lại là như được vào nhà nhìn thấy mọi đồ đạc. Còn không làm như trên thì phải là Dim obj As Object: Set obj = CreateObject() thường dùng cho những người đã hiểu hay biết rõ các thành phần của class/đối tượng. Nếu ai đó chỉ vận dụng mà không đọc tài liệu hay không Tools\References thì đó là làm mò, không bao giờ khai thác tốt đối tượng được.
 
Upvote 0
Sao mình không check Microsoft Scripting Runtime mà vẫn dùng Dictionary được ta?

Một số đối tượng như ADO,Dic.... không check đến tham chiếu nhưng sử dụng CreateObject thì vẫn sử dụng bình thường . Nó chỉ hạn chế không hỗ trợ Tip trong soạn VBA hay không dùng Dim Cn as New AĐOC.Connection.
Ngoài ra còn vấn đề gì không thì không rõ vì thực tế áp dụng mình thấy vậy.
(Bạn thấy rõ vấn đề này trong Topic CAC BAI TẠP ADO... của HaiLuaMienTay+ đã cố tình dùng CreateObject mà không chọn tham chiếu để tránh vào máy không khai báo tham chiếu phát sinh lỗi. Còn nếu dùng CreateOject mà vẫn Refer...thì sẽ được hỗ trợ tích cực hơn như anh Tuân viết.)
 
Lần chỉnh sửa cuối:
Upvote 0
Em thấy mọi người dùng món Dictionary hay để kiểm tra sự tồn tại của một đối tượng rồi có thể add thêm.... Nếu dùng mảng thì cần khai báo arrList. Kiểm tra sự tồn tại của phần tử trong mảng thì dùng vòng lặp tìm từ phần tử cuối lên đầu. Kiểu dùng Dic.Exist() cũng có thể là dùng vòng lặp mà thôi. Em đọc mã nguồn của các hãng phần mềm lớn, nhiều hàm viết bằng Assembler tốc độ cự nhanh, còn các hàm kiểu tìm và so sánh chủ yếu vẫn dùng vòng lặp. Nếu các phần tử là đối tượng (object) thì dùng Collection cũng là giải pháp tốt.

Tại vì Tuân biết nhiều ngôn ngữ lập trình nên dùng mấy thứ khác để xử lý.. chứ nếu chỉ dùng các hàm VBA để chạy vòng lập thì mình e rằng không "thắng" nỗi Dictionary rồi
(hình như cách đây không lâu anh siwtom có biểu diễn 1 code nhưng phải kết hợp với API mới xong)
 
Lần chỉnh sửa cuối:
Upvote 0
Mình thấy thế này nên khá kết sử dụng nó, vốn là mình dân kế toán khi cần tổng hợp phát sinh TK hay tổng hợp NXT thì áp dụng Dic cùng với Array cho tốc độ sử lý cũng như độ chính xác khá tốt. So với ADO hay DAO kết hợp với SQL thì cũng chưa chắc ăn nổi. Vậy mà nó lại cây nhà lá vườn không rào đón thêm thắt nhiều, ít ảnh hưởng đến người khác.
Thực tế các file kho hàng mình ráp dữ liệu 4-5 năm chạy rất êm, chỉ khi mở file thì ì ạch chút do load dữ liệu.
Hì, không hiểu có phải mình bảo thủ không nữa. Ngay cả Exc người ta dùng 2013 rồi mà mình vẫn chưa bỏ 2003 vì mình thấy nó dân dã và chẳng kém ai.

ADO, DAO chỉ là công cụ thực thi lệnh truy vấn SQL thôi, người ta không dùng ADO, DAO thì vẫn thực thi được SQL anh ạ. Còn SQL là kiến trúc ngôn ngữ có chuẩn chung với các hệ quản trị CSDL. Còn Scripting.Dictionary là một đối tượng để quản lý danh sách mà thôi. Cho đến nay thì việc trích lọc dữ liệu, thống kê thông mình thì ngôn ngữ SQL vẫn là ngôn ngữ thông minh nhất, còn viết VBA để chạy nhanh hơn SQL phải là rất cao thủ thủ đó, hoặc tùy vào yêu cầu công việc cụ thể nào đó nữa anh à.
 
Upvote 0
Tại vì Tuân biết nhiều ngôn ngữ lập trình nên dùng mấy thứ khác để xử lý.. chứ nếu chỉ dùng các hàm VBA để chạy vòng lập thì mình e rằng không "thắng" nỗi Dictionary rồi
(hình như cách đây không lâu anh siwtom có biểu diễn 1 code nhưng phải kết hợp với API mới xong)

Vâng, khi nào có ví dụ cụ thể em sẽ test thử xem.
 
Upvote 0
Sao mình không check Microsoft Scripting Runtime mà vẫn dùng Dictionary được ta?

Nếu bạn dùng Set Dic = CreateObject("Scripting.Dictionary")
thì system đã biết bạn cần tạo object nào, và cái object đó do "thằng nào" tạo.

Mọi thông tin đã được ghi trong cơ sở dữ liệu của system là REGISTRY.

Tất cả mọi object do những thằng khác nhau (server) có thể tạo ra đều được ghi trong registry.
Ví dụ "Scripting.Dictionary". Đó là tên class mà "thằng" scrrun.dll (server) có thể tạo ra object có class như thế.
Tại sao tôi nói ở trên là system có đủ thông tin: bạn cần tạo object có class nào, và "thằng nào" tạo ra?
bạn cần tạo object có class nào? Thì Scripting.Dictionary chính là tên class rồi. Còn thằng nào tạo ra?
Bạn hãy thử như sau: Start --> Run --> gõ regedit --> OK --> trong cửa sổ của Regedit chọn menu Edit --> Find --> gõ Scripting.Dictionary --> nhấn Find Next. Khi tìm thấy thì ở nửa bên trái bạn nhìn thấy có 1 icon thư mục đang mở. Bạn click dấu + để mở các thư mục con. Bạn click vào InprocServer rồi nhìn sang nửa phải. Bạn sẽ thấy đại loại là "C:\WINDOWS\system32\scrrun.dll"
Tức Scripting.Dictionary là tên một class (khuôn, mẫu) mà thằng scrrun.dll sẽ tạo object dựa trên cái "khuôn, mẫu" đó.

Scripting.FileSystemObject cũng là 1 class - khuôn mẫu mà trên cơ sở đó server tạo ra object. Nếu bạn tìm như trên thì bạn thấy nó cũng do thằng scrrun.dll tạo ra.

system đã đủ thông tin (biết cần tạo cái gì và do thằng nào đảm nhiệm) nên nó cứ "lôi cổ" thằng scrrun.dll ra rồi "bắt" nó tạo object "như thế như thế" thôi.
 
Upvote 0
Nếu bạn dùng Set Dic = CreateObject("Scripting.Dictionary")
thì system đã biết bạn cần tạo object nào, và cái object đó do "thằng nào" tạo.

Mọi thông tin đã được ghi trong cơ sở dữ liệu của system là REGISTRY.

Tất cả mọi object do những thằng khác nhau (server) có thể tạo ra đều được ghi trong registry.
Ví dụ "Scripting.Dictionary". Đó là tên class mà "thằng" scrrun.dll (server) có thể tạo ra object có class như thế.
Tại sao tôi nói ở trên là system có đủ thông tin: bạn cần tạo object có class nào, và "thằng nào" tạo ra?
bạn cần tạo object có class nào? Thì Scripting.Dictionary chính là tên class rồi. Còn thằng nào tạo ra?
Bạn hãy thử như sau: Start --> Run --> gõ regedit --> OK --> trong cửa sổ của Regedit chọn menu Edit --> Find --> gõ Scripting.Dictionary --> nhấn Find Next. Khi tìm thấy thì ở nửa bên trái bạn nhìn thấy có 1 icon thư mục đang mở. Bạn click dấu + để mở các thư mục con. Bạn click vào InprocServer rồi nhìn sang nửa phải. Bạn sẽ thấy đại loại là "C:\WINDOWS\system32\scrrun.dll"
Tức Scripting.Dictionary là tên một class (khuôn, mẫu) mà thằng scrrun.dll sẽ tạo object dựa trên cái "khuôn, mẫu" đó.

Scripting.FileSystemObject cũng là 1 class - khuôn mẫu mà trên cơ sở đó server tạo ra object. Nếu bạn tìm như trên thì bạn thấy nó cũng do thằng scrrun.dll tạo ra.

system đã đủ thông tin (biết cần tạo cái gì và do thằng nào đảm nhiệm) nên nó cứ "lôi cổ" thằng scrrun.dll ra rồi "bắt" nó tạo object "như thế như thế" thôi.

Cám ơn anh đã giải thích cặn kẽ, cám ơn các bạn!

Bây giờ thì tôi đã hiểu được phần nào: Các class này đã được Microsoft tạo ra và "đăng ký" hộ khẩu thường trú sẵn, như công cụ chỉ việc lấy ra dùng. Cũng giống như ta tạo class đưa vào file dll (tự tạo) bằng phần mềm (chẳng hạn VB6) rồi cũng phải nhập hộ khẩu vảo System32 và đăng ký vào Registry để xử dụng khi cần. Có điều là những class do ta tạo ra thì đơn giản hơn, ứng dụng hẹp hơn.
Khi dùng, nếu References VBA đến dll thì sẽ được VBA hổ trợ tối đa về cách sử dụng class đó.
Hiểu vậy thôi, không biết có chính xác chưa?
 
Upvote 0
Không chắc có phải thiếu thư viện không, nhưng trong references thì nó là Microsoft Scripting Runtime, file library là scrrun.dll trong thư mục system32
Cho em hỏi thiếu thư viện thì phải làm thế nào ạ, em tìm hoài mà không thấy Microsoft Scripting Runtime đâu cả. Vậy em phải làm như thế nào?
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom