PDA

View Full Version : Làm việc với đối tượng Excel từ Visual Basic 6.0 và VB 2008



PhanTuHuong
05-11-06, 08:55 AM
Trong Visual Basic 6.0 (VB6) hoặc VBA bạn có thể tạo và làm việc với một Workbook, ví dụ như sau:

Lưu ý: Để làm việc với đối tượng này, trong dự án của bạn phải tham chiếu đến đối tượng Microsoft Excel xx.0 Object Library (xx là số phiên bản Office trên máy của bạn)



Dim oXLApp as Excel.Application 'Khai báo đối tượng
Set oXLApp = New Excel.Application 'Tạo đối tượng Excel

' Bây giờ bạn có thể làm việc với oXLApp như là lớp ứng dụng (class)
' Để làm việc với lớp này đòi hỏi bạn phải có kiến thức cơ bản về nó, bao gồm: cấu trúc, thuộc tính, phương thức và sự kiện...

' Ví dụ:
oXLApp.Visible = True 'Hiện đối tượng
Debug.Print oXLApp.Name 'In ra cửa sổ Imediate tên của lớp
'Kết quả: Microsoft Excel
'...(your code here)
Set oXLApp = Nothing 'Giải phóng oXLApp khỏi bộ nhớ


____________________
Hiểu thêm về các thành phần (Components) và cấu trúc Microsoft Excel xx.0 Object Library , Click here (http://www.giaiphapexcel.com/forum/showthread.php?t=90)!

levanduyet
05-11-06, 10:43 AM
Từ chương trình ngoài, bạn có thể tạo và đọc Excel. Ví dụ về code VB, VBA:


Dim oXLApp as Excel.Application Khai báo đối tượng
Set oXLApp = New Excel.Application 'Tạo đối tượng Excel

oXLApp.Visible = True 'Hiện đối tượng
Set oXLApp = Nothing
Hướng nên cho đoạn mã và ví dụ cụ thể.

Lê Văn Duyệt

ruadangyeu
20-12-06, 09:58 PM
Chào anh Duyệt em thấy anh có một phần mềm rât tuyệt viết trên excel để quản lý kho liên kết giữa excel và access sử dụng ODBC data provide. Sao anh không bật mí cho chúng em một ví dụ về cái khoản này. Nó cũng là một ví dụ tốt cho chủ đề này mà

lachinhan
21-12-06, 10:33 AM
Chào anh Duyệt em thấy anh có một phần mềm rât tuyệt viết trên excel để quản lý kho liên kết giữa excel và access sử dụng ODBC data provide. Sao anh không bật mí cho chúng em một ví dụ về cái khoản này. Nó cũng là một ví dụ tốt cho chủ đề này mà

Cái này xin Bác Duyệt cái source là biết liền chứ gì, Bác Duyệt hứa ai xin thì cho mà

PhanTuHuong
02-04-07, 08:38 PM
Đây là đoạn code để có thể mở ứng dụng Excel từ VB6.0 và cả từ VBA của AutoCad )*&^) .
Khi mở cửa sổ VB 6.0, bạn chọn Standard EXE. Cửa sổ Project hiện ra với Form1. Bạn tao 1 CommandButton và copy đoạn code dưới đây.



Public Sub cmdMoExcel_Click()
Dim ExcelApp As Object
On Error Resume Next 'Bỏ qua các lỗi gặp phải
Set ExcelApp = GetObject(, "Excel.Application")
If Err <> 0 Then 'Lỗi phát sinh khi Excel chưa mở
Err.Clear 'Xoá lỗi báo
Set ExcelApp = CreateObject("Excel.Application")
End If
ExcelApp.Visible = True 'Hiển thị cửa sổ Excel
AppActivate ExcelApp.Caption 'Kích hoạt cửa sổ Excel
ExcelApp.Workbooks.Add 'Thêm Workbook mới trong Excel
Set ExcelApp = Nothing 'Xoá biến đối tượng
End Sub

Sau đó bạn bấm phím F5 để thử.

Các bạn nhớ khai báo thư viện đối tượng Microsoft Excel XX.0 Object Library trong menu Project/References... nhé (tương tự khai báo trong menu Tools/References... trong cửa sổ VBE)!

