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.

pycckuu410
02-04-15, 04:24 PM
Các bác cho em xin ý kiến trường hợp dùng code này với ạ:

-------------------------------------------
Sub Main()
Dim ExcelApp As Object
On Error Resume Next
Set ExcelApp = GetObject(, "Excel.Application")
If Err <> 0 Then
Err.Clear
Set ExcelApp = CreateObject("Excel.Application")
End If
ExcelApp.Visible = True
AppActivate ExcelApp.Caption
ExcelApp.Workbooks.Add
Set ExcelApp = Nothing
End Sub
-------------------------------------------

Sau khi dùng code này Excel chỉ mở mới 1 book và không có những add-ins đã được nạp vào chương trình từ trước. (Khi mở cửa sổ vba thì không thấy vbaproject của các add-ins đâu và cũng không dùng được những công thức của add-ins)
Mong các bác giúp để em có thể mở mới book và đồng thời excel nạp cả các add-ins đã được nạp từ trước (Dạng như kiểu tích đúp chuột để mở file ạ)

kieu manh
02-04-15, 06:57 PM
Các bác cho em xin ý kiến trường hợp dùng code này với ạ:

-------------------------------------------
Sub Main()
Dim ExcelApp As Object
On Error Resume Next
Set ExcelApp = GetObject(, "Excel.Application")
If Err <> 0 Then
Err.Clear
Set ExcelApp = CreateObject("Excel.Application")
End If
ExcelApp.Visible = True
AppActivate ExcelApp.Caption
ExcelApp.Workbooks.Add
Set ExcelApp = Nothing
End Sub
-------------------------------------------

Sau khi dùng code này Excel chỉ mở mới 1 book và không có những add-ins đã được nạp vào chương trình từ trước. (Khi mở cửa sổ vba thì không thấy vbaproject của các add-ins đâu và cũng không dùng được những công thức của add-ins)
Mong các bác giúp để em có thể mở mới book và đồng thời excel nạp cả các add-ins đã được nạp từ trước (Dạng như kiểu tích đúp chuột để mở file ạ)

Hình như bạn mới tập làm quen với VBA thì phải ....

Code đó sử dụng trên VB6 kết nối với Excel....vvv và không liên quan gì tới Add-ins cả

pycckuu410
03-04-15, 06:31 AM
Hình như bạn mới tập làm quen với VBA thì phải ....

Code đó sử dụng trên VB6 kết nối với Excel....vvv và không liên quan gì tới Add-ins cả

Hì hì. Đúng là mình chỉ sưu tầm code trên diễn đàn rồi chỉnh sửa theo công việc của mình. Và nhiều code của mình chỉ xoay quanh việc chèn công thức vào 1 ô và copy dán xuống những ô khác theo điều kiện nào đó thôi.
Code trên là mình áp dụng để tạo project mở 1 file xla rồi chạy 1 macro khởi động Và kết quả chạy bằng vb6 khác dùng macro khởi động trên excel như sau:
1. Các add=ins đã được nạp từ trước trên excel không được gọi mở. (ví dụ add đọc số thành chữ chẳng hạn)
- Cái này mình giải quyết bằng cách add.installed=False rồi lại add.installed=true rồi cho tìm lặp từ 1 đến add.coun
Nhưng cách giải quyết này lại nạp hết các add mà excel có, không phải những add active cần thiết.

2. Nếu Excel đang mở: Các menu mới từ xla của mình chỉ hiện ở workbook mới chứ không xuất hiện ở book hiện tại.

Mong các bác giúp đỡ để giải quyết 2 hạn chế kia với ạ!
Em mới làm quen với vba nên diễn đạt hơi khó hiểu mong các bác thông cảm ạ!
Em cám ơn!

kieu manh
03-04-15, 08:08 AM
Hì hì. Đúng là mình chỉ sưu tầm code trên diễn đàn rồi chỉnh sửa theo công việc của mình. Và nhiều code của mình chỉ xoay quanh việc chèn công thức vào 1 ô và copy dán xuống những ô khác theo điều kiện nào đó thôi.
Code trên là mình áp dụng để tạo project mở 1 file xla rồi chạy 1 macro khởi động Và kết quả chạy bằng vb6 khác dùng macro khởi động trên excel như sau:
1. Các add=ins đã được nạp từ trước trên excel không được gọi mở. (ví dụ add đọc số thành chữ chẳng hạn)
- Cái này mình giải quyết bằng cách add.installed=False rồi lại add.installed=true rồi cho tìm lặp từ 1 đến add.coun
Nhưng cách giải quyết này lại nạp hết các add mà excel có, không phải những add active cần thiết.

