Đang ở sheet trung gian muốn gọi Sub để thực hiện công việc của các sheet khác (3 người xem)

Liên hệ QC

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

AnhThu-1976

Thành viên tích cực
Tham gia
17/10/14
Bài viết
1,065
Được thích
175
Anh chị giúp sửa code của em như sau:
Công việc như sau:
1/ Em đứng tại Sheet1 để chạy Macro1, sau đó em sang Sheet2 để chạy Macro2
Bây giờ em muốn đứng tại sheet3 để chạy Macro1 thực hiện tại sheet1 & chạy Macro2 thực hiện tại sheet2 thì phải viết code như thế nào?
Mã:
Sub Macro1()
    Range("A1:E1").Select
    Selection.Clear
End Sub
Sub Macro2()
    Range("A2:E2").Select
    Selection.Clear
End Sub
Sub TH_1()
    With Sheets(Sheet1)
             Call Macro1
    End With
    With Sheets(Sheet2)
               Call Macro2
    End With
End Sub
Sub TH_2()
    Application.Run "Sheet1.Macro1"
    Application.Run "Sheet2.Macro2"
    End Sub
Sub TH_1 và TH_2 là em thử viết nhưng bị sai
p/s: macro1 và 2 chỉ là 2 ví dụ đơn giản để thử nghiệm
 
Với code macro1, macro2 như thế và macro1 chỉ thực hiên cho sheet1, macro2 chỉ cho sheet2 thì đứng từ sheet khác chỉ có 1 cách duy nhất là activate sheet1 rôi gọi macro1 sau đó activate sheet2 rôi gọi macro2.
Mã:
Sub TH_1()
    Sheet1.Activate
    Call Macro1
    Sheet2.Activate
    Call Macro2
End Sub
Nhưng nếu đã muốn macro1 chỉ xóa sheet1 thì tại sao lại viết code như thế? Mà xóa không cần Select.
Mã:
Sub Macro1()
    Sheet1.Range("A1:E1").Clear
End Sub
Sub Macro2()
    Sheet2.Range("A2:E2").Clear
End Sub
Sub TH_1()
    Call Macro1
    Call Macro2
End Sub

Còn nếu bạn nói
p/s: macro1 và 2 chỉ là 2 ví dụ đơn giản để thử nghiệm
thì cho vd. khác đi, sát với thực tế bạn cần. Nên nhớ hỏi thế nào thì sẽ có đáp thế đó.
 
Upvote 0
Ví dụ lan man hết sức. Tôi cũng không rõ là bạn có biết gì về hệ thống Module của VBA trong Excel, hay là bạn biết mà diễn tả thiếu sót.

Theo như code của Sub TH_1 thì Macro1 và Macro2 nằm ở trong một Module nào đó, có lẽ cũng Module với TH_1
Theo như code của Sub TH_2 thì Macro1 nằm trong Module của Sheet1 và Macro2 nằm trong Module của Sheet2

Trên là nói về Module, nơi đặt code. Về code thì có lẽ bạn không nắm được thế nào là tầm vực của biến và đối tượng.

Range được mặc định là thuộc tính của đối tượng Sheet đang active.
Lệnh With có nhiệm vụ nối tiền tố cho range nhưng chỉ có tầm vực trong vòng từ With đến End With. Bên trong khối With gọi một sub khác thì nhiệm vụ quản lý sẽ tạm thời chuyển sang Sub ấy, tức là ngoài tầm vực của khối With. Túm lại, các lệnh With Sub TH_1 hoàn toàn vô dụng.
 
Upvote 0
Với code macro1, macro2 như thế và macro1 chỉ thực hiên cho sheet1, macro2 chỉ cho sheet2 thì đứng từ sheet khác chỉ có 1 cách duy nhất là activate sheet1 rôi gọi macro1 sau đó activate sheet2 rôi gọi macro2.
Mã:
Sub TH_1()
    Sheet1.Activate
    Call Macro1
    Sheet2.Activate
    Call Macro2
End Sub
Nhưng nếu đã muốn macro1 chỉ xóa sheet1 thì tại sao lại viết code như thế? Mà xóa không cần Select.
Mã:
Sub Macro1()
    Sheet1.Range("A1:E1").Clear
End Sub
Sub Macro2()
    Sheet2.Range("A2:E2").Clear
End Sub
Sub TH_1()
    Call Macro1
    Call Macro2
End Sub

Còn nếu bạn nói

