Lập trình VBA tạo BS TreeView unicode và Task Pane

Quảng cáo

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
4,357
Được thích
3,016
Điểm
1,568
Nơi ở
IIIIIIIIIIIIIIIII

File đính kèm

  • Book1.rar
    1.5 MB · Đọc: 17

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
4,008
Được thích
6,363
Điểm
2,568
Em đính kèm File *.OCX vào Excel vậy có cách nào mình viết code xuất File đó ra Folder được ko Anh
View attachment 199842
Thế này thì tôi cũng chưa biết. Vì thế tôi tự tạo cho mình cách khác: Đặt trên sheet 1 Image (developer -> Insert -> ActiveX Controls -> Image) -> dùng code để chèn tập tin bất kỳ (text, jpg, exe, dll, ocx, xml ...) vào Image. Khi cần thì bung tập tin từ Image ghi vào đĩa cứng rồi sử dụng. Sau khi sử dụng thì xóa tập tin trên đĩa (hoặc không xóa)
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
4,357
Được thích
3,016
Điểm
1,568
Nơi ở
IIIIIIIIIIIIIIIII
Thế này thì tôi cũng chưa biết. Vì thế tôi tự tạo cho mình cách khác: Đặt trên sheet 1 Image (developer -> Insert -> ActiveX Controls -> Image) -> dùng code để chèn tập tin bất kỳ (text, jpg, exe, dll, ocx, xml ...) vào Image. Khi cần thì bung tập tin từ Image ghi vào đĩa cứng rồi sử dụng. Sau khi sử dụng thì xóa tập tin trên đĩa (hoặc không xóa)
vậy mình xuất file đó ra bằng code hay sao Anh ... Anh chỉ cho em học với
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
4,008
Được thích
6,363
Điểm
2,568
vậy mình xuất file đó ra bằng code hay sao Anh ... Anh chỉ cho em học với
Trong tập tin ví dụ nếu nhấn "Play video clip" thì sẽ xem một clip hay.

Tập tin video trước đó tôi đã nhồi vào Image với tên là MySecretImage. Code trong SaveVideoAndPlay cho thấy cách lấy nội dung từ Image MySecretImage rồi ghi ra đĩa, rồi chạy video đó.

Cách nhồi nội dung vào Image: chạy Sub FileToBitmapFile với FileName là đường dẫn tới tập tin cần nhồi. Code sẽ tạo 1 bitmap (nhái) và ghi trên đĩa với đường dẫn saveFilename. Nếu PictureName <> "" thì code thêm 1 Image trên ActiveSheet và đặt tên là PictureName (của tôi là MySecretImage), sau đó code nhồi bitmap (nhái) vừa ghi trên đĩa vào Image.

Sau này muốn lấy ra đĩa thì làm y hệt như trong SaveVideoAndPlay, tất nhiên không ghi thành CafeSuaNong.wmv mà là vd. hehe.DLL, blala.EXE, hichic.OCX v...v

Để xem được những comment của tôi trong VBE thì: Tools -> Options -> thẻ Editor format -> trong mục Font chọn Times New Roman (vietnamese). Muốn viết comment tiếng Việt bằng Unikey thì chọn bảng mã windows_1258

Nói là bitmap nhái nhưng về mặt cấu trúc thì đó là bitmap thực sự và có thể mở xem bằng các chương trình đồ họa. Chỉ có điều ảnh không có gì hấp dẫn vì nó chỉ là những chấm nhiều mầu thôi.

Nhầm tập tin. Link dưới

http://www.mediafire.com/file/fn4h2y1f1i35zc4/SaveBinary.xlsb/file
 
Lần chỉnh sửa cuối:

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
4,357
Được thích
3,016
Điểm
1,568
Nơi ở
IIIIIIIIIIIIIIIII
Trong tập tin ví dụ nếu nhấn "Play video clip" thì sẽ xem một clip hay.

Tập tin video trước đó tôi đã nhồi vào Image với tên là MySecretImage. Code trong SaveVideoAndPlay cho thấy cách lấy nội dung từ Image MySecretImage rồi ghi ra đĩa, rồi chạy video đó.

Cách nhồi nội dung vào Image: chạy Sub FileToBitmapFile với FileName là đường dẫn tới tập tin cần nhồi. Code sẽ tạo 1 bitmap (nhái) và ghi trên đĩa với đường dẫn saveFilename. Nếu PictureName <> "" thì code thêm 1 Image trên ActiveSheet và đặt tên là PictureName (của tôi là MySecretImage), sau đó code nhồi bitmap (nhái) vừa ghi trên đĩa vào Image.

Sau này muốn lấy ra đĩa thì làm y hệt như trong SaveVideoAndPlay, tất nhiên không ghi thành CafeSuaNong.wmv mà là vd. hehe.DLL, blala.EXE, hichic.OCX v...v

