hỏi cách chèn lệnh mở file *.exe và file excel từ VBA ??

Liên hệ QC

cloudtifa

Thành viên mới
Tham gia
27/2/09
Bài viết
18
Được thích
2
e viết code trong VBA là :
Mã:
Sub AddMenu()MyMenu = Application.MenuBars(xlWorksheet).Menus.Count + 1
MenuBars(xlWorksheet).Menus.Add "Ten Ich Cong Viec", MyMenu
MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add Caption:="Ma Vach", before:=1, OnAction:=fileopen = Shell("D:\3 code\barcode.exe", vbNormalFocus)
MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add Caption:="nhap du lieu goc", before:=2, OnAction:=fileopen = Shell("D:\dulieu\du lieu goc.xls", vbNormalFocus)
MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add Caption:="lam nhan dan' hop", before:=2, OnAction:=fileopen = Shell("D:\dulieu\nhan.xls", vbNormalFocus)
End Sub
untitled-7.jpg

Mục đích của em là muốn khi mình click vào "Ma Vach" thì nó sẽ mở file barcode.exe, "lam nhan dan' hop" và "nhap du lieu goc" là mở file *.xls . Em dùng code fileopen nhưng khi click vào thì nó không hiện lên như ý muốn. không biết code trên có đúng ko ạ . cho em hỏi thêm nữa là, em đã save file này ra thành *xla và vào Tool --> Add-ins, nhưng nó chỉ hiện ở mỗi file mình save thôi, em muốn là lúc mình add vào rồi thì khi mình mở Excel lên là nó sẽ tự có, như các Add-ins mà em được mọi người chia sẽ trên 4rum mình ạ... Mong nọi người giúp em với, Em cám ơn !
 
e viết code trong VBA là :
Mã:
Sub AddMenu()MyMenu = Application.MenuBars(xlWorksheet).Menus.Count + 1
MenuBars(xlWorksheet).Menus.Add "Ten Ich Cong Viec", MyMenu
MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add Caption:="Ma Vach", before:=1, OnAction:=fileopen = Shell("D:\3 code\barcode.exe", vbNormalFocus)
MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add Caption:="nhap du lieu goc", before:=2, OnAction:=fileopen = Shell("D:\dulieu\du lieu goc.xls", vbNormalFocus)
MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add Caption:="lam nhan dan' hop", before:=2, OnAction:=fileopen = Shell("D:\dulieu\nhan.xls", vbNormalFocus)
End Sub

Mục đích của em là muốn khi mình click vào "Ma Vach" thì nó sẽ mở file barcode.exe, "lam nhan dan' hop" và "nhap du lieu goc" là mở file *.xls . Em dùng code fileopen nhưng khi click vào thì nó không hiện lên như ý muốn. không biết code trên có đúng ko ạ . cho em hỏi thêm nữa là, em đã save file này ra thành *xla và vào Tool --> Add-ins, nhưng nó chỉ hiện ở mỗi file mình save thôi, em muốn là lúc mình add vào rồi thì khi mình mở Excel lên là nó sẽ tự có, như các Add-ins mà em được mọi người chia sẽ trên 4rum mình ạ... Mong nọi người giúp em với, Em cám ơn !
Viết vậy là sai cú pháp rồi,,, Chỉ có thể viết theo kiểu vầy:
PHP:
Sub AddMenu()
  Dim MyMenu As Long
  MyMenu = Application.MenuBars(xlWorksheet).Menus.Count + 1
  MenuBars(xlWorksheet).Menus.Add "Ten Ich Cong Viec", MyMenu
  MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add "Ma Vach", "fileOpen1"
  MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add "nhap du lieu goc", "fileOpen2"
  MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add "lam nhan dan' hop", "fileOpen3"
End Sub
PHP:
Sub fileOpen1()
  Shell "D:\3 code\barcode.exe", vbNormalFocus
End Sub
PHP:
Sub fileOpen2()
  Shell "D:\dulieu\du lieu goc.xls", vbNormalFocus
End Sub
PHP:
Sub fileOpen3()
  Shell "D:\dulieu\nhan.xls", vbNormalFocus
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
cám ơn bạn ! mình làm được rồi :) , nhưng cho mình hỏi thêm là sao mình save ra file *.xla trong Excel , rồi mình mở Excel lên Add-ins file vừa mới save ra, nhưng thấy nó không hiện luôn trên thanh công cụ vậy bạn
 