thì cho vd. khác đi, sát với thực tế bạn cần. Nên nhớ hỏi thế nào thì sẽ có đáp thế đó.
Hướng dẫn của anh vào Excel tiếng Việt sẽ bị lỗi.
Nếu VBComponent Worksheet Properties CodeName là một tên khác thì không sao.
Nếu là Sheet1 ... Sheet.. thì sẽ lỗi.
PHP:
Worksheets("Sheet1").Range("A1:E1").Clear
MotTenKhac.Range("A1:E1").Clear
 
Upvote 0
Sub TH_1() Sheet1.Activate Call Macro1 Sheet2.Activate Call Macro2 End Sub
Code đã theo ý muốn của em
Cho em hỏi thêm em đang đứng ở sheet3 để chạy code trên thì nó sẽ chọn A2:E2 của sheet2.
Bây giờ em muốn khi chạy xong thì con trỏ nó sẽ trở lại sheet3 thì thế nào
Em viết thêm câu lệnh nhưng nó báo lỗi
Mã:
Sub TH_1() 
Sheet1.Activate Call Macro1 
Sheet2.Activate Call Macro2 
Sheets("Sheet3").Range("C1").Select ----> bị lỗi
End Sub
Em cảm ơn ạ!
 
Upvote 0
Bây giờ em muốn khi chạy xong thì con trỏ nó sẽ trở lại sheet3 thì thế nào
Bạn có thể làm như sau:
Mã:
Worksheets("Sheet3").Activate
[C1].Select '= Range("C1").Select
Hoặc
Application.Goto (ActiveWorkbook.Sheets("Sheet3").Range("C1"))
 
Upvote 0
Code đã theo ý muốn của em
Cho em hỏi thêm em đang đứng ở sheet3 để chạy code trên thì nó sẽ chọn A2:E2 của sheet2.
Bây giờ em muốn khi chạy xong thì con trỏ nó sẽ trở lại sheet3 thì thế nào
Em viết thêm câu lệnh nhưng nó báo lỗi
Mã:
Sub TH_1()
Sheet1.Activate Call Macro1
Sheet2.Activate Call Macro2
Sheets("Sheet3").Range("C1").Select ----> bị lỗi
End Sub
Em cảm ơn ạ!
Sheet1.Activate là activate sheet1, Sheet2.Activate là activate shee2. Vậy muốn activate sheet3 thì làm thế nào? Sao nhiều người lười suy nghĩ thế nhỉ. Ít ra thì cũng cứ thử bừa xem nó thế nào. Chả nhẽ cái gì cũng hỏi?

Mà nếu muốn macro1 chỉ thực thi cho sheet1 thì tại sao không sửa thành
Mã:
Sub Macro1()
    Sheet1.Range("A1:E1").Clear
End Sub
???
Lúc đó không chơi trò chơi Activate liên tục nữa.
 
Upvote 0
Em cũng đã thử
Sheet3.Activate và nhiều cách khác rồi.
Nhưng nó báo lỗi, nên mới hỏi
Bạn không làm thế được. Nếu muốn Select Range mà sheet không là sheet hoạt động thì trước hết phải Activate sheet. Tức thay Sheets("Sheet3").Range("C1").Select bằng
Mã:
Sheets("Sheet3").Activate
    Range("C1").Select
 
Lần chỉnh sửa cuối:
Upvote 0
Hướng dẫn của anh vào Excel tiếng Việt sẽ bị lỗi.
Nếu VBComponent Worksheet Properties CodeName là một tên khác thì không sao.
Nếu là Sheet1 ... Sheet.. thì sẽ lỗi.
PHP:
Worksheets("Sheet1").Range("A1:E1").Clear
MotTenKhac.Range("A1:E1").Clear
Hướng dẫn của tôi là nói về Activate. Còn Sheet1, Sheet2 là của người ta, tôi để nguyên. Mà người ta có Sheet1, Sheet2.

Tôi không có tiếng Việt, nhưng bạn có thể giải thích, tại sao khi là Sheet1 thì có lỗi?

Activate là tôi nói khi giữ nguyên code macro1 và macro thôi. Tôi khuyên rõ ràng là không chơi trò Activate và Select liên tục mà.
 
Upvote 0
Hướng dẫn của tôi là nói về Activate. Còn Sheet1, Sheet2 là của người ta, tôi để nguyên. Mà người ta có Sheet1, Sheet2.

Tôi không có tiếng Việt, nhưng bạn có thể giải thích, tại sao khi là Sheet1 thì có lỗi?

Activate là tôi nói khi giữ nguyên code macro1 và macro thôi. Tôi khuyên rõ ràng là không chơi trò Activate và Select liên tục mà.
Excel Tiếng Việt sẽ tự động Dịch Sheet1 ...Sang Trang_tính1 ... Nếu Sheet1 được đổi sang tên CodeName khác thì sẽ không sao