Để xem được những comment của tôi trong VBE thì: Tools -> Options -> thẻ Editor format -> trong mục Font chọn Times New Roman (vietnamese). Muốn viết comment tiếng Việt bằng Unikey thì chọn bảng mã windows_1258

Nói là bitmap nhái nhưng về mặt cấu trúc thì đó là bitmap thực sự và có thể mở xem bằng các chương trình đồ họa. Chỉ có điều ảnh không có gì hấp dẫn vì nó chỉ là những chấm nhiều mầu thôi.

Nhầm tập tin. Link dưới

http://www.mediafire.com/file/fn4h2y1f1i35zc4/SaveBinary.xlsb/file
Hay đó Anh để Em nghiên cứu kỹ có khó khăn chỗ nào em hỏi mong anh chỉ thêm

Em chuyển comment trong VBE tiếng việt có dấu thấy ok .... và nó là mặc định cho toàn bộ file Excel trên máy đó luôn ...
thấy tiện lâu lâu copy trên mạng ghi chú dán vào nó không lỗi Font Capture.PNG
 
Lần chỉnh sửa cuối:

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
4,357
Được thích
3,016
Điểm
1,568
Nơi ở
IIIIIIIIIIIIIIIII
Anh @batman1 Em mới thử code thấy chạy rất tốt nhưng có 1 tham số saveFilename trong Hàm FileToBitmapFile em chưa hiểu lắm
1/ tham số này saveFilename xuất ra file đó là file thật hay giả và mục đích của nó là gì ?
2/ Khi ghi ảnh từ Sheet ra folder và sử dụng file đó nếu ko lỗi là tuyệt vời

ý tưởng của Em như sau

1/ Lưu File *.ocx hay *.Dll chứa thư viện hàm trong đó lên Sheet (Sử dụng code Anh viết)
2/ khi cần mang file đó đi máy khác viết code check xem file đó có tồn tại hay ko ... nếu chưa có xuất file đó ra xong Register cho nó
3/ Từ Excel chay hàm và các thủ tục cần thiết kết nối với thư viện hàm ... xong Ok nhứt
...
ngày mốt rảnh em mới thử lại khi file nó xuất ra xem có lỗi hay không ... nếu gọi hàm trong File *.dll mà chạy tốt thì quá tuyệt vời
4/ Em sẻ thử nhồi file đó lên Sheetmacro4 xem có Ok hay ko .... nếu ok xong ẩm nó đi là hay đó (cho nó gọn gàng)
5/ với code anh cho đó em sẻ vận dụng tốt cho công việc của mình

6/ Em thử code sau thấy lỗi trong trường hợp em ghi chú đó ... anh chỉ cho em với tại sao ?
Mã:
Sub AddFileToSheet()
    Dim MyPicture, FilePath As String
    Dim SaveFile 
    FilePath = ThisWorkbook.Path & "\BSAC.ocx"
    SaveFile = ("D:\BSAC.ocx")
    MyPicture = "PictureName"  
    Call FileToBitmapFile(FilePath, SaveFile, MyPicture)             ''Chay Tot
    ''Call FileToBitmapFile(FilePath, FilePath, MyPicture)            ''lam treo File Excel ???
End Sub

Cảm ơn anh rất nhiều
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
4,008
Được thích
6,363
Điểm
2,568
Anh @batman1 Em mới thử code thấy chạy rất tốt nhưng có 1 tham số saveFilename trong Hàm FileToBitmapFile em chưa hiểu lắm
1/ tham số này saveFilename xuất ra file đó là file thật hay giả và mục đích của nó là gì ?
2/ Khi ghi ảnh từ Sheet ra folder và sử dụng file đó nếu ko lỗi là tuyệt vời

ý tưởng của Em như sau

1/ Lưu File *.ocx hay *.Dll chứa thư viện hàm trong đó lên Sheet (Sử dụng code Anh viết)
2/ khi cần mang file đó đi máy khác viết code check xem file đó có tồn tại hay ko ... nếu chưa có xuất file đó ra xong Register cho nó
3/ Từ Excel chay hàm và các thủ tục cần thiết kết nối với thư viện hàm ... xong Ok nhứt
...
ngày mốt rảnh em mới thử lại khi file nó xuất ra xem có lỗi hay không ... nếu gọi hàm trong File *.dll mà chạy tốt thì quá tuyệt vời
4/ Em sẻ thử nhồi file đó lên Sheetmacro4 xem có Ok hay ko .... nếu ok xong ẩm nó đi là hay đó (cho nó gọn gàng)
5/ với code anh cho đó em sẻ vận dụng tốt cho công việc của mình

