Tách riêng file excel và code VBA

Liên hệ QC

vtt

Thành viên mới
Tham gia
19/12/06
Bài viết
38
Được thích
29
Tôi có 1 file excel có code VBA với các tính năng : sử dụng menu, form...
Vấn đề là kích thước file khá lớn, lại hay gởi file cho người khác nên rất mất thời gian và dễ để lộ code vì quên xóa đi phần code.
Vậy nhờ các bạn chỉ dùm cách tách riêng 2 phần này ra (theo tôi nghĩ là chuyển phần code thành một dạng add-ins sao cho có nó thể thao tác trên 1 file excel khác không chứa code).
Mong được giúp đỡ. Cảm ơn!
 
Tôi có 1 file excel có code VBA với các tính năng : sử dụng menu, form...
Vấn đề là kích thước file khá lớn, lại hay gởi file cho người khác nên rất mất thời gian và dễ để lộ code vì quên xóa đi phần code.
Vậy nhờ các bạn chỉ dùm cách tách riêng 2 phần này ra (theo tôi nghĩ là chuyển phần code thành một dạng add-ins sao cho có nó thể thao tác trên 1 file excel khác không chứa code).
Mong được giúp đỡ. Cảm ơn!
- Để lấy code ra riêng, chỉ cần Export là được (menu File\Export file trong cửa sổ VBA)
- Đẻ xóa code, dễ nhất là save thành file xlsx (Excel 2007) ---> Code sẽ tự động bị xóa
 
Upvote 0
Cảm ơn anh.
Nhưng không đúng ý của tôi.
Tôi muốn tách code thành một dạng add-ins (hay đại loại là 1 cái gì đó). Phần này chứa code để điều khiển chương trình. Nó là 1 file duy nhất nằm trên máy tính.
Phần chứa dữ liệu, các bảng tính là 1 file riêng biệt, mỗi tháng là 1 file khác nhau, mỗi công trình là 1 file khác nhau, mỗi khách hàng là 1 file khác nhau... Tất nhiên là các file này có cấu trúc giống nhau để phần code chạy đúng.
 
Lần chỉnh sửa cuối:
Upvote 0
[Quoc te]Để lấy code ra riêng, chỉ cần Export là được (menu File\Export file trong cửa sổ VBA)[/Quoc te]

Th­ưa thày, xuất ra theo kiểu này (đuôi.bas) có lợi gì hơn so với việc Copy Code dán ra Word không?
 
Upvote 0
Th­ưa thày, xuất ra theo kiểu này (đuôi.bas) có lợi gì hơn so với việc Copy Code dán ra Word không?
Cũng không biết nữa, nhưng nếu làm theo cách của tôi thì mai này muốn "nạp" trở lại, chỉ việc Import từ bas file là xong!
(tất nhiên, bạn muốn copy paste ra word thì.. tùy )
--------------------------------
Cảm ơn anh.
Nhưng không đúng ý của tôi.
Tôi muốn tách code thành một dạng add-ins (hay đại loại là 1 cái gì đó). Phần này chứa code để điều khiển chương trình. Nó là 1 file duy nhất nằm trên máy tính.
Phần chứa dữ liệu, các bảng tính là 1 file riêng biệt, mỗi tháng là 1 file khác nhau, mỗi công trình là 1 file khác nhau, mỗi khách hàng là 1 file khác nhau... Tất nhiên là các file này có cấu trúc giống nhau để phần code chạy đúng.
Cái này tôi thât sự không biết... vì có thấy code của bạn thế nào đâu mà hình dung ra cách làm
 
Upvote 0
Theo em nghĩ nếu file chỉ có vtt dùng thì thế nào chẳng có "ThisWorkbook" vậy cứ lưu code thành Addin rồi chuyển chỗ nào dùng "ThisWorkbook" thay bằng "ActiveWorkbook" dùng cho Workbook hiện hành là được.
 
Upvote 0
Nếu bạn dùng excell 2007 thì download goi GUI office ve va tạo add-in. Ở dạng menu, khi nào bạn chạy xong và save vào thi file đó cũng không có code va tiện cho bạn làm việc nhiều.
 
Upvote 0
Cái này tôi thât sự không biết... vì có thấy code của bạn thế nào đâu mà hình dung ra cách làm