nguyentuhp
21-04-09, 12:54 AM
Liên kết giữa VST 2008 và office (Visual basic , Excel 2007)
1. Dạng nhúng: New Project à Office à chọn các dạng sau:
a. Excel 2007 Add-in
b. Excel 2007 Workbook
c. Excel 2007 Template
Đối với các ứng dụng office khác cũng làm tương tự. Các bạn có thể tham khảo bài viết của anh Hiền
2. Tạo thư viện liên kết
Bài viết của anh Hướng đã giới thiệu tạo thư viện DLL liên kết giữa VB6 và Excel.
Ở bài viết này tôi giới thiệu tạo thư viện từ VST 2008 (.NET Class Library) bằng 1 ví dụ cụ thể.
2.1. Tạo thư viện
2.1.1. Khởi động VST, New project à Visual basic à Class Library, chọn version .Net, đặt tên dự án HelloWordGPE à OK
Lúc này chương trình từ động tạo ra Class1.vb
Public Class Class1

End Class
2.1.2. Chèn thêm 1 Form mới cho dự án: Từ menu Project (hoặc từ biểu tượng Add New Item, hoặc từ cửa sổ Solution Explorer, chọn dự án, phải chuột hiện menu, chọn Add) à Add Window Form…
2.1.3. Tạo liên kết với Excel: Từ Menu Project à Add Reference à Com à Microsoft Excel 12.0 Library
2.1.4. Xóa toàn bộ code trong Class1.vb và thay bằng đoạn code sau:


<ComClass(Class1.ClassId, Class1.InterfaceId, Class1.EventsId)> Public Class Class1
Public Const ClassId As String = "057B80BB-565B-4ef0-94A4-48AA34E522E0"
Public Const InterfaceId As String = "67279AD6-4D9D-4caf-9E0D-1F6F54F15AEE"
Public Const EventsId As String = "F94C8B54-87A5-478b-8F61-E89D03044C5E"

Public Function ptb1(ByVal a As Double, ByVal b As Double, ByVal c As Double) As String
ptb1 = "Nghiệm của pt là x=" & ((c - b) / a).ToString
End Function

Public Sub showform()
Dim newfrm As New Form1
newfrm.Show()
End Sub

Public Sub MsgboxHello()
MsgBox("Chào mừng bạn đến với VST 2008")
End Sub

End Class

Ghi chú:
+ ClassId, InterfaceId, EventsId có thể lấy bằng cách: từ Menu Tool à Creat GUID
+ ptb1 à Tạo hàm giải pt bậc nhất
+ showform à Macro gọi Form1
2.1.5. Từ cửa sổ Solution Explorer double click vào Form1, cửa sổ Form1.vb[Design] hiện ra.
- Từ dụng cụ Toolbox tạo TextBox1, Button1, Button2, Button3
- Dùng chọn lần lượt các Button và đổi Text (nhãn – cách gọi cũ, VST 2008 chuyển thành Text) thành: Exit, Put Cell Value, Get Cell Value
2.1.6. Nháy chuột phải trên Form1, chọn View code, xóa toàn bộ code trong Form1.vb và Copy đoạn Code này vào


Imports Microsoft.Office.Interop
Imports System.Windows.Forms

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = "VST for Office"
Me.TextBox1.Text = "Nhập chữ vào đây và click Put Cell Value hoặc chọn cell, click Get Cell Value để lấy dữ liệu"
End Sub

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
Dim ExApp As Excel.Application
Dim btnclick As Button = CType(sender, Button)
Select Case btnclick.Name
Case "Button1"
Me.Close()
Case "Button2"
Try
ExApp = GetObject(, "Excel.Application")
Dim cel As Excel.Range = ExApp.ActiveCell
cel.Value = Me.TextBox1.Text
Catch ex As Exception
End Try
Case "Button3"
Try
ExApp = GetObject(, "Excel.Application")
Dim cel As Excel.Range = ExApp.ActiveCell
Me.TextBox1.Clear()
Me.TextBox1.Text = cel.Value.ToString
Catch ex As Exception
End Try
End Select

End Sub
End Class

2.1.7. Từ Menu Project à HelloWordGPE Properties (hoặc từ cửa sổ Solution Explorer, chọn dự án, phải chuột hiện menu, chọn Properties)
Chọn Compile* à Đánh dấu checkBox Regiter for Com Interop
2.1.8. Từ Menu Project à Build HelloWordGPE
Lúc này tại thư mục Dự án (vd: D:\My Documents\Visual Studio 2008\Projects\HelloWordGPE\HelloWordGPE\bin\Releas e\) có các files sau: HelloWordGPE.dll, HelloWordGPE.pdb, …
2.2. Sử dụng thư viện
2.2.1. Chạy Excel, Mở cửa sổ VBA, chèn Module1
2.2.2. Từ menu Tools à Preferences à Browse à chọn đường dẫn đến file HelloWordGPE.pdb
2.2.3. Copy các đoạn code sau vào trong Module1