Upvote 0
cám ơn bạn ! mình làm được rồi :) , nhưng cho mình hỏi thêm là sao mình save ra file *.xla trong Excel , rồi mình mở Excel lên Add-ins file vừa mới save ra, nhưng thấy nó không hiện luôn trên thanh công cụ vậy bạn
Đâu phải save thành xla thì tự nhiên nó chạy chứ... Bạn phải "gọi nó". ---> Có thể bằng cách đổi tên Sub AddMenu thành Auto_Open, như thế này:
PHP:
Sub Auto_Open()
  Dim MyMenu As Long
  Auto_Close
  MyMenu = Application.MenuBars(xlWorksheet).Menus.Count + 1
  MenuBars(xlWorksheet).Menus.Add "Ten Ich Cong Viec", MyMenu
  MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add "Ma Vach", "fileOpen1"
  MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add "nhap du lieu goc", "fileOpen2"
  MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add "lam nhan dan' hop", "fileOpen3"
End Sub
PHP:
Sub Auto_Close()
  Application.CommandBars("Worksheet menu bar").Reset
End Sub
Thứ nhất: Code tên Auto_Open sẽ tự động chạy và làm công việc Add menu
Thứ hai: phải có thêm code Auto_Close làm nhiệm vụ reset menu, để khi ta không dùng đến Add-In thì phải trả menu về như ban đầu
Với code ở trên, hãy save thành xla xem thử nhé
 
Lần chỉnh sửa cuối:
Upvote 0
anh ơi cho em hỏi la, em làm theo code của anh thì mở được file *.exe thôi, còn file
*.xls thì nó báo lỗi Debug ạ, anh xem giùm em với
ă
 
Upvote 0
anh ơi cho em hỏi la, em làm theo code của anh thì mở được file *.exe thôi, còn file
*.xls thì nó báo lỗi Debug ạ, anh xem giùm em với
ă
Lúc đầu bạn nói cần mở file .EXE nên mới dùng code như vậy, còn để mở 1 file bất kỳ thì lại khác:
PHP:
CreateObject("Shell.Application").Open "Đường dẫn đến file bất kỳ"
Ví dụ:
PHP:
CreateObject("Shell.Application").Open "D:\Book1.xls"
 
Upvote 0
Đâu phải save thành xla thì tự nhiên nó chạy chứ... Bạn phải "gọi nó". ---> Có thể bằng cách đổi tên Sub AddMenu thành Auto_Open, như thế này:
PHP:
Sub Auto_Open()
  Dim MyMenu As Long
  Auto_Close
  MyMenu = Application.MenuBars(xlWorksheet).Menus.Count + 1
  MenuBars(xlWorksheet).Menus.Add "Ten Ich Cong Viec", MyMenu
  MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add "Ma Vach", "fileOpen1"
  MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add "nhap du lieu goc", "fileOpen2"
  MenuBars(xlWorksheet).Menus(MyMenu).MenuItems.Add "lam nhan dan' hop", "fileOpen3"
End Sub
PHP:
Sub Auto_Close()
  Application.CommandBars("Worksheet menu bar").Reset
End Sub
Thứ nhất: Code tên Auto_Open sẽ tự động chạy và làm công việc Add menu
Thứ hai: phải có thêm code Auto_Close làm nhiệm vụ reset menu, để khi ta không dùng đến Add-In thì phải trả menu về như ban đầu
Với code ở trên, hãy save thành xla xem thử nhé