Khó quá! Nói làm sao cho mọi người hiểu đây nhỉ? Vấn đề này tôi đã gặp rồi. Nếu ai đã từng làm dự toán trong ngành điện lực ở HCM thì biết chương trình tính dự toán bằng Excel theo kiểu này. Tôi xin dựa vào chương trình này để giải thích (lâu rồi không sử dụng nó nữa).

Ví dụ chương trình quản lý kho vật tư đơn giản như thế này:

1. Từ excel, chọn menu Open để mở 1 file (hình như là file .xla, file này chứa mã nguồn)

2. File .xla này sẽ mở ra 1 form cho phép chọn file data.xls và file work.xls

File data.xls chứa các thông tin gốc gồm:
- Mã vật tư, tên và quy cách vật tư.
- Mã khách hàng, Tên khách hàng
- Toàn bộ thông tin nhập, xuất vật tư, đơn giá nhập/xuất ...

File work.xls chứa các thông tin được trích xuất từ file data như:
- Bảng xuất nhập tồn vật tư, liệt kê vật tư xuất/ nhập.... => để báo cáo.
- Phiếu xuất kho, thông tin công nợ => để gởi khách hàng.

2 file này hoàn toàn không chứa mã nguồn, chỉ có các sheet trống được thiết kế sẵn.

3. Các thao tác lập phiếu nhập/ xuất kho, lập các báo cáo, thống kê đều được thiết kế bằng VBA. Thông tin gốc được lưu trữ ở file data.xls, thông tin dùng để báo cáo, cần gởi đi sẽ được lưu ở file work.xls
-----

Vấn đề là cách tách ra làm 3 file khác nhau như thế nào thôi. Rõ ràng không cần biết code như thế nào.

Hy vọng mọi người hiểu được. &&&%$R
 
Upvote 0
Khó quá! Nói làm sao cho mọi người hiểu đây nhỉ? Vấn đề này tôi đã gặp rồi. Nếu ai đã từng làm dự toán trong ngành điện lực ở HCM thì biết chương trình tính dự toán bằng Excel theo kiểu này. Tôi xin dựa vào chương trình này để giải thích (lâu rồi không sử dụng nó nữa).

Ví dụ chương trình quản lý kho vật tư đơn giản như thế này:

1. Từ excel, chọn menu Open để mở 1 file (hình như là file .xla, file này chứa mã nguồn)

2. File .xla này sẽ mở ra 1 form cho phép chọn file data.xls và file work.xls

File data.xls chứa các thông tin gốc gồm:
- Mã vật tư, tên và quy cách vật tư.
- Mã khách hàng, Tên khách hàng
- Toàn bộ thông tin nhập, xuất vật tư, đơn giá nhập/xuất ...

File work.xls chứa các thông tin được trích xuất từ file data như:
- Bảng xuất nhập tồn vật tư, liệt kê vật tư xuất/ nhập.... => để báo cáo.
- Phiếu xuất kho, thông tin công nợ => để gởi khách hàng.

2 file này hoàn toàn không chứa mã nguồn, chỉ có các sheet trống được thiết kế sẵn.

3. Các thao tác lập phiếu nhập/ xuất kho, lập các báo cáo, thống kê đều được thiết kế bằng VBA. Thông tin gốc được lưu trữ ở file data.xls, thông tin dùng để báo cáo, cần gởi đi sẽ được lưu ở file work.xls
-----

Vấn đề là cách tách ra làm 3 file khác nhau như thế nào thôi. Rõ ràng không cần biết code như thế nào.

Hy vọng mọi người hiểu được. &&&%$R

bạn gửi cho file mẫu được không?
Cám ơn
 
Upvote 0
Theo tôi bạn add thêm cái code gửi mail. Khi gửi nó tạo 1 file xlsx rồi bắn đi.
 
Upvote 0
Chào bác,

Em hiểu ý của bác như thế này:

bác cần 1 file excel chứa logic để xử lý dữ liệu từ 1 file data, sau khi xử lý xong dữ liệu này, "chương trình" này sẽ xuất ra 1 file khác để gửi cho khách hàng.

Bác có thể tham khảo 2 files em đã upload lên đây, bác download về, cho 2 file vào cùng 1 thư mục, nhớ cho thư mục này vào Trust Center để có thể chạy được macro:

