Lỗi 59999 trong Excel 2007
Tôi có đoạn mã VBA hoạt động trên Excel 2003 trên Windows XP và trên Excel 2007 trên Windows XP.
Khi tôi cố gắng chạy nó trong Excel 2007 trên Windows 7, tôi nhận được lỗi 59999 Lỗi do ứng dụng hoặc đối tượng xác định.
Phần đầu của đoạn mã trông như thế này:
____________
Sub GetPeak()
Dim hmsQ() As Double
Dim dssFile As New HecDss.DssDB
Dim pathOfPoint As New HecDss.PathName
Khai báo i là số nguyên
Dim startTime
ReDim hmsQ(1 To 3600)
LỖI ==> dssFile.Connect "G:\11\023\Drain\HEC-HMS\Patton1HEC-HMS\Patton1\Patton1.dss"
_____________
Lỗi xảy ra ở dòng được chỉ định. "dssFile.Connect" là một phương thức được cung cấp trong một tệp .dll nằm trong thư mục "c:\Dave Shared\" và tôi đã thêm nó vào phần tham chiếu cho Excel VBA. Tôi có quyền quản trị và đã cấp quyền truy cập cho tất cả người dùng trên máy Win7. (Tôi đã thấy một bài đăng trên MSN cho rằng vấn đề nằm ở quyền truy cập thư mục.) Tuy nhiên, điều đó không khắc phục được sự cố.
Vấn đề của tôi là cách này hoạt động với Excel 2007 trên máy XP nhưng lại không hoạt động trên máy Win7.
Mọi sự giúp đỡ đều được đánh giá cao.
Trả lời:
Bạn phải đăng ký tệp DLL trước khi có thể sử dụng nó.
http://ss64.com/nt/regsvr32.html
Andreas.
Trả lời:
Andreas
Tôi nhận được phản hồi từ JLLatham cho biết:
"...Tôi biết rằng trong Excel VBA thông thường, bạn phải thực hiện những điều chỉnh đặc biệt cho mã gọi các hàm API của Windows vì con trỏ được xử lý khác nhau giữa môi trường 32 bit và 64 bit. Và điều đó có nghĩa là đây không chỉ là vấn đề đối với Excel, mà còn đối với bất kỳ ứng dụng nào chạy trên Windows 64 bit tham chiếu đến các API của Windows..."
Vậy, việc đăng ký một DLL 32 bit trên Windows 7 64 bit có giải quyết được vấn đề "con trỏ khác nhau" không? Nếu vậy, đó quả là khả năng tương thích ngược tuyệt vời.
Vấn đề của tôi khi quay lại với nhà phát triển phần mềm là họ không còn hỗ trợ DLL này nữa. Điều đó khiến tôi tự hỏi, liệu có cách nào để tạo ra một "chương trình ghép nối", có thể bằng ngôn ngữ C, vừa hỗ trợ con trỏ 32 bit vừa hỗ trợ con trỏ 64 bit, có thể nhận các yêu cầu lệnh từ VBA đến DLL và chuyển đổi chúng sang giao thức 64 bit trước khi chuyển tiếp cho DLL hay không.
Cảm ơn bạn đã trả lời.
dhains
Trả lời:
Vậy, việc đăng ký một DLL 32 bit trên Windows 7 64 bit có giải quyết được vấn đề "con trỏ khác nhau" không? Nếu vậy, đó quả là khả năng tương thích ngược tuyệt vời.Đừng vội mừng, ngay cả các DLL 32 bit cũng có thể chạy trên Win7 Pro 64 bit.
Tôi cũng có một số tệp DLL rất cũ mà bình thường chỉ chạy được trên Windows 2000, tôi đã đăng ký các tệp đó trên Windows 7 của mình và chúng hoạt động.
Trong Excel, nhấp vào Menu Tệp > Trợ giúp, ở phía bên phải bạn sẽ thấy thông tin phiên bản, theo sau là "(32-bit)". Vì vậy, VBA của bạn cũng là phiên bản 32-bit.
Và 99,9% các lệnh gọi API thông thường vẫn hoạt động mà không cần thay đổi trong điều kiện này.
Tôi hoàn toàn chắc chắn về điều này, tôi có một ứng dụng Excel đang chạy, nó cài đặt một biểu tượng trên thanh tác vụ và với biểu tượng này, bạn có thể mở một menu, sau đó gọi một ngôn ngữ macro ảo từ một trang tính, được diễn giải bởi một tệp Excel khác (công cụ macro của tôi) và cuối cùng điều khiển các ứng dụng khác... nhập liệu, đọc trường, mở chương trình, nhấn nút... và tôi sử dụng một lượng lớn các lệnh gọi API!
Tôi chỉ thêm 1 hoặc 2 "PtrSafe" vào các lệnh gọi API của mình, thế thôi, hoạt động tương tự như trên Win2k với Office2k.
Vì vậy, khi DLL của bạn hoạt động, nó sẽ không gặp lỗi khi chạy VBA. Hãy thử, đăng ký DLL và xem nó có hoạt động không.
Andreas.
Trả lời:
Andreas
Tôi đã đăng ký DLL nhưng vẫn nhận được lỗi tương tự: "59999 Lỗi do ứng dụng hoặc đối tượng định nghĩa".
Đây là một đoạn văn bản đi kèm với tệp DLL mô tả quy trình cài đặt:
- Ngành phần mềm kỹ thuật tài nguyên nước cần một phương pháp thuận tiện, có khả năng nhận biết đối tượng để truy cập chuỗi thời gian được lưu trữ trong cơ sở dữ liệu HEC-DSS. Máy chủ dữ liệu HEC-DSS đáp ứng nhu cầu đó. Nó cung cấp:
- Một lớp cho phép đọc chuỗi thời gian từ và ghi chuỗi thời gian vào các tệp HEC-DSS một cách đơn giản; đồng thời, một cách để lấy các mục từ tệp danh mục HEC-DSS; một lớp có thể đọc dữ liệu ghép nối từ HEC-DSS; và một lớp giúp thao tác với đường dẫn HEC-DSS dễ dàng hơn.
- Mô tả kỹ thuật:
- Sản phẩm gồm hai phần:
- Một máy chủ DLL ActiveX nhỏ cung cấp các chức năng cấp cao bao gồm cả việc báo lỗi; và một thư viện liên kết động (DLL) tiêu chuẩn chứa các hàm trong thư viện chương trình con HEC (HECLIB) và một số hàm tiện ích. HECLIB được xây dựng bằng mã nguồn không sửa đổi được phát hành dưới dạng phiên bản 4.2 và được biên dịch bằng Digital Visual Fortran 5. Yêu cầu:
- Sản phẩm này yêu cầu hệ điều hành Windows 32-bit, chẳng hạn như Windows 2000. Sản phẩm cũng đã được thử nghiệm trên NT 4.0, Windows 95 và Windows 98.
Tôi tin rằng chính máy chủ DLL nhỏ của ActiaveX đang gây ra vấn đề.
dhains
Trả lời:
Tôi tin rằng chính máy chủ DLL nhỏ của ActiaveX đang gây ra vấn đề.Vâng, tôi cũng nghĩ vậy.
Nhưng điều này có nghĩa là phải có thêm các tệp DLL hoặc OCX, bạn đã thử (hoặc có thể) cài đặt toàn bộ gói bằng SETUP.EXE chưa?
Andreas.
Trả lời:
Nhưng điều này có nghĩa là phải có thêm các tệp DLL hoặc OCX, bạn đã thử (hoặc có thể) cài đặt toàn bộ gói bằng SETUP.EXE chưa?
Có 3 tập tin:
- HecDSS13.dll -- máy chủ ActiveX
- HecLib.dll --đã được sao chép vào c:\windows\system32 --được nhiều ứng dụng khác sử dụng
- DFORRT.dll --đã được sao chép vào c:\windows\system32 --được nhiều ứng dụng khác sử dụng
Có file MSI dành cho WinNT nhưng nó sẽ không hoạt động với WinXP hoặc Win7.
Tôi không biết cách cài đặt bằng tệp SETUP.EXE.
dhains
Trả lời:
Tôi không biết thông tin này có hữu ích hay không, nhưng tôi đã tìm thấy nó trong quá trình tìm kiếm trên web:
ftp://ftp.crwr.utexas.edu/pub/outgoing/Robayo/HECRAS_IDM/TransferTools/GISExport/RASIDM2ImportSDF/modUtils.bas
Đây có phải là điều bạn muốn đạt được?
Một cách khác để làm cho DLL cũ của bạn hoạt động là sử dụng máy ảo với hệ điều hành WinXP. Tôi sử dụng Oracle VM VirtualBox, hoạt động rất tốt. Microsoft cũng cung cấp một máy ảo, hãy tìm kiếm "win7 xp mode", nhưng tôi không thể nói nó hoạt động tốt đến mức nào.
Andreas.
Comments
Post a Comment