Làm sao để chạy 1 lệnh từ 1 chuổi (có cú pháp của 1 lệnh)? (1 người xem)

Liên hệ QC

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

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,959
- Giả sử tôi có dữ liệu tại G5:G20, trong đó có 1 số cell rổng
- Tôi viết 1 sub như thế này:
PHP:
Sub DelBlankCell(SrcRng As Range)
  Dim Clls As Range, TmpRng As Range
  Set TmpRng = SrcRng(1, 1)
  For Each Clls In SrcRng
    If Clls = "" Then Set TmpRng = Union(TmpRng, Clls)
  Next
  TmpRng.Delete 2
End Sub
- Và để chạy lệnh xóa cell rổng, tôi lại viết thêm 1 sub khác
PHP:
Sub Main()
  DelBlankCell [G5:G20]
End Sub
------------------------------
Tình hình bây giờ là thế này:
- Giả sử tôi gõ vào cell A1 dòng chữ: DelBlankCell [G5:G20]
- Thế thì tôi có cách nào khác để từ chuổi tại cell A1, "báo" cho code biết rằng tôi muốn làm công việc giống như Sub Main đã làm hay không?
(Dùng Application.Run Range("A1").Value thì báo lổi)
 
Hoàn toàn có thể được chứ. Mình cũng viết 2 Sub:

PHP:
Option Explicit

Sub thu()
Dim a
a = Sheet1.[a1]
Run a
End Sub
'--------------------------
Sub tb(ch As String)
MsgBox (ch)
End Sub
Tại ô A1 trên sheet1 mình nhập:
tb("Chuc mung ngay 8-3")

Rồi chạy Sub thu thấy được mà. Cái khó là chạy trực tiếp câu lệnh VB (Mình cũng mày mò nhưng chưa được) còn gọi tên Sub thì chẳng có vấn đề gì.
 
Lần chỉnh sửa cuối:
Upvote 0
Hoàn toàn có thể được chứ. Mình cũng viết 2 Sub:

PHP:
Option Explicit

Sub thu()
Dim a
a = Sheet1.[a1]
Run a
End Sub
'--------------------------
Sub tb(ch As String)
MsgBox (ch)
End Sub
Tại ô A1 trên sheet1 mình nhập:
tb("Chuc mung ngay 8-3")

Rồi chạy Sub thu thấy được mà. Cái khó là chạy trực tiếp câu lệnh VB (Mình cũng mày mò nhưng chưa được) còn gọi tên Sub thì chẳng có vấn đề gì.
Ví dụ anh đưa lên ấy em chạy được rồi (chỉ hơi lạ là nó xuất 2 MsgBox) ---> Có điều áp dụng nó vào bài của em thì không ăn thua
Có lẽ tham chiếu trong sub của em là 1 Range (Object) chứ không phải là String chăng?
Hic... khó nhai quá
(nếu làm được bài này thì em sẽ có nhiều bài toán áp dụng rất thú vị đây)
 
Upvote 0
- Giả sử tôi có dữ liệu tại G5:G20, trong đó có 1 số cell rổng
- Tôi viết 1 sub như thế này:
PHP:
Sub DelBlankCell(SrcRng As Range)
  Dim Clls As Range, TmpRng As Range
  Set TmpRng = SrcRng(1, 1)
  For Each Clls In SrcRng
    If Clls = "" Then Set TmpRng = Union(TmpRng, Clls)
  Next
  TmpRng.Delete 2
End Sub
- Và để chạy lệnh xóa cell rổng, tôi lại viết thêm 1 sub khác
PHP:
Sub Main()
  DelBlankCell [G5:G20]
End Sub
------------------------------
Tình hình bây giờ là thế này:
- Giả sử tôi gõ vào cell A1 dòng chữ: DelBlankCell [G5:G20]
- Thế thì tôi có cách nào khác để từ chuổi tại cell A1, "báo" cho code biết rằng tôi muốn làm công việc giống như Sub Main đã làm hay không?
(Dùng Application.Run Range("A1").Value thì báo lổi)
Sử dụng phương thức Run xem sao.
PHP:
Sub DelBlankCell(SrcRng As Range)
  Dim Clls As Range, TmpRng As Range
  Set TmpRng = SrcRng(1, 1)
  For Each Clls In SrcRng
    If Clls = "" Then Set TmpRng = Union(TmpRng, Clls)
  Next
  TmpRng.Delete 2