6/ Em thử code sau thấy lỗi trong trường hợp em ghi chú đó ... anh chỉ cho em với tại sao ?
Mã:
Sub AddFileToSheet()
    Dim MyPicture, FilePath As String
    Dim SaveFile
    FilePath = ThisWorkbook.Path & "\BSAC.ocx"
    SaveFile = ("D:\BSAC.ocx")
    MyPicture = "PictureName" 
    Call FileToBitmapFile(FilePath, SaveFile, MyPicture)             ''Chay Tot
    ''Call FileToBitmapFile(FilePath, FilePath, MyPicture)            ''lam treo File Excel ???
End Sub

Cảm ơn anh rất nhiều
Nói nôm na thì là: Do chỉ có thể nhập ảnh vào Image nên ta soạn một tập tin BMP với nội dung tập tin nguồn (DLL, OCX, TXT, EXE ...) với tư cách là những bai mầu của bitmap 24bit (với bitmap 24bit thì mỗi pixel được đại diện bởi 3 bai R, G, B - 3 bai * 8 bit = 24bit). Tôi dùng 24bit vì dạng này đơn giản nhất. Tất nhiên mỗi bitmap BMP ngoài các bai mầu còn có header - các cấu trúc xác định bitmap: width, height, số bit, độ lớn của tập tin v...v. Sau header thì đến chuỗi bai dài dằng dặc xác định mầu của mỗi pixel. Nếu không có header thì vd. không biết các bai kia có ý nghĩa thế nào. Vì nếu bitmap trắng-đen thì chỉ cần 1bit (0 = đen, 1 = trắng) để ghi mầu của pixel nên trong 1 bai ghi được mầu của 8 pixel. Nếu là 24bit thì phải 3 bai mới ghi được mầu của 1 pixel. Nếu là 2 bit, 4bit, 8 bit thì lại còn phức tạp nữa. Không có header thì cũng không biết ảnh có width, height như thế nào. Code chẳng qua soạn cái header kia còn mảng bai mầu thì ta lấy chính nội dung của tập tin nguồn.

Trong chú thích có ghi rõ: "BMP như thế sẽ được ghi trên đĩa với tên saveFilename (định dạng là BMP)"

Tức là nhập một tên bất kỳ "D:\ ...\hichic.bmp". Code sẽ soạn bitmap như ở trên và ghi ra đĩa với tên "D:\ ...\hichic.bmp". Tôi chọn cách đơn giản là ghi ra đĩa với tên "D:\ ...\hichic.bmp" để sau đó dùng LoadPicture load ảnh vào Image.

Thực ra không bắt buộc phải nhập hichic.BMP mà có thể nhập hichic.OCX. Vì quan trọng là cái lõi chứ không phải định dạng. Bạn phải chuột trên tập tin bla.txt rồi đổi tên thành bla.DLL cũng thành công. Nhưng lõi vẫn là văn bản. Chỉ có điều lúc đó Windows không biết đó là văn bản nên bạn không thể click để mở. Lúc đó phải chọn "Open with ..." rồi chọn notepad.

Như vậy bạn vẩn có thể nhập "... BSAC.ocx" thay cho "... BSAC.bmp" nhưng đó phải là tập tin khác - nếu trùng tên thì phải là thư mục khác.

Code có lỗi do FilePath là tập tin nguồn. Khi bạn gọi
Mã:
Call FileToBitmapFile(FilePath, FilePath, MyPicture)
thì code sẽ: soạn từ tập tin FilePath (tham số 1) một tập tin bitmap rồi ghi tập tin mới soạn cũng với tên FilePath (tham số 2). Tức là bạn định mở tập tin nguồn OCX (Open FileName For Binary As #1 trong SaveBitmap) rồi thay đổi nội dung của nó. Vậy có lỗi là đúng rồi.

Tốt nhất bạn chọn tên chưa tồn tại. Còn muốn đặt nó là OCX, DLL, EXE thay BMP cũng được.
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,380
Được thích
9,908
Điểm
2,868
Nơi ở
Hà Nội

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,380
Được thích
9,908
Điểm
2,868
Nơi ở
Hà Nội
Thêm một ví dụ về tạo giao diện phần mềm trong Excel cùng Task Pane, TreeView unicode đẹp.
Điều quan trọng nhất của ví dụ này là phương pháp tạo Task Pane bằng class BSTaskPanes.Add(). Phương pháp này khi mở file Excel và cho mở Task Pane tại sự kiện Workbook_Open() không bị lỗi.
Các video hướng dẫn trước đây tôi dùng BSTaskPaneX kéo thả trực tiếp trên Userform làm dễ hơn, tuy nhiên nếu khi mở file Excel đồng thời mở Task Pane sẽ bị lỗi.
 
Quảng cáo
Top Bottom