1. data.xls : file này sẽ chứa dữ liệu của bác. File này có 1 đoạn macro đơn giản để làm nhiệm vụ nói cho chính nó biết là nó nên lấy macro ở đâu:

PHP:
Private Sub Workbook_Open()    
    Dim duongDanDenFileMacro As String    
    duongDanDenFileMacro = ActiveWorkbook.Path & "\" & macroFile    
    Set macroFileAndPath = Workbooks().Open(duongDanDenFileMacro, ReadOnly:=True, AddToMru:=False)
    Application.Windows(macroFile).Visible = False
End Sub
Private Sub Workbook_BeforeClose(cancel As Boolean)    
  On Error Resume Next    
  Set macroFileAndPath = Workbooks(macroFile)    
  macroFileAndPath.Close (False)
End Sub

trong trường hợp này để cho đơn giản em lấy đường dẫn bằng cách sử dụng ActiveWorkbook.Path tên file có chứa macro (logic) được lưu trong biến macroFile như đã thấy.

2. macroFile.xls: file này sẽ chứa logic hay các Function hay Sub của bác.

để gọi được macro/ Sub trong file này từ file data.xls ta dùng:

PHP:
run macroFile & "!test"

với test là tên sub lưu trong macroFile.xls

Chúc bác thành công, nếu có câu hỏi gì bác có thể PM qua kênh YouTube của em
 

File đính kèm

  • data.xls
    41 KB · Đọc: 99
  • macroFile.xls
    30.5 KB · Đọc: 70
Lần chỉnh sửa cuối:
Upvote 0
Chào bác,

Bác có thể tham khảo 2 files em đã upload lên đây, bác download về, cho 2 file vào cùng 1 thư mục, nhớ cho thư mục này vào Trust Center để có thể chạy được macro:
Chúc bác thành công, nếu có câu hỏi gì bác có thể PM qua kênh YouTube của em

Cảm ơn nhiều.
Tôi đã đọc và hiểu những gì có trong 2 file demo của bạn.
Vì là demo nên nó rất đơn giản, dễ hiểu.

Nay tôi muốn hỏi thêm

Tôi đã làm 1 file kiểu như file Data.xls của bạn. Trong đó có nhiều sự kiện (chủ yếu là kích chuột phải) của nhiều sheets.

Nếu áp dụng như demo của bạn thì các sub sự kiện phải chỉnh sửa thế nào.

Cảm on
 
Upvote 0
Tôi không chủ trương giấu giếm cái gì cả cho nên đừng hiểu lầm. Đây là nói có những trường hợp tôi không muốn cho người dùng chạy code vì lý do nguy hiểm nào đó.

Cách dễ nhất là không giấu giếm gì cả. Những subs/functions trong file chỉ là những cái vỏ. Những code chính thức làm việc chứa trong file PERSONAL. Những hàm vỏ trong file gọi hàm từ PERSONAL để làm việc.

Thật ra tôi có rất nhiều file PERSONAL. Mỗi lần xài xong thì tôi đổi tên nó, khỏi lộn xộn.
 
Upvote 0
Tôi không chủ trương giấu giếm cái gì cả cho nên ...

Tôi không hiểu bạn nói gì.

Bây giờ là 19:50, 3-1-15. Tôi xin bổ sung thêm ý nghĩa của việc mình làm

Tôi nhận giúp xử lý một số công việc bằng dùng các sự kiện trên file dữ liệu sẵn có của người khác. Hai bên thống nhất cứ làm từ từ, hoàn thiện dần.

Như vậy, cứ mỗi khi cần "nâng cấp" tôi lại phải mở file dữ liệu của người ta, xoá code cũ, chép code mới vô cho từng sheets

Cho nên, nếu để mã riêng khỏi dữ liệu (điều đang cần giúp đỡ) thì tôi chỉ cần chép file chứa code cho họ là xong.

Có thể có các cách khác như tạo file Bas, nhưng mỗi sheets là phải có file bas riêng về sự kiện của sheet đó, nên cũng chưa chắc đã nhanh bằng chép cả file chứa code. Và cũng có thể còn giải pháp khác mà tôi chưa nhận ra.