2. Nếu Excel đang mở: Các menu mới từ xla của mình chỉ hiện ở workbook mới chứ không xuất hiện ở book hiện tại.

Mong các bác giúp đỡ để giải quyết 2 hạn chế kia với ạ!
Em mới làm quen với vba nên diễn đạt hơi khó hiểu mong các bác thông cảm ạ!
Em cám ơn!
Mình cũng là dân mò học thôi ....nên bạn mô tả mình không hiểu hết nếu được bạn úp code bạn viết lên mình xem trong khả năng của mình ...nếu làm được mình giúp cho... Giúp bạn tức là tự giúp mình Vô tư đi

pycckuu410
03-04-15, 08:29 AM
Code của mình chỉ đơn giản thế này:
Mục đích cuối cùng của mình là mở file DT.xla (như giao tiếp bằng cách tích đúp chuột, hiện khung protect thì dán password vào), sau đó chạy 1 macro tạo menu trong file vừa mở.
Nhưng dùng cách này thì Menu chỉ tạo ra ở workbook mới chứ không xuất hiện ở những workbook đã mở từ trước!
--------------------------------------------------
Sub Main()
Dim ExcelApp As Object
Dim ExcelWkb As Excel.Workbook
Dim ketqua


On Error Resume Next
Set ExcelApp = GetObject("Excel.Application")
If Err <> 0 Then
Err.Clear
Set ExcelApp = CreateObject("Excel.Application")
End If
ExcelApp.Visible = True


ketqua = Encode("ABC")
ExcelApp.Workbooks.Open "C:\DT.xla", Password:=ketqua
Application.Run Macro:="DT.xla!khoidong"

End Sub

kieu manh
03-04-15, 09:02 AM
Code của mình chỉ đơn giản thế này:
Mục đích cuối cùng của mình là mở file DT.xla (như giao tiếp bằng cách tích đúp chuột, hiện khung protect thì dán password vào), sau đó chạy 1 macro tạo menu trong file vừa mở.
Nhưng dùng cách này thì Menu chỉ tạo ra ở workbook mới chứ không xuất hiện ở những workbook đã mở từ trước!
--------------------------------------------------
Sub Main()
Dim ExcelApp As Object
Dim ExcelWkb As Excel.Workbook
Dim ketqua


On Error Resume Next
Set ExcelApp = GetObject("Excel.Application")
If Err <> 0 Then
Err.Clear
Set ExcelApp = CreateObject("Excel.Application")
End If
ExcelApp.Visible = True


ketqua = Encode("ABC")
ExcelApp.Workbooks.Open "C:\DT.xla", Password:=ketqua
Application.Run Macro:="DT.xla!khoidong"

End Sub
ý bạn là từ VB6 mở File Add-ins "C:\DT.xla" và nhập pass vào đó rồi chạy Macro....nếu bạn làm vậy

thì chỉ Áp dụng cho File bạn mở thôi khi tắt đi thì tiêu luôn vì cái Này Password:=ketqua

VBA thì có gì mà Bảo mật chứ.... nếu đã làm trên VB6 thì Make nó sang *.dll đi cho rồi

làm thủ tục từ Excel mà Gọi nó chạy thôi

kieu manh
03-04-15, 09:15 AM
To pycckuu410
Ví dụ bạn làm một Add-ins đọc sorachu Make sang *.dll và Register Xong...

Thì từ Excel bạn chỉ cần chạy thủ tục như sau là OK



Sub AutoCheck_AddIns()
With ActiveWorkbook
Rem Check Automation\Ten File\"QLBHPN.DocSo"
AddIns.Add Filename:="QLBHPN.DocSo"
Rem Check Add-ins\Ten File\"QLBHPN.DocSo"
AddIns("QLBHPN.DocSo").Installed = True
End With
End Sub