Cho em hỏi, khi sử dụng Auto_close thì nó reset lại toàn bộ Worksheet menu bar không? Nếu reset lại toàn bộ thì các menu khác "tự tạo" cũng bị clean luôn ạh? Mà nếu không reset thì lần sau mở lại file excel nó lại sinh ra menu đó (tức là menu cứ tăng lên 1 sau mỗi lần mở).
Theo em thì chỉ tìm cái menu đó và nếu thấy thì delete nó đi trước khi khởi tạo lại thay vì reset trước khi tạo.
Có thể tạo menu như bác NDU hoặc như dưới đây:
PHP:
Public Sub FileMenuBar()
'On Error Resume Next
Dim NewMenu As Object
Dim MenuItem0, MenuItem1, MenuItem2  As Object
        ' Tìm và xoá Menu TienIch
        XoaMenuBar ("Tien Ich Cong Viec")
        ' Thêm Menu Tien Ich Cong Viec
        Set NewMenu = CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup, before:=10)
        NewMenu.Caption = "Tien Ich Cong Viec"
        'Thêm đối cho Menu Tien Ich Cong Viec
        Set MenuItem0 = NewMenu.Controls.Add
            MenuItem0.Caption = "Ma Vach"
            MenuItem0.OnAction = "fileopen1"
            'MenuItem0.FaceId = x (x: là giá trị nguyên của biểu tượng nào đó)
            'MenuItem0.Enabled = True
        Set MenuItem1 = NewMenu.Controls.Add
            MenuItem1.Caption = "Nhap du lieu goc"
            MenuItem1.OnAction = "fileopen2"
        Set MenuItem2 = NewMenu.Controls.Add
            MenuItem2.Caption = "lam nhan dan hop"
            MenuItem2.OnAction = "fileopen3"
End Sub
PHP:
Function XoaMenuBar(strMenuBar As String)
    Dim m As Object
    For Each m In MenuBars(xlWorksheet).Menus
        If m.Caption = strMenuBar Then
            CommandBars("Worksheet Menu Bar").Controls(strMenuBar).Delete 
        End If
    Next m
End Function
 
Upvote 0
Cho em hỏi, khi sử dụng Auto_close thì nó reset lại toàn bộ Worksheet menu bar không? Nếu reset lại toàn bộ thì các menu khác "tự tạo" cũng bị clean luôn ạh? Mà nếu không reset thì lần sau mở lại file excel nó lại sinh ra menu đó (tức là menu cứ tăng lên 1 sau mỗi lần mở).
Theo em thì chỉ tìm cái menu đó và nếu thấy thì delete nó đi trước khi khởi tạo lại thay vì reset trước khi tạo.
Có thể tạo menu như bác NDU hoặc như dưới đây:
Bạn nói đúng!
Nhưng để tìm và xóa đúng 1 menu nào đó thì cũng không cần phải dùng vòng lập for đâu ---> Đơn giản là chỉ đúng tên của nó rồi xóa, thế thôi!
(Thêm On Error Resume Next trên đầu code để phòng trường hợp không tìm thấy)
 
Upvote 0
Bạn nói đúng!
Nhưng để tìm và xóa đúng 1 menu nào đó thì cũng không cần phải dùng vòng lập for đâu ---> Đơn giản là chỉ đúng tên của nó rồi xóa, thế thôi!
(Thêm On Error Resume Next trên đầu code để phòng trường hợp không tìm thấy)
Dạ! cảm ơn thầy!
PHP:
On error Resume Next
Application.MenuBars(xlWorksheet).Menus("Tien Ich Cong Viec").Delete

Em test lại thì thấy không ổn! Theo em thì phải dùng vòng lặp thầy ạh! Lý do: Nếu có nhiều hơn 1 menu trùng tên, thì không thể xoá hết được tất cả mà chỉ xoá được có một menu thôi! Tất nhiên, về logic của chương trình thì người tạo đề án không để xảy ra lỗi đó, nhưng về lý thuyết thì có thể xảy ra.
 
Upvote 0
Dạ! cảm ơn thầy!
PHP:
On error Resume Next
Application.MenuBars(xlWorksheet).Menus("Tien Ich Cong Viec").Delete

Em test lại thì thấy không ổn! Theo em thì phải dùng vòng lặp thầy ạh! Lý do: Nếu có nhiều hơn 1 menu trùng tên, thì không thể xoá hết được tất cả mà chỉ xoá được có một menu thôi! Tất nhiên, về logic của chương trình thì người tạo đề án không để xảy ra lỗi đó, nhưng về lý thuyết thì có thể xảy ra.

Thật ra chạy một menu và reset menu trên một File cũng đơn giản, code này chạy rất nhanh, vì vậy, khi tôi mở một file, điều đầu tiên tôi reset menu rồi chạy menu cho file đó. Trong quá trình chạy, nếu file đó deactive thì tôi cho reset lại menu gốc, qua file khác, tức file này active tôi lại reset và chạy menu của file này. Vì vậy không bao giờ xóa nhầm hay chạy trùng menu.
 