End Sub
PHP:
Sub Main()
Application.Run Left([A1].Value, InStr([A1].Value, " ")), Range(Mid([A1].Value, InStr([A1].Value, " ") + 1))
End Sub
 

File đính kèm

Upvote 0
Sử dụng phương thức Run xem sao.
PHP:
Sub DelBlankCell(SrcRng As Range)
  Dim Clls As Range, TmpRng As Range
  Set TmpRng = SrcRng(1, 1)
  For Each Clls In SrcRng
    If Clls = "" Then Set TmpRng = Union(TmpRng, Clls)
  Next
  TmpRng.Delete 2
End Sub
PHP:
Sub Main()
Application.Run Left([A1].Value, InStr([A1].Value, " ")), Range(Mid([A1].Value, InStr([A1].Value, " ") + 1))
End Sub
Cách này không ăn rồi... vì code trên chỉ là ví dụ thôi ---> Giả sử 1 sub có hàng đóng tham số mà dùng chiêu xử lý chuổi như trên là không khả thi! (làm sao biết tham số nào là Range, tham số nào là String, tham số nào là... vân vân... )
Dù sao cũng cảm ơn bạn đã trợ giúp!
Hic... Xem ra bài toán này khó nhai quá, đã tìm nát trên Google mà vẫn không tìm được câu trả lời thỏa đáng!
 
Upvote 0
Phù... cuối cùng cũng tìm ra được 1 cách... Hơi bị "độc chiêu" à nha!
PHP:
Sub ExecuteCommand()
  Dim MyCode As String, VBComp As VBComponent, VBCodeMod As CodeModule
  MyCode = Sheet1.Range("A1").Value
  Set VBComp = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule)
  VBComp.Name = "TempMod"
  Set VBCodeMod = ThisWorkbook.VBProject.VBComponents("TempMod").CodeModule
  With VBCodeMod
    .InsertLines 3, _
     "Sub Main()" & vbLf & _
     MyCode & vbLf & _
     "End Sub"
  End With
  Application.Run "Main"
  ThisWorkbook.VBProject.VBComponents.Remove VBComp
End Sub
Xem file
Đương nhiên thuật toán là thế, còn nếu để dùng thật thì phải sửa lại 1 vài chổ (chẳng hạn phải tìm xem TempMod Main có tồn tại hay không?)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
@ Ndu: mình test thấy code bị lỗi (file đính kèm), nhờ bạn xem giúp.
Thông thường thì:
- Nếu copy code của ai đó đang chạy được về máy của mình mà bị lổi thì ta nên nghĩ ngay đến trường hợp thiếu 1 thành phần nào đó trong Tools\Preferences
- Mặc khác, đối với những code có can thiệp vào việc THÊM CODE, XÓA CODE, CHỈNH CODE thì ta phải vào menu Tools\Macro\Security, chuyển sang tab Trusted Publishers và check vào "Trust access... " mới dùng được
Em nghĩ lổi trong file của anh có lẽ nằm ở trường hợp 2!
-----------------------------
Xin nói thêm: Em nghiên cứu code này là dùng để dành cho người chưa rành việc viết code ---> Họ chỉ việc viết các mã lệnh vào 1 khối cell rồi nhấn nút là Excel sẽ tự hiểu ta muốn làm gì... Đồng thời việc sửa code sẽ được edit trực tiếp trên bảng tính (Khỏi cần Alt + F11)
 
Lần chỉnh sửa cuối:
Upvote 0
Bác Nudu làm sao kiểm soát lỗi trong Mycode được bác, nếu Mycode = "1+2+" tức là nếu mình nhập vào ô A1 một đoạn code bị lỗi thì chạy đoạn code trên sẽ báo syntax error ngay. có hàm nào bắt được lỗi trên ko bác
 
Upvote 0
Web KT

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

Back
Top Bottom