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!
 
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.

Giời ạ, lại gặp kiểm toán nữa. Hồi còn làm KTT có dịp làm việc với kiểm toán, thật đáng đồng tiền bát gạo, dưng mà mệt lắm. Hy vọng có dịp offline.
 
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:

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:
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

Xin hỏi: trong test (là tên sub lưu trong macroFile.xls) tôi muốn
1. Chép vùng a1:a4 của sheet1 của data vô vùng b2:b6 của sheet2, cũng của data thì mã lệnh viết thêm vô test thế nào
(tôi đã viết: [a1:a4].copy destination:=sheet2.[b2] thì nó chép vô sheet2 nhưng của file macroFile.xls. chú ý là sheet1 của file data là sheet hoạt động)

2. Vẫn sheet1 của file data là sheet hoạt động, tôi muốn lấy giá trị của 1 ô của sheet khác của Data (hoặc của macroFile) vô 1 biến thì mã lệnh thế nào.
(viết n=[a1] thì n nhận giá trị ô a1 của sheet hoạt động, nếu viết n=sheet2.[a1] hoặc n = data!sheet2.[a1] thì báo lỗi)
Xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Xin hỏi: trong test (là tên sub lưu trong macroFile.xls) tôi muốn
1. Chép vùng a1:a4 của sheet1 của data vô vùng b2:b6 của sheet2, cũng của data thì mã lệnh viết thêm vô test thế nào
(tôi đã viết: [a1:a4].copy destination:=sheet2.[b2] thì nó chép vô sheet2 nhưng của file macroFile.xls. chú ý là sheet1 của file data là sheet hoạt động)

2. Vẫn sheet1 của file data là sheet hoạt động, tôi muốn lấy giá trị của 1 ô của sheet khác của Data (hoặc của macroFile) vô 1 biến thì mã lệnh thế nào.
(viết n=[a1] thì n nhận giá trị ô a1 của sheet hoạt động, nếu viết n=sheet2.[a1] hoặc n = data!sheet2.[a1] thì báo lỗi)
Xin cảm ơn

em không chắc hiểu bác muốn copy qua lại thế nào. Nhưng 1 vài lưu ý, có thể sẽ giúp bác khắc phục lỗi sai ở đây là:
1. Luôn luôn dùng địa chỉ đầy đủ (fully qualified name). VD: thay vì dùng [a1:a4] thì hãy dùng Workbooks.Sheets("Tên Sheet").Range("A1:A4")
2. nếu viết sheet2.[a1] như trên có lỗi thì lỗi gì? Thường là những lỗi này sẽ được viết bằng tiếng Anh, lên mạng sẽ có nhiều người nói về lỗi đó rồi nên sẽ rất dễ dàng để tìm ra câu trả lời. Thay vì dùng n = sheet2.[a1], bác thử cách như ở 1. xem sao.

Chúc thành công.
 
Upvote 0
Excel_Code.gifTôi đã làm được.

Số là thế này: khi mở code của file Excel, ta thấy cửa sổ Project, chứa các tên Sheet, một tên có dạng Sheet1, Sheet2... và tên đặt trong ngoặc (nếu có đổi tên sheet thì đó là tên đã đổi). Tôi tạm gọi là tên gốc và tên đổi. Xem hình đính kèm.

Tôi vẫn dùng "tiếp đầu ngữ" Sheets("Tên sheet đã đổi") để truy cập đến sheet tương ứng. Ví dụ
Sheets("AB").range("a1:a10").copy destination:=sheets("Sheet2").range("c1")
hay ngắn hơn
Sheets("AB").[a1:a10].copy destination:=sheets("Sheet2").[c1]

Cũng do đọc trên GPE, có thể dùng tên gốc kèm dấu chấm để truy cập thì ngắn hơn. Cũng ví dụ trên:
Sheet1.[a1:a10].copy destination:=Sheet2.[c1]
Cách làm này hay vì người dùng thoải mái đổi tên sheet (không tính đổi trong cửa sổ Properties trong cửa sổ code - mấy ai làm thế)

Sẽ không phải hỏi gì nếu không muốn tách data và code riêng ra. Lý do để tách đơn giản là để sửa code thì không phải mở file, xoá code cũ, chép code mới mà chỉ cần copy file chứa code vô.

Và cách viết dùng tên sheet gốc bị lỗi.
Làm lại cách viết đầy đủ mà Kuldokk nêu là được.
 
Lần chỉnh sửa cuố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
Làm thế nào không mở file macroFile mà file data vẫn chạy ?
 
Upvote 0
Theo tôi thế này:
Bước 1: Copy file ra 1 file khác, đặt tên gì đó tùy bạn
Bước 2: mở file vừa copy, xóa sạch sẽ các sheet, để lại 1 sheet trống thôi.
Bước 3: save as thành 1 add-ins
Bước 4: Nạp add-ins
Bước 5: Copy file gốc thành 1 file khác nữa, xóa sạch code trong modul, xóa sạch form, là file chứa dữ liệu
Bước 6: sửa code trên add-ins để chạy được trên file chứa dữ liệu.
Kinh nghiệm: với những cv lặp đi lặp lại, nên thiết kế add-ins, việc nâng cấp các phiên bản, chỉnh sửa dễ dàng hơn nhiều so với việc viết trực tiếp trên file.
 
Upvote 0
Web KT

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

Back
Top Bottom