Capture.PNG
 
Upvote 0
Excel Tiếng Việt sẽ tự động Dịch Sheet1 ...Sang Trang_tính1 ... Nếu Sheet1 được đổi sang tên CodeName khác thì sẽ không sao

View attachment 211393
Thì người ta có những tên Sheet1, Sheet2, Sheet3 mà. Có là Trang_tính gì đâu. Tôi hướng dẫn cho người cụ thể, có sheet với tên cụ thể. Họ đã chạy code với những tên đó mà không có lỗi gì.

Nói như bạn thì tôi cũng có thể nói là bạn hướng dẫn
Mã:
Worksheets("Sheet1").Range("A1:E1").Clear
mà người ta chỉ có các sheet DanhMuc, Bao cao thì cũng sai, cũng sẽ có lỗi.

Khi người ta dùng Sheet1 thì chắc là người ta biết nó là cái gì, vì ít ra người ta cũng nhìn thấy nó trong VBE. Vậy khi vào một tập tin cụ thể thì họ nhìn trong VBE thế nào họ sẽ sửa Sheet1 thành thế đó. Thế thôi.

Những người trả lời trên GPE cũng thường cho những code vd.
Mã:
Worksheets("Sheet1")...
Worksheets("GPE")...
Worksheets("DanhMuc")...
Worksheets("DMuc")...
mà không cần biết sheet của người hỏi có những tên như thế không. Khác thì phải sửa thôi.

Kiểu: "Nếu bạn hướng dẫn thế mà người ta có sheet tên khác thì sai" chỉ là đeo bám.

Còn nếu người ta gửi cho đối tác dùng bản tiếng Việt thì người kia phải tự sửa lại thôi. Nhưng tôi trả lời với Sheet1 vì bản thân người ta dùng Sheet 1. Không phải tôi bịa ra Sheet1, Sheet2, Sheet3. Nếu bạn muốn góp ý và chia sẻ về phiên bản tiếng Việt thì bạn chia sẻ với chủ chủ đề. Bản thân người ta dùng thế và tôi chỉ lặp lại cái mà người ta dùng thôi
 
Lần chỉnh sửa cuối:
Upvote 0
Code đã theo ý muốn của em
Cho em hỏi thêm em đang đứng ở sheet3 để chạy code trên thì nó sẽ chọn A2:E2 của sheet2.
Bây giờ em muốn khi chạy xong thì con trỏ nó sẽ trở lại sheet3 thì thế nào
Em viết thêm câu lệnh nhưng nó báo lỗi
Mã:
Sub TH_1()
Sheet1.Activate Call Macro1
Sheet2.Activate Call Macro2
Sheets("Sheet3").Range("C1").Select ----> bị lỗi
End Sub
Em cảm ơn ạ!

Bạn đi du lịch, ngụ nhà người bà con. Bây giờ bạn đi dạo phố chơi và dạo xong thì muốn trở về chỗ cũ thì làm cách nào?
Chuyện đơn giản nhất là ghi địa chỉ vào cuốn sổ tay. Lúc về chỉ việc nhảy xe ôm và đọc địa chỉ.

Sub TH_1()

Dim noiDangO As Range
Set noiDangO = Activecell


' activate sheet khác
' call subs...


noiDangO.Worksheet.Activate ' trở về sheet cũ
noiDangO.Select ' trở về cell cũ


End Sub
 
Upvote 0
Người ta cũng hiểu được lôgíc phải là thế nào nhưng người ta viết gộp thành
Mã:
Sheets("Sheet3").Range("C1").Select

Mà cái đó VBA lại không chấp nhận.

Anh phải gõ cửa để cửa mở ra mới được phép lựa chọn cô Mai Hương. Cửa nhà đang đóng thì không cho phép chọn. :D
 
Upvote 0
Còn nếu người ta gửi cho đối tác dùng bản tiếng Việt thì người kia phải tự sửa lại thôi.
Em không có Excel tiếng Việt nhưng tự tin khẳng định: Không phải sửa anh ạ. :)

File đã có thì không có chuyện thay đổi ngôn ngữ những thành phần trong cấu trúc của file (nếu có đổi thì đây là một lỗi to đùng của MS Excel).
Ngay khi tạo file mới (File >> New) thì mới phụ thuộc vào ngôn ngữ của phiên bản Excel đó đang sử dụng.
 
Upvote 0
Web KT

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

Back
Top Bottom