Upvote 0
Em test lại thì thấy không ổn! Theo em thì phải dùng vòng lặp thầy ạh! Lý do: Nếu có nhiều hơn 1 menu trùng tên, thì không thể xoá hết được tất cả mà chỉ xoá được có một menu thôi! Tất nhiên, về logic của chương trình thì người tạo đề án không để xảy ra lỗi đó, nhưng về lý thuyết thì có thể xảy ra.
Cái chuyện có nhiều menu trùng tên là do ngay từ đâu ta quản lý không tốt...
Ví dụ code thế này:
PHP:
Sub FileMenuBar()
  Dim MyMenu
  On Error Resume Next
  Set MyMenu = MenuBars(xlWorksheet).Menus("My Menu")
  If MyMenu Is Nothing Then
    With MenuBars(xlWorksheet).Menus.Add("My Menu")
      .MenuItems.Add "Menu Item 1", "Macro1"
      .MenuItems.Add "Menu Item 2", "Macro2"
      .MenuItems.Add "Menu Item 3", "Macro3"
    End With
  Else
    MsgBox "Menu da ton tai"
  End If
End Sub
Lấy đâu ra có vụ trùng
Ý tôi muốn nói: Ngay từ đầu ta viết code cẩn thận thì sẽ "khỏe" cho sau này
 
Upvote 0
Nhân tiện xin đố mọi người 1 câu
Với code ở bài #11, ta phải Dim MyMenu As... cái gì là đúng nhất
cái gì ở đây là cái gì?
Ẹc... Ẹc...
 
Upvote 0
Dim MyMenu As CommandBarPopup

Phải không Thầy?
Muốn biết đúng hay không thì... thí nghiệm:
PHP:
Sub CreateMyMenu()
  Dim MyMenu As CommandBarPopup
  On Error Resume Next
  Set MyMenu = MenuBars(xlWorksheet).Menus("My Menu")
  If MyMenu Is Nothing Then
    With MenuBars(xlWorksheet).Menus.Add("My Menu")
      .MenuItems.Add "Menu Item 1", "Macro1"
      .MenuItems.Add "Menu Item 2", "Macro2"
      .MenuItems.Add "Menu Item 3", "Macro3"
    End With
  Else
    MsgBox "'" & MyMenu.Caption & "' da ton tai"
  End If
End Sub
Thử xem chạy code này ta được kết quả gì?
Ẹc... Ẹc... thấy vậy chứ chẳng dễ ăn đâu nha (cũng phải suy nghĩ nát óc)
 
Upvote 0
Nhân tiện xin đố mọi người 1 câu
Với code ở bài #11, ta phải Dim MyMenu As... cái gì là đúng nhất
cái gì ở đây là cái gì?
Ẹc... Ẹc...
Em thì chịu không biết cái nào đúng nhất! Nhưng ngày trước em có đọc sách "Ngôn ngữ đặc tả hình thức Raise" thì nó bảo thế này: Đặc tả một đối tượng, ví dụ: cái "bàn gỗ" (nào đó) là: hình chữ nhật có 4 cạnh, làm bằng gỗ, có 4 chân, 1 mặt phẳng,.. Thế đặc tả "Cạnh" như thế nào? ... "Cạnh" là "Cạnh"! Nghĩa là nếu không mô tả được nó thì "nó" được định nghĩa bằng chính "nó"! Chuẩn!
Nên cái gì mà mà không mô tả được cụ thể hoặc mô tả được cụ thể nhưng không thích mô trả cụ thể thì em cho nó là Object.
(Nội Hàm nó lớn, Ngoại diên nó nhỏ). Cái gì to đúng thì cái con bên trong nó cũng phải đúng theo!

To bác Learning_Excel: Em chưa test tính tốc độ thuật toán, nhưng vấn đề em đề cập là chuyện Reset, em đã trao đổi ở bài #7.

Em cảm ơn!
 