Nếu làm biếng check bằng tay thì làm như trên--=0--=0--=0

pycckuu410
03-04-15, 02:02 PM
Uh, Cám ơn bạn giúp đỡ nhé, thực sự với những mem mới tiếp cận như mình thì sự giúp đỡ nhiệt tình của bạn cũng như các thành viên khác là rất đáng trân trọng!

Một số chương trình dự toán trên nền excel vẫn làm được. Và của mình cũng tương tự nhưng test mãi không giống cách open file của họ. Chắc là do liên quan đến ngôn ngữ lập trình nhiều hơn! Thôi đành an phận vậy.

À nói về bảo mật vba thì khó thật vì đã sử dụng đến vba thì ắt phải open file gốc lên. Thế nên mình viết project để kiểm tra mã md5 của file có vba+password open file, nếu md5 sai thì sẽ không mở file nữa. Do đó nếu password open file có tính bảo mật cao thì có thể yên tâm hơn một chút.

Bác nào muốn check thì vào đây tải file nhé: https://www.facebook.com/groups/1610050295899248/

kieu manh
03-04-15, 02:14 PM
Uh, Cám ơn bạn giúp đỡ nhé, thực sự với những mem mới tiếp cận như mình thì sự giúp đỡ nhiệt tình của bạn cũng như các thành viên khác là rất đáng trân trọng!

Một số chương trình dự toán trên nền excel vẫn làm được. Và của mình cũng tương tự nhưng test mãi không giống cách open file của họ. Chắc là do liên quan đến ngôn ngữ lập trình nhiều hơn! Thôi đành an phận vậy.

À nói về bảo mật vba thì khó thật vì đã sử dụng đến vba thì ắt phải open file gốc lên. Thế nên mình viết project để kiểm tra mã md5 của file có vba+password open file, nếu md5 sai thì sẽ không mở file nữa. Do đó nếu password open file có tính bảo mật cao thì có thể yên tâm hơn một chút.

Bác nào muốn check thì vào đây tải file nhé: https://www.facebook.com/groups/1610050295899248/
Nếu Bạn rành VB6 rồi thì mình khuyên viết code nên Make thành *.dll làm thủ tục call từ Excel là an toàn nhất Còn Pass Open Excel hay Add-ins Thì đọc lại Bài Của Bạn nha.... Pass Open phơi bày ra hết đó --=0--=0--=0

http://www.giaiphapexcel.com/forum/showthread.php?97263-C%C3%B3-c%C3%A1ch-n%C3%A0o-kh%C3%B4ng-cho-xem-code-trong-VBA-kh%C3%B4ng/page6

phihndhsp
03-04-15, 02:27 PM
VBA thì có gì mà Bảo mật chứ....
cái này hình như là không chuẩn lắm, người ta có thể dịch code VBA để cho bạn không bao giờ đọc được, mà chương trình vẫn chạy bình thường
bạn đọc được code VBA này không