Option Explicit

Function ptbac1(ByVal a As Double, ByVal b As Double, ByVal c As Double) As String
Dim pt As New HelloWordGPE.Class1
ptbac1 = pt.ptb1(a, b, c)
End Function

Sub ShowformVST()
Dim frmvb6 As New HelloWordGPE.Form1
frmvb6.Show
End Sub

Sub ShowmsgVST()
Dim loichao As New HelloWordGPE.Class1
loichao.MsgboxHello
End Sub

2.2.4. Sử dụng
Ví dụ này chúng ta đã sử dụng hàm, chạy Macro, hiện Form VST: Tương tác giữa Excel và Form từ thư viện.

2.1. Chú ý khi sử dụng thư viện DLL .Net
Để sử dụng thư viện trên các máy tính khác, chạy từ Dos dòng lệnh: regasm HelloWordGPE.dll /tlb: HelloWordGPE.dll.tlb
Từ file Excel nguồn bạn có thể save as thành Add-in để sử dụng cho các file khác.

Thêm một bước nữa tạo thư viện sử dụng như các hàm API của Windows bác nào biết Post lên cho anh em học hỏi nhé!

Toàn bộ File ví dụ kèm theo dưới đây

PhanTuHuong
24-08-09, 11:41 PM
Public Const ClassId As String = "057B80BB-565B-4ef0-94A4-48AA34E522E0"
Public Const InterfaceId As String = "67279AD6-4D9D-4caf-9E0D-1F6F54F15AEE"
Public Const EventsId As String = "F94C8B54-87A5-478b-8F61-E89D03044C5E"


Tôi chưa hiểu hết ý của cái này trong VB2008, giá trị đó lấy từ đâu, chạy ở máy khác thì sao? Micrsoft nói rất chung chung.

Còn đối với AutoCad đây:


It depends which library is actively registered. You can find this out through the Windows Registry:

Get the ClassID for AutoCAD.Application:
HKEY_CLASSES_ROOT\AutoCAD.Application\CLSID
(Default) {28B7AA99-C0F9-4C47-995E-8A8D729603A1}

Get the TypeLib for the ClassID you found:
HKEY_CLASSES_ROOT\CLSID\{28B7AA99-C0F9-4C47-995E-8A8D729603A1}\TypeLib
(Default) {851A4561-F4EC-4631-9B0C-E7DC407512C9}

Get the file path for the TypeLib:
HKEY_CLASSES_ROOT\TypeLib\{851A4561-F4EC-4631-9B0C-E7DC407512C9}\1.0\0\win32
(Default) C:\Program Files\Common Files\Autodesk Shared\acax18enu.tlb

This is the type library that will be referenced when you instantiate an AutoCAD.Application object via late-binding.

kalanta
15-12-09, 08:54 PM
[QUOTE=PhanTuHuong;11188]Đây là đoạn code để có thể mở ứng dụng Excel từ VB6.0 và cả từ VBA của AutoCad )*&^) .
Khi mở cửa sổ VB 6.0, bạn chọn Standard EXE. Cửa sổ Project hiện ra với Form1. Bạn tao 1 CommandButton và copy đoạn code dưới đây.



Public Sub cmdMoExcel_Click()
Dim ExcelApp As Object
On Error Resume Next 'Bỏ qua các lỗi gặp phải
Set ExcelApp = GetObject(, "Excel.Application")
If Err <> 0 Then 'Lỗi phát sinh khi Excel chưa mở
Err.Clear 'Xoá lỗi báo
Set ExcelApp = CreateObject("Excel.Application")
End If
ExcelApp.Visible = True 'Hiển thị cửa sổ Excel
AppActivate ExcelApp.Caption 'Kích hoạt cửa sổ Excel
ExcelApp.Workbooks.Add 'Thêm Workbook mới trong Excel
Set ExcelApp = Nothing 'Xoá biến đối tượng
End Sub

Sau đó bạn bấm phím F5 để thử.

