Đưa tên các macro vao combobox

Liên hệ QC

phamxuyenp171

Thành viên hoạt động
Tham gia
2/4/09
Bài viết
103
Được thích
124
Xin chào mọi người!
Tôi đã tạo được các Macro với tên là Macro1, Macro2, Macro3...Tôi muốn đưa danh sách các Macro này vào cùng một Combobox để khi nhấp vào đó thì danh sách các Macro hiện ra và khi tôi chọn macro nào thì sẽ chạy được Macro đó.
Xin mọi người giúp đỡ.
 
Upvote 0
Trang mà bạn giới thiệu cho tôi dường như nó hiểu tôi mà tôi không hiểu nó....
 
Upvote 0
Trang mà bạn giới thiệu cho tôi dường như nó hiểu tôi mà tôi không hiểu nó....
Xem phần Listing All Procedures In A Module ấy
Nó thế này đây:
PHP:
Sub ListProcedures()
  Dim VBProj As VBIDE.VBProject
  Dim VBComp As VBIDE.VBComponent
  Dim CodeMod As VBIDE.CodeModule
  Dim LineNum As Long
  Dim NumLines As Long
  Dim WS As Worksheet
  Dim Rng As Range
  Dim ProcName As String
  Dim ProcKind As VBIDE.vbext_ProcKind
  Set VBProj = ActiveWorkbook.VBProject
  Set VBComp = VBProj.VBComponents("Module1")
  Set CodeMod = VBComp.CodeModule
  Set WS = ActiveWorkbook.Worksheets("Sheet1")
  Set Rng = WS.Range("L1")
  With CodeMod
    LineNum = .CountOfDeclarationLines + 1
    Do Until LineNum >= .CountOfLines
      ProcName = .ProcOfLine(LineNum, ProcKind)
      Rng.Value = ProcName
      Rng(1, 2).Value = ProcKindString(ProcKind)
      LineNum = .ProcStartLine(ProcName, ProcKind) + _
      .ProcCountLines(ProcName, ProcKind) + 1
      Set Rng = Rng(2, 1)
     Loop
  End With
End Sub
PHP:
Function ProcKindString(ProcKind As VBIDE.vbext_ProcKind) As String
  Select Case ProcKind
    Case vbext_pk_Get
      ProcKindString = "Property Get"
    Case vbext_pk_Let
      ProcKindString = "Property Let"
    Case vbext_pk_Set
      ProcKindString = "Property Set"
    Case vbext_pk_Proc
      ProcKindString = "Sub Or Function"
    Case Else
      ProcKindString = "Unknown Type: " & CStr(ProcKind)
    End Select
End Function
Chạy thử biết liền chứ gì
 
Upvote 0
Xem phần Listing All Procedures In A Module ấy
Nó thế này đây:
PHP:
Sub ListProcedures()
  Dim VBProj As VBIDE.VBProject
  Dim VBComp As VBIDE.VBComponent
  Dim CodeMod As VBIDE.CodeModule
  Dim LineNum As Long
  Dim NumLines As Long
  Dim WS As Worksheet
  Dim Rng As Range
  Dim ProcName As String
  Dim ProcKind As VBIDE.vbext_ProcKind
  Set VBProj = ActiveWorkbook.VBProject
  Set VBComp = VBProj.VBComponents("Module1")
  Set CodeMod = VBComp.CodeModule
  Set WS = ActiveWorkbook.Worksheets("Sheet1")
  Set Rng = WS.Range("L1")
  With CodeMod
    LineNum = .CountOfDeclarationLines + 1
    Do Until LineNum >= .CountOfLines
      ProcName = .ProcOfLine(LineNum, ProcKind)
      Rng.Value = ProcName
      Rng(1, 2).Value = ProcKindString(ProcKind)
      LineNum = .ProcStartLine(ProcName, ProcKind) + _
      .ProcCountLines(ProcName, ProcKind) + 1
      Set Rng = Rng(2, 1)
     Loop
  End With
End Sub
PHP:
Function ProcKindString(ProcKind As VBIDE.vbext_ProcKind) As String
  Select Case ProcKind
    Case vbext_pk_Get
      ProcKindString = "Property Get"
    Case vbext_pk_Let
      ProcKindString = "Property Let"
    Case vbext_pk_Set
      ProcKindString = "Property Set"
    Case vbext_pk_Proc
      ProcKindString = "Sub Or Function"
    Case Else
      ProcKindString = "Unknown Type: " & CStr(ProcKind)
    End Select
End Function
Chạy thử biết liền chứ gì

Thật phụ công của anh quá. Vì tôi mới học nên tôi vẫn chưa hiểu được ý của anh. Mong anh chỉ dẫn từng bước.Anh xem file đính kèm về ý tưởng của tôi nhé. Cảm ơn anh trước!
 