Function k6ql6qm6qn6qo6qp6qq6qr6qs6qt6q()
Dim qxdrxdsxdtxduxdvxdwxdxxdyxdzxd As String
Dim m7hn7ho7hp7hq7hr7hs7ht7hu7hv7h: m7hn7ho7hp7hq7hr7hs7ht7hu7hv7h = 1
Dim irjrkrlrmrnrorprqrrr
Dim u6qv6qw6qx6qy6qz6qa7qb7qc7qd7q As Integer, ilastelibiglecol
Dim w5dx5dy5dz5da6db6dc6dd6de6df6d
On Error Resume Next
qxdrxdsxdtxduxdvxdwxdxxdyxdzxd = ActiveSheet.Name
Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Select
Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).PageSetup.P rintArea = "$B$1:$" & yzizzia_ib_ic_id_ie_if_ig_ih_i(ecrfcrgcrhcricrjcrk crlcrmcrncr) & "$" & idrjdrkdrldrmdrndrodrpdrqdrrdr
With ActiveSheet.PageSetup
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintInPlace
.Orientation = xlLandscape
.FirstPageNumber = xlAutomatic
.order = xlDownThenOver
.BlackAndWhite = False
.Zoom = 100
End With
ActiveWindow.View = xlPageBreakPreview
u6qv6qw6qx6qy6qz6qa7qb7qc7qd7q = Month(Cells(4, ubrvbrwbrxbrybrzbracrbcrccrdcr))
ilastelibiglecol = ubrvbrwbrxbrybrzbracrbcrccrdcr
irjrkrlrmrnrorprqrrr = ubrvbrwbrxbrybrzbracrbcrccrdcr + 1
Do
If Month(Cells(4, irjrkrlrmrnrorprqrrr)) = u6qv6qw6qx6qy6qz6qa7qb7qc7qd7q Then
If Columns(irjrkrlrmrnrorprqrrr).columnwidth > 0 Then
ilastelibiglecol = irjrkrlrmrnrorprqrrr
End If
Else
w5dx5dy5dz5da6db6dc6dd6de6df6d = yzizzia_ib_ic_id_ie_if_ig_ih_i(ilastelibiglecol + 1) & "2"
If ActiveSheet.VPageBreaks.Count < m7hn7ho7hp7hq7hr7hs7ht7hu7hv7h Then
ActiveSheet.VPageBreaks.Add before:=Range(yzizzia_ib_ic_id_ie_if_ig_ih_i(ecrfc rgcrhcricrjcrkcrlcrmcrncr) & "2")
End If
Set ActiveSheet.VPageBreaks(m7hn7ho7hp7hq7hr7hs7ht7hu7 hv7h).Location = Range(w5dx5dy5dz5da6db6dc6dd6de6df6d)
u6qv6qw6qx6qy6qz6qa7qb7qc7qd7q = Month(Cells(4, irjrkrlrmrnrorprqrrr))
m7hn7ho7hp7hq7hr7hs7ht7hu7hv7h = m7hn7ho7hp7hq7hr7hs7ht7hu7hv7h + 1
End If
irjrkrlrmrnrorprqrrr = irjrkrlrmrnrorprqrrr + 1
Loop Until irjrkrlrmrnrorprqrrr = ecrfcrgcrhcricrjcrkcrlcrmcrncr
ActiveWindow.View = xlNormalView
y9kz9kaalbalcaldalealfalgalhal
Sheets(kbrlbrmbrnbrobrpbrqbrrbrsbrtbr).Select
Sheets(kbrlbrmbrnbrobrpbrqbrrbrsbrtbr).PageSetup.P rintArea = "$B$1:$" & yzizzia_ib_ic_id_ie_if_ig_ih_i(ycrzcradrbdrcdrddre drfdrgdrhdr) & "$" & idrjdrkdrldrmdrndrodrpdrqdrrdr
ActiveWindow.View = xlPageBreakPreview
With ActiveSheet.PageSetup
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintInPlace
.Orientation = xlLandscape
.FirstPageNumber = xlAutomatic
.order = xlDownThenOver
.BlackAndWhite = False
.Zoom = 100
End With
u6qv6qw6qx6qy6qz6qa7qb7qc7qd7q = Month(Cells(4, ocrpcrqcrrcrscrtcrucrvcrwcrxcr))
ilastelibiglecol = ycrzcradrbdrcdrddredrfdrgdrhdr
m7hn7ho7hp7hq7hr7hs7ht7hu7hv7h = 1
irjrkrlrmrnrorprqrrr = ocrpcrqcrrcrscrtcrucrvcrwcrxcr + 1
Do
If Month(Cells(4, irjrkrlrmrnrorprqrrr)) = u6qv6qw6qx6qy6qz6qa7qb7qc7qd7q Then
If Columns(irjrkrlrmrnrorprqrrr).columnwidth > 0 Then
ilastelibiglecol = irjrkrlrmrnrorprqrrr
End If
Else
w5dx5dy5dz5da6db6dc6dd6de6df6d = yzizzia_ib_ic_id_ie_if_ig_ih_i(ilastelibiglecol + 1) & "2"
If ActiveSheet.VPageBreaks.Count < m7hn7ho7hp7hq7hr7hs7ht7hu7hv7h Then
ActiveSheet.VPageBreaks.Add before:=Range(yzizzia_ib_ic_id_ie_if_ig_ih_i(ycrzc radrbdrcdrddredrfdrgdrhdr) & "2")
End If
Set ActiveSheet.VPageBreaks(m7hn7ho7hp7hq7hr7hs7ht7hu7 hv7h).Location = Range(w5dx5dy5dz5da6db6dc6dd6de6df6d)
u6qv6qw6qx6qy6qz6qa7qb7qc7qd7q = Month(Cells(4, irjrkrlrmrnrorprqrrr))
m7hn7ho7hp7hq7hr7hs7ht7hu7hv7h = m7hn7ho7hp7hq7hr7hs7ht7hu7hv7h + 1
End If
irjrkrlrmrnrorprqrrr = irjrkrlrmrnrorprqrrr + 1
Loop Until irjrkrlrmrnrorprqrrr = ycrzcradrbdrcdrddredrfdrgdrhdr
ActiveWindow.View = xlNormalView
y9kz9kaalbalcaldalealfalgalhal
Sheets(qxdrxdsxdtxduxdvxdwxdxxdyxdzxd).Select
On Error GoTo 0
End Function
Function e7qf7qg7qh7qi7qj7qk7ql7qm7qn7q()
Dim o7qp7qq7qr7qs7qt7qu7qv7qw7qx7q As Boolean
If Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Cells(3, g6ih6ii6ij6ik6il6im6in6io6ip6i) = "" Then
If Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Cells(5, g6ih6ii6ij6ik6il6im6in6io6ip6i).HasFormula Then
o7qp7qq7qr7qs7qt7qu7qv7qw7qx7q = True
End If
Else
If Not Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Cells(5, g6ih6ii6ij6ik6il6im6in6io6ip6i).HasFormula Then
o7qp7qq7qr7qs7qt7qu7qv7qw7qx7q = True
End If
End If
If Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Cells(3, q6ir6is6it6iu6iv6iw6ix6iy6iz6i) = "" Then
If Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Cells(5, q6ir6is6it6iu6iv6iw6ix6iy6iz6i).HasFormula Then
o7qp7qq7qr7qs7qt7qu7qv7qw7qx7q = True
End If
Else
If Not Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Cells(5, q6ir6is6it6iu6iv6iw6ix6iy6iz6i).HasFormula Then
o7qp7qq7qr7qs7qt7qu7qv7qw7qx7q = True
End If
End If
If o7qp7qq7qr7qs7qt7qu7qv7qw7qx7q Then
Call alhblhclhdlhelhflhglhhlhilhjlh(CBool(qmgrmgsmgtmgu mgvmgwmgxmgymgzmg(y4fz4fa5fb5fc5fd5fe5ff5fg5fh5f, kdgldgmdgndgodgpdgqdgrdgsdgtdg, False, False)))
Call inhjnhknhlnhmnhnnhonhpnhqnhrnh(CBool(qmgrmgsmgtmgu mgvmgwmgxmgymgzmg(g7fh7fi7fj7fk7fl7fm7fn7fo7fp7f, kdgldgmdgndgodgpdgqdgrdgsdgtdg, False, False)))
End If
End Function
Function y7qz7qa8qb8qc8qd8qe8qf8qg8qh8q()
Dim i8qj8qk8ql8qm8qn8qo8qp8qq8qr8q As Double
Dim s8qt8qu8qv8qw8qx8qy8qz8qa9qb9q As Double
Const c9qd9qe9qf9qg9qh9qi9qj9qk9ql9q = 29
Const m9qn9qo9qp9qq9qr9qs9qt9qu9qv9q = 0.33
i8qj8qk8ql8qm8qn8qo8qp8qq8qr8q = w9qx9qy9qz9qaarbarcardarearfar
If i8qj8qk8ql8qm8qn8qo8qp8qq8qr8q < c9qd9qe9qf9qg9qh9qi9qj9qk9ql9q Then
s8qt8qu8qv8qw8qx8qy8qz8qa9qb9q = c9qd9qe9qf9qg9qh9qi9qj9qk9ql9q - (i8qj8qk8ql8qm8qn8qo8qp8qq8qr8q - Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Columns(14) .columnwidth)
Call kwjlwjmwjnwjowjpwjqwjrwjswjtwj(abrbbrcbrdbrebrfbrg brhbribrjbr, True)
Call kwjlwjmwjnwjowjpwjqwjrwjswjtwj(kbrlbrmbrnbrobrpbrq brrbrsbrtbr, True)
Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Columns(14) .columnwidth = s8qt8qu8qv8qw8qx8qy8qz8qa9qb9q
Sheets(kbrlbrmbrnbrobrpbrqbrrbrsbrtbr).Columns(14) .columnwidth = s8qt8qu8qv8qw8qx8qy8qz8qa9qb9q
Call awjbwjcwjdwjewjfwjgwjhwjiwjjwj(abrbbrcbrdbrebrfbrg brhbribrjbr)
Call awjbwjcwjdwjewjfwjgwjhwjiwjjwj(kbrlbrmbrnbrobrpbrq brrbrsbrtbr)
Else
If (i8qj8qk8ql8qm8qn8qo8qp8qq8qr8q - Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Columns(14) .columnwidth) > c9qd9qe9qf9qg9qh9qi9qj9qk9ql9q Then
If Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Columns(14) .columnwidth <> m9qn9qo9qp9qq9qr9qs9qt9qu9qv9q Then
Call kwjlwjmwjnwjowjpwjqwjrwjswjtwj(abrbbrcbrdbrebrfbrg brhbribrjbr, True)
Call kwjlwjmwjnwjowjpwjqwjrwjswjtwj(kbrlbrmbrnbrobrpbrq brrbrsbrtbr, True)
Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Columns(14) .columnwidth = m9qn9qo9qp9qq9qr9qs9qt9qu9qv9q
Sheets(kbrlbrmbrnbrobrpbrqbrrbrsbrtbr).Columns(14) .columnwidth = m9qn9qo9qp9qq9qr9qs9qt9qu9qv9q
Call awjbwjcwjdwjewjfwjgwjhwjiwjjwj(abrbbrcbrdbrebrfbrg brhbribrjbr)
Call awjbwjcwjdwjewjfwjgwjhwjiwjjwj(kbrlbrmbrnbrobrpbrq brrbrsbrtbr)
End If
End If
End If
End Function
Function w9qx9qy9qz9qaarbarcardarearfar() As Double
Dim irjrkrlrmrnrorprqrrr, garhariarjarkarlarmarnaroarpar As Double
garhariarjarkarlarmarnaroarpar = 0
For irjrkrlrmrnrorprqrrr = 1 To 14
garhariarjarkarlarmarnaroarpar = garhariarjarkarlarmarnaroarpar + Sheets(abrbbrcbrdbrebrfbrgbrhbribrjbr).Columns(irj rkrlrmrnrorprqrrr).columnwidth
Next irjrkrlrmrnrorprqrrr
w9qx9qy9qz9qaarbarcardarearfar = garhariarjarkarlarmarnaroarpar
End Function

