hỏi cách chèn lệnh mở file *.exe và file excel từ VBA ?? (1 người xem)

Liên hệ QC

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

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
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ụ:
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...
Dạ! nó là menu! "thầy" đúng là "thầy", "cạnh" đúng là "cạnh"! Vậy theo thầy nó đúng nhất ở điểm gì ạh? Em cũng lờ mờ lắm!

To bác Learning_Excel: Active hay Deactive em không bàn tới, Vấn đề bàn tới là khi reset thì những cái menu tự tạo khác nó cũng bị clear trong code của thầy NDU mà!

Em cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
To bác Learning_Excel: Active hay Deactive em không bàn tới, Vấn đề bàn tới là khi reset thì những cái menu tự tạo khác nó cũng bị clear trong code của thầy NDU mà!
Em cảm ơn!

Thay vì Reset, thì chọn Delete cái Menu nào đó muốn Delete, ta chỉ khéo sử dụng thôi.
 
Upvote 0
Thay vì Reset, thì chọn Delete cái Menu nào đó muốn Delete, ta chỉ khéo sử dụng thôi.

Vâng! Thì em đã nhắc tới ở bài #7 mà! Có gì khác đâu ah!

attachment.php



Dạ vâng! Nhưng cho em hỏi khai báo là Menu để nó thả xuống AutoList làm gì ạh? Thầy test giùm em (run vài lần):
PHP:
Sub CreateMyMenu()
  Dim MyMenu As Menu
  Dim T As String
  On Error Resume Next
  MyMenu.Caption = "Aha"
  Set MyMenu = MenuBars(xlWorksheet).Menus("My Menu")
  MyMenu.Caption = "Aha1"
  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
    T = TypeName(MyMenu) '"'" & MyMenu.Caption & "' da ton tai"
  End If
  MyMenu.Caption = "Aha2"
  MyMenu.Delete
  End Sub

Vấn đề ở đây là khi tạo xong thì nó mới hiểu là Menu, Nếu debug thì thầy thấy là: khi chưa hoàn thành Sub: MyMenu là nothing, sau khi hoàn thành nó mới hiểu MyMenu là menu. Vậy trong code tạo menu khai báo đúng nhất phải là menu để là gì ạh? khi mà sử dụng thuộc tính nó vô tác dụng?

Trong khi đó, khi nó chưa được tạo ra thì phải hiểu nó là object mới đúng bản chất vấn đề. Vì nó chưa được sinh ra thì ta phải cho nó là một đối tượng (object) nào đó chưa cụ thể, khi sinh ra rồi object(đối tượng) đó mới hiểu là gì (ở đây là menu).

Giống như quả trứng nở ra gà. Ta biết nó là gà, nhưng nở ra rồi mới biết gà trống hay gà mái. vậy ta có cần quân tâm tới lúc nó đang là quả trứng thì sẽ nở ra gà mái không? Vậy phải định nghĩa (khai báo) là "trứng nở ra gà mái" hay "trứng nở ra gà"? Đương nhiên khai báo "Trứng nở ra gà" mới là dúng nhất! Vì "Trứng nở ra gà" nó có "nội hàm" lớn hơn!! --=0

Em cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
]Vấn đề ở đây là khi tạo xong thì nó mới hiểu là Menu, Nếu debug thì thầy thấy là: khi chưa hoàn thành Sub: MyMenu là nothing, sau khi hoàn thành nó mới hiểu MyMenu là menu. Vậy trong code tạo menu khai báo đúng nhất phải là menu để là gì ạh? khi mà sử dụng thuộc tính nó vô tác dụng?
Đâu có vấn đề gì chứ
Bạn khai báo rõ ràng sẽ tiết kiệm cho bộ nhớ máy tính
Cũng giống như Dim Sh as Worksheet ---> Lúc đầu Sh chưa là cái gì cả nhưng ta vẫn khai báo nó là Worksheet đấy thôi
"Nó" là Nothing hay là gì không quan trọng ---> Ta phải có động tác Set... thì nó mới được gán ---> Vấn đề ở đây là khai báo đúng thì máy tính đở mất công tính toán xem "nó" thật sự là biến nhớ nào ---> Đây cũng là thuật toán tăng tốc đấy!
 
Upvote 0
Thật ra nếu không khai báo, thì biến mặc định là Variant, tôi ví dụ, nếu như Variant là 1 cái tủ có nhiều ngăn, mỗi ngăn chứa một kiểu biến (long, double, string, menu, control v.v...). Nếu khai biến rõ ràng, thì xem như chúng ta có ngay cái key để mở hộc tủ, còn không thì cầm một đống chìa khóa để mở, thử xem chìa nào mới đúng cái hộc tủ đó. Và như vậy, thời gian sẽ mất đi nhiều hơn. Với máy tính thì dung lượng khi dùng Variant sẽ chiếm nhiều bộ nhớ hơn.
 
Upvote 0
Dạ! em cảm ơn!

Đúng là học cái kiểu quay tới cùng, thắc mắc tới cùng vui thật! May mà các thầy, các bác không giận mà vẫn nhiệt tình chỉ bảo!
Nếu nói ngay từ đầu: TypeName, Tăng tốc độ, giảm bộ nhớ thì còn gì hứng thú nữa! hiii

Cho em hỏi (thành nết rồi ạh!) Object chiếm hết bao nhiêu và Menu hết bao nhiêu bộ nhớ thế ạh?
 
Upvote 0
chào cả nhà. Em là thành viên mơi nên chưa biết cách post bai mới thế nào mà em đọc trên diễn đàn không hiểu. Em có một bài tập thế này các bác giúp em với View attachment DE_23.XLS
 
Upvote 0
Dạ! em cảm ơn!


Cho em hỏi (thành nết rồi ạh!) Object chiếm hết bao nhiêu và Menu hết bao nhiêu bộ nhớ thế ạh?

Trong Help (VBA) có cái này:
Object Data Type
Object variables are stored as 32-bit (4-byte) addresses that refer to objects. Using the Set statement, a variable declared as an Object can have any object reference assigned to it.

Long Data Type
Long (long integer) variables are stored as signed 32-bit (4-byte) numbers ranging in value from -2,147,483,648 to 2,147,483,647. The type-declaration character for Long is the ampersand (&).

Bạn cứ gõ xxx Data Type, với xxx là tên của biến trong Help thì sẽ thấy rõ dung lượng của từng biến.
 
Upvote 0
Upvote 0
Cho em hỏi (thành nết rồi ạh!) Object chiếm hết bao nhiêu và Menu hết bao nhiêu bộ nhớ thế ạh?
Thật ra tôi cũng không dám chắc khai báo As Menu so với As Object thì sẽ tiết kiệm được bao nhiêu. Tuy nhiên có thể suy luận logic cũng thấy được vấn đề:
- Object là nói chung của mọi biến đối tượng
- Worksheet, Workbook, CommandBar, Menu... vân vân đều là 1 phần nhỏ của Object
Vậy đương nhiên cái phần nhỏ ấy phải chiếm ít bộ nhớ hơn phần lớn chứ! Đúng không nào?
 
Upvote 0

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

Back
Top Bottom