Cho mình hỏi đoạn code trên mình đã chạy.Nhưng mình có vấn đề mong bạn giúp.
Đoạn code trên mỗi lần chạy lại lưu dữ liệu vào một excel mới mà mình lại muốn mỗi lần chạy đoạn code trên đều lưu vào một file excel thì phải viết code lại như thế nào.
Bởi vì mình dùng sự kiện oncomm,mỗi lần sự kiện xảy ra là lưu dữ liệu vào excel nhưng mỗi lần như vậy lại xuất hiện một file excel mới.

MinhNguyệt
15-12-09, 09:50 PM
[QUOTE=PhanTuHuong;11188]Đây là đoạn code để có thể mở ứng dụng Excel từ VB6.0 và cả từ VBA của AutoCad )*&^) .
Khi mở cửa sổ VB 6.0, bạn chọn Standard EXE. Cửa sổ Project hiện ra với Form1. Bạn tao 1 CommandButton và copy đoạn code dưới đây.



Public Sub cmdMoExcel_Click()
Dim ExcelApp As Object
On Error Resume Next 'Bỏ qua các lỗi gặp phải
Set ExcelApp = GetObject(, "Excel.Application")
If Err <> 0 Then 'Lỗi phát sinh khi Excel chưa mở
Err.Clear 'Xoá lỗi báo
Set ExcelApp = CreateObject("Excel.Application")
End If
ExcelApp.Visible = True 'Hiển thị cửa sổ Excel
AppActivate ExcelApp.Caption 'Kích hoạt cửa sổ Excel
ExcelApp.Workbooks.Add 'Thêm Workbook mới trong Excel
Set ExcelApp = Nothing 'Xoá biến đối tượng
End Sub

Sau đó bạn bấm phím F5 để thử.

Cho mình hỏi đoạn code trên mình đã chạy.Nhưng mình có vấn đề mong bạn giúp.
Đoạn code trên mỗi lần chạy lại lưu dữ liệu vào một excel mới mà mình lại muốn mỗi lần chạy đoạn code trên đều lưu vào một file excel thì phải viết code lại như thế nào.
Bởi vì mình dùng sự kiện oncomm,mỗi lần sự kiện xảy ra là lưu dữ liệu vào excel nhưng mỗi lần như vậy lại xuất hiện một file excel mới.

Đơn giản là bạn thay câu

ExcelApp.Workbooks.Add

bằng câu :

ExcelApp.Workbooks.Open("D:\kalanta\TaiLieu.xls")

(Bạn thay đường dẫn theo yêu cầu của bạn)
Thân

kalanta
16-12-09, 10:16 PM
[QUOTE=kalanta;211226]

Đơn giản là bạn thay câu

ExcelApp.Workbooks.Add

bằng câu :

ExcelApp.Workbooks.Open("D:\kalanta\TaiLieu.xls")

(Bạn thay đường dẫn theo yêu cầu của bạn)
Thân

Mình đã thử và đúng nhưng thay vì câu lệnh

ExcelApp.Workbooks.Add sẽ mở excel mới thì câu lệnh
ExcelApp.Workbooks.Open("D:\kalanta\TaiLieu.xls") sẽ mở file tài liệu theo đường dẫn.
Nhưng nó vẫn không khác mấy. Vì theo yêu cầu của mình là giả sử cứ 1giây (sự kiện oncomm xảy ra )mình lấy được giá trị dòng ,áp về rồi sẽ xuất ra file excel.Như vậy cứ mỗi giây xuất ra file excel thì file ("D:\kalanta\TaiLieu.xls") lại hiện lên. Như thế 1000giây sẽ có 1000file xuất hiện mà mỗi file chỉ có 1 giá trị . Cho nên mình sử dụng câu lệnh ExcelApp.Save để lưu giá trị vào một file cố định nhưng nó lại hiện lên hỏi có lưu không khi mình bấm lưu thì VB bị lỗi do sự kiện tiếp theo đang xảy ra.

Tóm lại theo yêu cầu của mình là cứ 1giây (sự kiện oncomm xảy ra ) mình sẽ lưu giá trị vào cột 1,hàng 1.Giây tiếp theo sẽ lưu vào cột 1,hàng 2 ...và tự động cập nhật giá trị (theo như trước thì giây 1 nó lưu vào hàng 1 , cột 1 của file "D:\kalanta\TaiLieu.xls",giây 2 lại lưu vào cột 1,hàng 2 của file "D:\kalanta\TaiLieu.xls",như vậy mỗi file chỉ lưu 1 giá trị cho nên khi Save chỉ có 1 giá trị).
Code của mình:
Dim ExcelApp As Excel.Application
Dim ExcelBook As Excel.Workbook
Dim iSheetsPerBook As Integer
Set ExcelApp = New Excel.Application
Set ExcelBook = ExcelApp.Workbooks.Open("D:\kalanta\TaiLieu.xls")
Set ExcelSheet = ExcelBook.Worksheets(1)
ExcelApp.Visible = True
ExcelSheet.Cells(i, j).Value = "Dữ liệu cần ghi"