kieu manh
03-04-15, 02:34 PM
phihndhsp (http://www.giaiphapexcel.com/forum/member.php?267708-phihndhsp)



Vụ này mình chưa nhìn trên VBA bao giờ nên chưa tin .... còn họ viết xong rồi biên dịch nó qua mã máy hay gì gì .... thì mình không biết mà không quan tâm làm gì ...

pycckuu410
03-04-15, 02:38 PM
Nếu Bạn rành VB6 rồi thì mình khuyên viết code nên Make thành *.dll làm thủ tục call từ Excel là an toàn nhất Còn Pass Open Excel hay Add-ins Thì đọc lại Bài Của Bạn nha.... Pass Open phơi bày ra hết đó --=0--=0--=0

http://www.giaiphapexcel.com/forum/showthread.php?97263-C%C3%B3-c%C3%A1ch-n%C3%A0o-kh%C3%B4ng-cho-xem-code-trong-VBA-kh%C3%B4ng/page6


Cách đó mình đã làm được rồi. Thế nên mình làm thêm code check md5. Bạn check thử sẽ rõ.

kieu manh
03-04-15, 03:15 PM
Cách đó mình đã làm được rồi. Thế nên mình làm thêm code check md5. Bạn check thử sẽ rõ.
Tải về phải setup ngại lắm nên không check làm gì .....chúc bạn Vững bước thành công với chương trình của mình nha