Hy vọng với việc nêu rõ ý nghĩa của công việc sẽ sớm có giúp đỡ.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh.
Nhưng không đúng ý của tôi.
Tôi muốn tách code thành một dạng add-ins (hay đại loại là 1 cái gì đó). Phần này chứa code để điều khiển chương trình. Nó là 1 file duy nhất nằm trên máy tính.
Phần chứa dữ liệu, các bảng tính là 1 file riêng biệt, mỗi tháng là 1 file khác nhau, mỗi công trình là 1 file khác nhau, mỗi khách hàng là 1 file khác nhau... Tất nhiên là các file này có cấu trúc giống nhau để phần code chạy đúng.

tui vẫn thường làm vậy. việc lưu thành addin thì tự excel làm. Còn từ addin tác động lên file excel khác thì phải dùng class moduls để bắt các event bên activeworkbook. bạn có thể tham khảo cách dùng class trong đoạn code dưới đây, và tra thêm trong diễn đàn các bài về class.
Mã:
Option Explicit
 
Dim WithEvents DNTWorkbook As Application
 
Public Sub Class_Initialize()
    Set DNTWorkbook = Application
End Sub
 
Public Sub Class_Terminate()
    Set DNTWorkbook = Nothing
End Sub
 
Private Sub DNTWorkbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    ‘do something
End Sub
 
Private Sub DNTWorkbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    ‘do something
End Sub
 
Private Sub DNTWorkbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    ‘do something
End Sub
ví dụ vài cái, còn rất nhiều events khác nữa có sẵn trong class modules.
để thay thế cho các oleobjects trong các sheets, thì có thể dùng các forms chứa chúng (trong addin).

@ndu: rất ngạc nhiên là ndu không biết vụ này.
 
Upvote 0
... rất ngạc nhiên là [tên] không biết vụ này.

Tôi thì rất ngạc nhiên là một người chuyên gia phần mềm lại nói câu này.
Ba cái mớ bòng bong này thuộc về cách thức cài đặt. Phải hiểu rõ 100% điều kiện môi trường mới biết cách thức phù hợp. Điều này đã là chuyên gia thì biết rõ.

(*) tôi cố tình đóng khung [tên] để tỏ ý rằng ai cũng vậy, không cứ gì người liên hệ trong bài này. Có thể người liên hệ biết rất rõ cách thức nhưng không hiểu chủ thớt hỏi cái quái gì.

Trước mắt là thớt này tự dưng 1 vấn đề có những 2 người hỏi. Tôi còn chưa hiểu yêu cầu của người 2 có giống của người 1 hay không.
 
Upvote 0
Chắc lá Bác phải viết thêm code tạo file mới rồi copy và paste các sheet từ file có Code sang các sheet của file mới (Copy cả định dạng của nó). Rồi làm việc trên file mới (Activeworkbook) và các sheet mới (Activesheet). File có Code là (Thisworkbook).
 
Upvote 0
Tôi thì rất ngạc nhiên là một người chuyên gia phần mềm lại nói câu này.
Ba cái mớ bòng bong này thuộc về cách thức cài đặt. Phải hiểu rõ 100% điều kiện môi trường mới biết cách thức phù hợp. Điều này đã là chuyên gia thì biết rõ.

(*) tôi cố tình đóng khung [tên] để tỏ ý rằng ai cũng vậy, không cứ gì người liên hệ trong bài này. Có thể người liên hệ biết rất rõ cách thức nhưng không hiểu chủ thớt hỏi cái quái gì.

Trước mắt là thớt này tự dưng 1 vấn đề có những 2 người hỏi. Tôi còn chưa hiểu yêu cầu của người 2 có giống của người 1 hay không.

thực lòng tui nể ndu lắm, cứ nghĩ là cái gì ndu cũng biết nên mới nói vậy. Tui cũng hết sức khâm phục VetMini – một chuyên gia thực thụ (có điều hơi kỹ tính, chắc đang làm nghề giáo?)
 
Upvote 0
... (có điều hơi kỹ tính, chắc đang làm nghề giáo?)

Không, cái tính kỹ của tôi có từ hồi tôi còn làm việc với kiểm toán.
Mấy người quản lý đồ án hay nhờ tôi xem lại lô gíc của phần mềm trước khi chấp nhận, tuy nhiên cũng không phải nghề chính. Chỉ là tôi có cái đặc điểm hệ thống nào có sơ suất lớn, qua tôi thì lòi ra.
 
Upvote 0
Web KT

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

Back
Top Bottom