Mong các bạn giúp đỡ.

MinhNguyệt
18-12-09, 09:02 AM
[QUOTE=MinhNguyệt;211239]

Mình đã thử và đúng nhưng thay vì câu lệnh

ExcelApp.Workbooks.Add sẽ mở excel mới thì câu lệnh
ExcelApp.Workbooks.Open("D:\kalanta\TaiLieu.xls") sẽ mở file tài liệu theo đường dẫn.
Nhưng nó vẫn không khác mấy. Vì theo yêu cầu của mình là giả sử cứ 1giây (sự kiện oncomm xảy ra )mình lấy được giá trị dòng ,áp về rồi sẽ xuất ra file excel.Như vậy cứ mỗi giây xuất ra file excel thì file ("D:\kalanta\TaiLieu.xls") lại hiện lên. Như thế 1000giây sẽ có 1000file xuất hiện mà mỗi file chỉ có 1 giá trị . Cho nên mình sử dụng câu lệnh ExcelApp.Save để lưu giá trị vào một file cố định nhưng nó lại hiện lên hỏi có lưu không khi mình bấm lưu thì VB bị lỗi do sự kiện tiếp theo đang xảy ra.

Tóm lại theo yêu cầu của mình là cứ 1giây (sự kiện oncomm xảy ra ) mình sẽ lưu giá trị vào cột 1,hàng 1.Giây tiếp theo sẽ lưu vào cột 1,hàng 2 ...và tự động cập nhật giá trị (theo như trước thì giây 1 nó lưu vào hàng 1 , cột 1 của file "D:\kalanta\TaiLieu.xls",giây 2 lại lưu vào cột 1,hàng 2 của file "D:\kalanta\TaiLieu.xls",như vậy mỗi file chỉ lưu 1 giá trị cho nên khi Save chỉ có 1 giá trị).
Code của mình:
Dim ExcelApp As Excel.Application
Dim ExcelBook As Excel.Workbook
Dim iSheetsPerBook As Integer
Set ExcelApp = New Excel.Application
Set ExcelBook = ExcelApp.Workbooks.Open("D:\kalanta\TaiLieu.xls")
Set ExcelSheet = ExcelBook.Worksheets(1)
ExcelApp.Visible = True
ExcelSheet.Cells(i, j).Value = "Dữ liệu cần ghi"

Mong các bạn giúp đỡ.



Lý do là bạn nói không rõ nên khó có thể giúp bạn hoàn chỉnh. Với yêu cầu như trên thì câu lệnh của nó là :

Dim Wb As Workbook
Dim Ws As Worksheet
TenFile = "D:\kalanta\TaiLieu.xls"
Set Wb = GetObject(TenFile)
Set Ws = Wb.Worksheets("Sheet1")
n = Ws.Range("A65000").End(xlUp).Row
Ws.Cells(n + 1, 1) = "Dữ Liệu Cần Ghi"
'Nếu muốn cho hiện file thì thêm câu lệnh
'Windows("TaiLieu.xls").Visible = True

Ngoài ra còn có thể sử dụng ADODB. Bạn tham khảo thêm trên diễn đàn này
Thân

ndu96081631
12-03-10, 12:25 PM
Không hiểu sao khi làm việc với VB6, tôi luôn bị lỗi này (Permission denied), dù code chỉ có đúng 2 dòng:


Private Sub Form_Load()
With CreateObject("Excel.Application")
End With
End Sub
Nguyên văn lỗi như thế này:

Run-time error '70'
Permission denied
Các bạn có ai biết nguyên nhân là gì không?

levanduyet
22-03-10, 11:39 AM
Hi Anh Tuấn,

Anh nói cụ thể được không? Vì phải xem đoạn code của anh mới trả lời được.

Lê Văn Duyệt

ndu96081631
22-03-10, 11:50 AM
Hi Anh Tuấn,

Anh nói cụ thể được không? Vì phải xem đoạn code của anh mới trả lời được.