File đính kèm

Upvote 0
Thật phụ công của anh quá. Vì tôi mới học nên tôi vẫn chưa hiểu được ý của anh. Mong anh chỉ dẫn từng bước.Anh xem file đính kèm về ý tưởng của tôi nhé. Cảm ơn anh trước!

Để chạy được code bạn phải làm 2 thao tác như sau:
-Tools menu. chọn References . ở References dialog, tìm Microsoft Visual Basic for Applications Extensibility 5.3 và đánh dấu chọn, nhấn OK
-Trên Sheet chọn Tools, Macro, chọn security.... chọn gờ Trusted Publishers, nếu thấy "Trust Access to visual basic project" chưa được chọn thì chọn vào, sau cùng nhấn OK.

Bây giờ bạn chạy code thì thấy cột L và M có tên Macro bạn cần. Còn đưa tên đó vào Combo thì bạn từ từ nghiên cứu nhé.
 
Upvote 0
Thật phụ công của anh quá. Vì tôi mới học nên tôi vẫn chưa hiểu được ý của anh. Mong anh chỉ dẫn từng bước.Anh xem file đính kèm về ý tưởng của tôi nhé. Cảm ơn anh trước!
- Để chạy được code ta làm giống như Doom vừa nếu ở trên
- Tuy nhiên để tùy biến giống như yêu cầu của bạn thì... có lẽ đã quá sức nếu bạn mới học VBA
Ta tùy biến như sau:
- Tại sheet Trang chu, vẽ 1 ComboBox (thuộc thanh Control Toolbox)
- Double click vào ComboBox này để mở cửa sổ lập trình
- Dán code này vào cửa sổ ấy:
PHP:
Private Function ListProcedures(ModuleName As String)
  Dim VBProj As VBIDE.VBProject, VBComp As VBIDE.VBComponent
  Dim CodeMod As VBIDE.CodeModule, ProcKind As VBIDE.vbext_ProcKind
  Dim LineNum As Long, NumLines As Long, ProcName As String
  Dim Arr(), i As Long
  Set VBProj = ActiveWorkbook.VBProject
  Set VBComp = VBProj.VBComponents(ModuleName)
  Set CodeMod = VBComp.CodeModule
  With CodeMod
    LineNum = .CountOfDeclarationLines + 1
    Do Until LineNum >= .CountOfLines
      ProcName = .ProcOfLine(LineNum, ProcKind)
      ReDim Preserve Arr(i)
      Arr(i) = ProcName
      i = i + 1
      LineNum = .ProcStartLine(ProcName, ProcKind) + _
     .ProcCountLines(ProcName, ProcKind) + 1
    Loop
  End With
  ListProcedures = Arr
End Function
PHP:
Private Sub ComboBox1_Click()
  Run ComboBox1.Value
End Sub
PHP:
Private Sub ComboBox1_DropButtonClick()
  ComboBox1.Clear
  ComboBox1.List() = ListProcedures("Module1")
End Sub
- Bấm Alt + Q để trở về bảng tính và thử bấm vào ComboBox để kiểm tra
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tôi đã xem file đính kèm của anh. Đúng là cái tôi cần, thích thật! Tôi đã làm tương tự như hướng dẫn trên nhưng không hiểu sao vẫn không được hè...Dù sao cũng cảm ơn các anh đã cho tôi niềm tin. Tôi sẽ cố gắng xem sao.
 
Upvote 0
Làm được rồi các anh ơi! Cảm ơn các anh nhiều lắm.
 
Upvote 0
Xin hỏi thêm các anh một tí nữa. Trong 3 Macro trên nếu tôi muốn Macro3 không nằm trong combobox thì phải làm thế nào?
 
Upvote 0
Xin hỏi thêm các anh một tí nữa. Trong 3 Macro trên nếu tôi muốn Macro3 không nằm trong combobox thì phải làm thế nào?
Sửa lại hàm thôi:
PHP:
Private Function ListProcedures(ModuleName As String)
  Dim VBProj As VBIDE.VBProject, VBComp As VBIDE.VBComponent
  Dim CodeMod As VBIDE.CodeModule, ProcKind As VBIDE.vbext_ProcKind
  Dim LineNum As Long, NumLines As Long, ProcName As String
  Dim Arr(), i As Long
  Set VBProj = ActiveWorkbook.VBProject
  Set VBComp = VBProj.VBComponents(ModuleName)
  Set CodeMod = VBComp.CodeModule
  With CodeMod
    LineNum = .CountOfDeclarationLines + 1
    Do Until LineNum >= .CountOfLines
      ProcName = .ProcOfLine(LineNum, ProcKind)
      If ProcName <> "Macro3" Then
        ReDim Preserve Arr(i)
        Arr(i) = ProcName
        i = i + 1
      End If
      LineNum = .ProcStartLine(ProcName, ProcKind) + _
     .ProcCountLines(ProcName, ProcKind) + 1
    Loop
  End With
  ListProcedures = Arr
