Tách riêng file excel và code VBA (1 người xem)

  • Thread starter Thread starter vtt
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

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

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

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

Back
Top Bottom