Lê Văn Duyệt
Code chỉ đúng 2 dòng ấy thôi, không còn thêm bất cứ thứ gì cả... Ấy thế mà vừa Run 1 phát là lập tức lổi ngay!
Chỉ nhiêu đó thôi đã lổi thì còn làm việc được gì với Excel nữa đây trời!
Tôi gặp lổi này thì liên tưởng ngay đến "quyền" của User Account ---> Nhưng User tôi là quyền Admin cơ mà ---> cẩn thận hơn, tôi Log On vào Administrator, lổi vẫn y chang!
Hic...
Duyệt đã bao giờ gặp lổi dạng này chưa? Giúp tôi với!

levanduyet
22-03-10, 01:05 PM
Chào Anh,

Em test trên máy em thì không bị lỗi gì.
Theo em, hướng suy nghĩ của anh đã đúng, nhưng cần xem lại kỹ hơn.
Anh thử các phương án từ "Google" thử xem.

Lê Văn Duyệt

hai2hai
23-03-10, 07:51 AM
Code chỉ đúng 2 dòng ấy thôi, không còn thêm bất cứ thứ gì cả... Ấy thế mà vừa Run 1 phát là lập tức lổi ngay!
Chỉ nhiêu đó thôi đã lổi thì còn làm việc được gì với Excel nữa đây trời!
Tôi gặp lổi này thì liên tưởng ngay đến "quyền" của User Account ---> Nhưng User tôi là quyền Admin cơ mà ---> cẩn thận hơn, tôi Log On vào Administrator, lổi vẫn y chang!
Hic...
Duyệt đã bao giờ gặp lổi dạng này chưa? Giúp tôi với!

Vấn đề là môi trường thực hiện thì bạn lại ko nói ra (người ta gọi là thông báo lỗi mà ko thông báo đủ môi trường làm việc). Đối với Vista, Windows 7 thì log bằng Admin chắc gì đã thực hiện được. Google: UAC

ndu96081631
23-03-10, 08:10 AM
Vấn đề là môi trường thực hiện thì bạn lại ko nói ra (người ta gọi là thông báo lỗi mà ko thông báo đủ môi trường làm việc). Đối với Vista, Windows 7 thì log bằng Admin chắc gì đã thực hiện được. Google: UAC
Tôi chạy VB6 trên Windows XP, SP3 bạn à!
Đã search google cả tuần nay rồi mà chưa tìm được câu trả lời (cho trường hợp của tôi)
Bạn có nhiều kinh nghiệm, xin giúp tôi với!

PhanTuHuong
23-03-10, 05:06 PM
Không hiểu sao khi làm việc với VB6, tôi luôn bị lỗi này (Permission denied), dù code chỉ có đúng 2 dòng:


Private Sub Form_Load()
With CreateObject("Excel.Application")
End With
End Sub
Nguyên văn lỗi như thế này:

Các bạn có ai biết nguyên nhân là gì không?

Bác thử xem nội dung này xem sao, em thấy khá nhiều lỗi liên quan đến vấn đề của anh.

http://www.ntcompatible.com/Visual_Basic_6.0_-_Permission_Denied_-_Runtime_error_70_t28214.html

songlong89
06-05-11, 03:30 AM
Cảm ơn bác 'nguyentuhp ' vì bài hướng dẫn này, nhưng khi thực hiện em bị lỗi thế này "Namespace or type specified in the Imports 'Microsoft.Office.Interop' doesn't contain any public member or cannot be found...." tìm hiểu thấy là vì word của em là 2003. bác có thể chỉ cho em cách sửa lỗi này được không?

daocuongnbk
18-07-11, 12:23 PM
Trong Visual Basic 6.0 (VB6) hoặc VBA bạn có thể tạo và làm việc với một Workbook, ví dụ như sau:

Lưu ý: Để làm việc với đối tượng này, trong dự án của bạn phải tham chiếu đến đối tượng Microsoft Excel xx.0 Object Library (xx là số phiên bản Office trên máy của bạn)


Dim oXLApp as Excel.Application 'Khai báo đối tượng
Set oXLApp = New Excel.Application 'Tạo đối tượng Excel

' Bây giờ bạn có thể làm việc với oXLApp như là lớp ứng dụng (class)
' Để làm việc với lớp này đòi hỏi bạn phải có kiến thức cơ bản về nó, bao gồm: cấu trúc, thuộc tính, phương thức và sự kiện...