Upvote 0
Em cho chạy trước khi trả lời rồi, bình thường mà Thầy? Hay là Thầy muốn nói ý khác?
Đã thí nghiệm thì phải chạy từ 2 lần trở lên chứ
Nên cái gì mà mà không mô tả được cụ thể hoặc mô tả được cụ thể nhưng không thích mô trả cụ thể thì em cho nó là Object.
!
Object là nói chung chung, cái này có tên đàng hoàng (nên mới đố)
 
Upvote 0
Muốn biết đúng hay không thì... thí nghiệm:
PHP:
Sub CreateMyMenu()
  Dim MyMenu As CommandBarPopup
  On Error Resume Next
  Set MyMenu = MenuBars(xlWorksheet).Menus("My Menu")
  If MyMenu Is Nothing Then
    With MenuBars(xlWorksheet).Menus.Add("My Menu")
      .MenuItems.Add "Menu Item 1", "Macro1"
      .MenuItems.Add "Menu Item 2", "Macro2"
      .MenuItems.Add "Menu Item 3", "Macro3"
    End With
  Else
    MsgBox "'" & MyMenu.Caption & "' da ton tai"
  End If
End Sub
Thử xem chạy code này ta được kết quả gì?
Ẹc... Ẹc... thấy vậy chứ chẳng dễ ăn đâu nha (cũng phải suy nghĩ nát óc)

Em thì thấy nó tạo bình thường! chỉ có điều MyMenu = Nothing thôi! Nên nó cứ èn èn ra Menu nữa! Nhưng khai báo là Object thì báo lỗi chuẩn luôn!
NDU đã viết:
Object là nói chung chung, cái này có tên đàng hoàng (nên mới đố)
Em thấy khác biệt ở đây là cái menu đó nếu popup thì ok, nhưng nó mà là command thì lại khác! Command tức là dí chuột vào là nó action ngay (Mặc dù vẫn trên Menu). Cái gì đúng nhất thì em chịu! Mong thầy chỉ giáo!
 
Lần chỉnh sửa cuối:
Upvote 0
To bác Learning_Excel: Em chưa test tính tốc độ thuật toán, nhưng vấn đề em đề cập là chuyện Reset, em đã trao đổi ở bài #7.

Em cảm ơn!

Bạn có thể tham khảo thêm tại đường link dưới đây:

http://www.giaiphapexcel.com/forum/...êm-mục-trên-thanh-MenuBar&p=255799#post255799

Tại Thisworkbook bạn thêm đoạn code này:

Đây là code cho chạy Menu
PHP:
Private Sub Workbook_Activate()
  Call AddToolBars
End Sub
Đây là code cho reset:
PHP:
Private Sub Workbook_Deactivate()
  Call ResetToolBars
End Sub

Với các nguồn:
PHP:
Sub ResetToolBars()
  CommandBars("worksheet menu bar").Reset
  CommandBars("Ply").Reset
  CommandBars("cell").Reset
End Sub

Sub AddToolBars()
  Them_vao_Menu
  AddToPlyMenu
  Them_vao_PopupMenu
End Sub
 
Upvote 0
Nhưng khai báo là Object thì báo lỗi chuẩn luôn!
Khai báo Object đương nhiên là được rồi, có điều bạn sẽ không tận dụng được thằng AutoList xổ xuống sau dấu chấm (sẽ không biết được thuộc tính và các phương thức của Object là cái gì)
-----------
Để biết thằng "ông nội" MyMenu là thuộc dạng gì, ta có thể dùng TypeName để kiểm tra
Ví dụ:
PHP:
Sub CreateMyMenu()
  Dim MyMenu
  On Error Resume Next
  Set MyMenu = MenuBars(xlWorksheet).Menus("My Menu")
  If MyMenu Is Nothing Then
    With MenuBars(xlWorksheet).Menus.Add("My Menu")
      .MenuItems.Add "Menu Item 1", "Macro1"
      .MenuItems.Add "Menu Item 2", "Macro2"
      .MenuItems.Add "Menu Item 3", "Macro3"
    End With
  Else
    MsgBox TypeName(MyMenu)
  End If
End Sub
Khi nhận được MsgBox, ta biết ngay phải khai báo MyMenu As.. cái giống gì liền
Ẹc... Ẹc...
 
Upvote 0
Web KT

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

Back
Top Bottom