End Function
Còn không thì giữ nguyên hàm, sửa code trong ComboBox:
PHP:
Private Sub ComboBox1_DropButtonClick()
  Dim Item
  ComboBox1.Clear
  For Each Item In ListProcedures("Module1")
    If Item <> "Macro3" Then ComboBox1.AddItem Item
  Next
End Sub
Tóm lại: Sửa 1 trong 2 code trên
-----------------------------------------------
Ngoài cách sửa code như ở trên, còn 1 cách khác đơn giản hơn rất nhiều, đó là: Di dời macro mà bạn không muốn liệt kê ra khỏi Module ---> Cụ thể, nếu không muốn liệt kê macro có tên là "Macro3", vậy bạn di dời nó ra khỏi Module1 (đặt vào Module2 chẳng hạn)
 
Lần chỉnh sửa cuối:
Upvote 0
Bấm Alt + Q để trở về bảng tính và thử bấm vào ComboBox để kiểm tra
-------------------
paperclip.png
Tập tin đính kèm
Không hiểu sao down file Vi du về chạy để xem và học hỏi thì gặp sự cố này.
View attachment 48196
er.JPG
 
Upvote 0
Không hiểu sao down file Vi du về chạy để xem và học hỏi thì gặp sự cố này.
View attachment 48196
View attachment 48197
Những code nào làm nhiệm vụ "moi móc" và chỉnh sửa lại code khác thì phải thỏa 2 điều kiện mới chạy được:
- Thứ nhất: Trong cửa sổ VBA, vào menu Tools\References và check vào mục "Microsoft Visual Basic for Applications Extensibility... "

untitled1.JPG


- Thứ hai: Trong bảng tính, vào menu Tools\Macro\Security... ở tab Trusted Publishers, check mục "Trust access to Visual Basic Project"


untitled2.JPG


----------------------------------
Bạn xem lại bài #6 nhé
 
Upvote 0
Sửa lại hàm thôi:
PHP:
Private Function ListProcedures(ModuleName As String)
Dim VBProj As VBIDE.VBProject, VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule, ProcKind As VBIDE.vbext_ProcKind
Dim LineNum As Long, NumLines As Long, ProcName As String
Dim Arr(), i As Long
Set VBProj = ActiveWorkbook.VBProject
Set VBComp = VBProj.VBComponents(ModuleName)
Set CodeMod = VBComp.CodeModule
With CodeMod
LineNum = .CountOfDeclarationLines + 1
Do Until LineNum >= .CountOfLines
ProcName = .ProcOfLine(LineNum, ProcKind)
If ProcName <> "Macro3" Then
ReDim Preserve Arr(i)
Arr(i) = ProcName
i = i + 1
End If
LineNum = .ProcStartLine(ProcName, ProcKind) + _
.ProcCountLines(ProcName, ProcKind) + 1
Loop
End With
ListProcedures = Arr
End Function
Còn không thì giữ nguyên hàm, sửa code trong ComboBox:
PHP:
Private Sub ComboBox1_DropButtonClick()
Dim Item
ComboBox1.Clear
For Each Item In ListProcedures("Module1")
If Item <> "Macro3" Then ComboBox1.AddItem Item
Next
End Sub
Tóm lại: Sửa 1 trong 2 code trên
-----------------------------------------------
Ngoài cách sửa code như ở trên, còn 1 cách khác đơn giản hơn rất nhiều, đó là: Di dời macro mà bạn không muốn liệt kê ra khỏi Module ---> Cụ thể, nếu không muốn liệt kê macro có tên là "Macro3", vậy bạn di dời nó ra khỏi Module1 (đặt vào Module2 chẳng hạn)

Nghe có vẻ hay đấy! Xin anh hướng dẫn nốt cách di dời Macro cho tôi luôn. Vì thực tể có thể có nhiều macro cần đưa ra ngoài combobox. Nếu dùng cách sửa hàm hoặc sửa code trong combobox thì có thể sẽ rắc rối hơn phải không anh. Xin cảm ơn anh!
 
Upvote 0
Nghe có vẻ hay đấy! Xin anh hướng dẫn nốt cách di dời Macro cho tôi luôn. Vì thực tể có thể có nhiều macro cần đưa ra ngoài combobox. Nếu dùng cách sửa hàm hoặc sửa code trong combobox thì có thể sẽ rắc rối hơn phải không anh. Xin cảm ơn anh!
Di dời có nghĩa là cắt dán thôi ---> Bằng tay!
 
Upvote 0
Web KT

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

Back
Top Bottom