' Ví dụ:
oXLApp.Visible = True 'Hiện đối tượng
Debug.Print oXLApp.Name 'In ra cửa sổ Imediate tên của lớp
'Kết quả: Microsoft Excel
'...(your code here)
Set oXLApp = Nothing 'Giải phóng oXLApp khỏi bộ nhớ


____________________
Hiểu thêm về các thành phần (Components) và cấu trúc Microsoft Excel xx.0 Object Library , Click here (http://www.giaiphapexcel.com/forum/showthread.php?t=90)!
Tôi thấy hướng dẫn như trên của PhanTuHuong rất hay. Vậy làm sao mà kết nối với sheet có sẳn bảng tính của excel vào VB6

trung.aof
01-04-13, 09:57 PM
Liên kết giữa VST 2008 và office (Visual basic , Excel 2007)
1. Dạng nhúng: New Project à Office à chọn các dạng sau:
a. Excel 2007 Add-in
b. Excel 2007 Workbook
c. Excel 2007 Template
Đối với các ứng dụng office khác cũng làm tương tự. Các bạn có thể tham khảo bài viết của anh Hiền
2. Tạo thư viện liên kết
Bài viết của anh Hướng đã giới thiệu tạo thư viện DLL liên kết giữa VB6 và Excel.
Ở bài viết này tôi giới thiệu tạo thư viện từ VST 2008 (.NET Class Library) bằng 1 ví dụ cụ thể.
2.1. Tạo thư viện
2.1.1. Khởi động VST, New project à Visual basic à Class Library, chọn version .Net, đặt tên dự án HelloWordGPE à OK
Lúc này chương trình từ động tạo ra Class1.vb
Public Class Class1

End Class
2.1.2. Chèn thêm 1 Form mới cho dự án: Từ menu Project (hoặc từ biểu tượng Add New Item, hoặc từ cửa sổ Solution Explorer, chọn dự án, phải chuột hiện menu, chọn Add) à Add Window Form…
2.1.3. Tạo liên kết với Excel: Từ Menu Project à Add Reference à Com à Microsoft Excel 12.0 Library
2.1.4. Xóa toàn bộ code trong Class1.vb và thay bằng đoạn code sau:


<ComClass(Class1.ClassId, Class1.InterfaceId, Class1.EventsId)> Public Class Class1
Public Const ClassId As String = "057B80BB-565B-4ef0-94A4-48AA34E522E0"
Public Const InterfaceId As String = "67279AD6-4D9D-4caf-9E0D-1F6F54F15AEE"
Public Const EventsId As String = "F94C8B54-87A5-478b-8F61-E89D03044C5E"

Public Function ptb1(ByVal a As Double, ByVal b As Double, ByVal c As Double) As String
ptb1 = "Nghiệm của pt là x=" & ((c - b) / a).ToString
End Function

Public Sub showform()
Dim newfrm As New Form1
newfrm.Show()
End Sub

Public Sub MsgboxHello()
MsgBox("Chào mừng bạn đến với VST 2008")
End Sub

End Class

Ghi chú:
+ ClassId, InterfaceId, EventsId có thể lấy bằng cách: từ Menu Tool à Creat GUID
+ ptb1 à Tạo hàm giải pt bậc nhất
+ showform à Macro gọi Form1
2.1.5. Từ cửa sổ Solution Explorer double click vào Form1, cửa sổ Form1.vb[Design] hiện ra.
- Từ dụng cụ Toolbox tạo TextBox1, Button1, Button2, Button3
- Dùng chọn lần lượt các Button và đổi Text (nhãn – cách gọi cũ, VST 2008 chuyển thành Text) thành: Exit, Put Cell Value, Get Cell Value
2.1.6. Nháy chuột phải trên Form1, chọn View code, xóa toàn bộ code trong Form1.vb và Copy đoạn Code này vào


Imports Microsoft.Office.Interop
Imports System.Windows.Forms

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = "VST for Office"
Me.TextBox1.Text = "Nhập chữ vào đây và click Put Cell Value hoặc chọn cell, click Get Cell Value để lấy dữ liệu"
End Sub

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
Dim ExApp As Excel.Application
Dim btnclick As Button = CType(sender, Button)
Select Case btnclick.Name
Case "Button1"
Me.Close()
Case "Button2"
Try
ExApp = GetObject(, "Excel.Application")
Dim cel As Excel.Range = ExApp.ActiveCell
cel.Value = Me.TextBox1.Text
Catch ex As Exception
End Try
Case "Button3"
Try
ExApp = GetObject(, "Excel.Application")
Dim cel As Excel.Range = ExApp.ActiveCell
Me.TextBox1.Clear()
Me.TextBox1.Text = cel.Value.ToString
Catch ex As Exception
End Try
End Select

End Sub
End Class

2.1.7. Từ Menu Project à HelloWordGPE Properties (hoặc từ cửa sổ Solution Explorer, chọn dự án, phải chuột hiện menu, chọn Properties)
Chọn Compile* à Đánh dấu checkBox Regiter for Com Interop
2.1.8. Từ Menu Project à Build HelloWordGPE
Lúc này tại thư mục Dự án (vd: D:\My Documents\Visual Studio 2008\Projects\HelloWordGPE\HelloWordGPE\bin\Releas e\) có các files sau: HelloWordGPE.dll, HelloWordGPE.pdb, …
2.2. Sử dụng thư viện
2.2.1. Chạy Excel, Mở cửa sổ VBA, chèn Module1
2.2.2. Từ menu Tools à Preferences à Browse à chọn đường dẫn đến file HelloWordGPE.pdb
2.2.3. Copy các đoạn code sau vào trong Module1


Option Explicit

Function ptbac1(ByVal a As Double, ByVal b As Double, ByVal c As Double) As String
Dim pt As New HelloWordGPE.Class1
ptbac1 = pt.ptb1(a, b, c)
End Function

Sub ShowformVST()
Dim frmvb6 As New HelloWordGPE.Form1
frmvb6.Show
End Sub

Sub ShowmsgVST()
Dim loichao As New HelloWordGPE.Class1
loichao.MsgboxHello
End Sub

2.2.4. Sử dụng
Ví dụ này chúng ta đã sử dụng hàm, chạy Macro, hiện Form VST: Tương tác giữa Excel và Form từ thư viện.

2.1. Chú ý khi sử dụng thư viện DLL .Net
Để sử dụng thư viện trên các máy tính khác, chạy từ Dos dòng lệnh: regasm HelloWordGPE.dll /tlb: HelloWordGPE.dll.tlb
Từ file Excel nguồn bạn có thể save as thành Add-in để sử dụng cho các file khác.

Thêm một bước nữa tạo thư viện sử dụng như các hàm API của Windows bác nào biết Post lên cho anh em học hỏi nhé!

Toàn bộ File ví dụ kèm theo dưới đây
Chào anh
Em down file của anh về đăng ký và dùng thì bị lỗi như 2 hình ảnh trên, anh xem hộ là bị lỗi gì mà không dùng được. Em cảm ơn9938699387

ALU
17-05-13, 03:00 PM
Không hiểu sao khi làm việc với VB6, tôi luôn bị lỗi này (Permission denied), dù code chỉ có đúng 2 dòng:


Private Sub Form_Load()
With CreateObject("Excel.Application")
End With
End Sub
Nguyên văn lỗi như thế này:

Các bạn có ai biết nguyên nhân là gì không?

Chào anh,

Em hiện cũng bị lỗi này, không biết anh đã giải quyết thế nào xin anh giúp?

Cảm ơn anh,
Anmh

ndu96081631
17-05-13, 03:01 PM
Chào anh,

Em hiện cũng bị lỗi này, không biết anh đã giải quyết thế nào xin anh giúp?

Cảm ơn anh,
Anmh

Ngày trước tôi xài bản VB6 Portable thì bị lỗi này
Giờ cài VB6 đàng hoàng vào máy thì hết bị
Chả biết tại sao nữa

ALU
17-05-13, 03:10 PM
Ngày trước tôi xài bản VB6 Portable thì bị lỗi này
Giờ cài VB6 đàng hoàng vào máy thì hết bị
Chả biết tại sao nữa

Vâng,

Vậy chắc em cũng phải cài vào thôi, vì em cũng đang xài bản Portable..

Em cảm ơn,

thanhlanh
17-05-13, 04:34 PM
Vậy thì đến 99% là do sài VB6 Portable. Mình cũng đang bị vậy.
Câu lệnh này cũng bị lỗi đó: Set ExcelApp = New Excel.Application

Tuy nhiên lỗi chỉ xảy ra nhi ta chạy thử (run hoặc F5). Còn khi biên dịch ra file exe thì chạy bình thường.