Giúp em "Call Sub" khi thỏa điều kiện sheets

Liên hệ QC

nhnn1986

Thành viên hoạt động
Tham gia
30/10/17
Bài viết
108
Được thích
19
Giới tính
Nam
Chào anh/chị ạ

Em có vấn đề cần giúp đỡ là:

Em có tầm 50 sheets với tên các sheets(i) có cấu trúc AAA0j ví dụ: AAA0123, AAA0124, AAA0987 v.v.v => Tức là 4 chữ cái đầu sheets luôn là "AAA0" và j (J có 3 ký tự). Có sheet có dữ liệu và có sheet không.
Nay em muốn có Macro để chạy các Macro khác nếu thỏa 02 điều kiện: 1. Nếu Left(sheets(i),4) = "AAA0" và 2. Sheet(i).range("A2")<>0
Thì sẽ Call sub data_j => data_j là một macro để lấy dữ liệu từ sheet(i)

Ví dụ:
sheets("AAA0123").range("A2") <>0 => Call Sub data_123
sheets("AAA0124").range("A2") =0 => Bỏ qua
sheets("AAA0987").range("A2") <>0 => Call Sub data_987
sheets("BBB0124").range("A2") =0 => Bỏ qua

Em xin cảm ơn trước ạ./.
 
Chào anh/chị ạ

Em có vấn đề cần giúp đỡ là:

Em có tầm 50 sheets với tên các sheets(i) có cấu trúc AAA0j ví dụ: AAA0123, AAA0124, AAA0987 v.v.v => Tức là 4 chữ cái đầu sheets luôn là "AAA0" và j (J có 3 ký tự). Có sheet có dữ liệu và có sheet không.
Nay em muốn có Macro để chạy các Macro khác nếu thỏa 02 điều kiện: 1. Nếu Left(sheets(i),4) = "AAA0" và 2. Sheet(i).range("A2")<>0
Thì sẽ Call sub data_j => data_j là một macro để lấy dữ liệu từ sheet(i)

Ví dụ:
sheets("AAA0123").range("A2") <>0 => Call Sub data_123
sheets("AAA0124").range("A2") =0 => Bỏ qua
sheets("AAA0987").range("A2") <>0 => Call Sub data_987
sheets("BBB0124").range("A2") =0 => Bỏ qua
Em xin cảm ơn trước ạ
Vậy bạn dùng lệnh if như vầy.
Mã:
If Left(Sheets(i).Name, 4) = "AAA0" And Sheets(i).Range("A2").Value <> 0 Then
 
Upvote 0
Chào anh/chị ạ

Em có vấn đề cần giúp đỡ là:

Em có tầm 50 sheets với tên các sheets(i) có cấu trúc AAA0j ví dụ: AAA0123, AAA0124, AAA0987 v.v.v => Tức là 4 chữ cái đầu sheets luôn là "AAA0" và j (J có 3 ký tự). Có sheet có dữ liệu và có sheet không.
Nay em muốn có Macro để chạy các Macro khác nếu thỏa 02 điều kiện: 1. Nếu Left(sheets(i),4) = "AAA0" và 2. Sheet(i).range("A2")<>0
Thì sẽ Call sub data_j => data_j là một macro để lấy dữ liệu từ sheet(i)

Ví dụ:
sheets("AAA0123").range("A2") <>0 => Call Sub data_123
sheets("AAA0124").range("A2") =0 => Bỏ qua
sheets("AAA0987").range("A2") <>0 => Call Sub data_987
sheets("BBB0124").range("A2") =0 => Bỏ qua

Em xin cảm ơn trước ạ./.
Bạn đừng nói với mình là bạn có 50 cái sub nha?
 
Upvote 0
Bạn đừng nói với mình là bạn có 50 cái sub nha?
Chính xác là mình có 50 cái sub, hơi ngố tí nhưng mình không đủ trình để đặt các điều kiện nên đành tạo đúng 50 sub. Dĩ nhiên nó lại lòi ra cái khó là 50 sheets kia không phải sheets nào cũng có data.

@snow25
Khi đầu mình cũng nghĩ đơn giản thế nhưng còn điều kiện phải đối chiếu nếu sheets("AAA0j").range("A2")<>0 thì mới Call data_j, ngược lại .range("A2") = sẽ bỏ qua không Call
 
Upvote 0
Chính xác là mình có 50 cái sub, hơi ngố tí nhưng mình không đủ trình để đặt các điều kiện nên đành tạo đúng 50 sub. Dĩ nhiên nó lại lòi ra cái khó là 50 sheets kia không phải sheets nào cũng có data.

@snow25
Khi đầu mình cũng nghĩ đơn giản thế nhưng còn điều kiện phải đối chiếu nếu sheets("AAA0j").range("A2")<>0 thì mới Call data_j, ngược lại .range("A2") = sẽ bỏ qua không Call
Mã:
Sub runOtherSub()
Dim c As Worksheet
    For Each c In ActiveWorkbook.Worksheets
        If Left(c.Name, 4) = "AAA0" And c.Range("A2").Value <> "" Then
            Call subGiDo(Right(c.Name, 3))
        End If
    Next c
End Sub
Mình nghĩ cái sub gì đó bạn nên tối giản lại để có thể sử dụng cho nhiều sheet.
Bài đã được tự động gộp:

Chính xác là mình có 50 cái sub, hơi ngố tí nhưng mình không đủ trình để đặt các điều kiện nên đành tạo đúng 50 sub. Dĩ nhiên nó lại lòi ra cái khó là 50 sheets kia không phải sheets nào cũng có data.

@snow25
Khi đầu mình cũng nghĩ đơn giản thế nhưng còn điều kiện phải đối chiếu nếu sheets("AAA0j").range("A2")<>0 thì mới Call data_j, ngược lại .range("A2") = sẽ bỏ qua không Call
Cái có data hay không không quan trọng bằng việc các sheet đó có cùng cấu trúc hay không? Nếu có cấu trúc như nhau thì bạn gộp lại thành mọt sub. Cũng dễ à không khó đâu bạn
 
Upvote 0
Để tối mình check cách của @lameco411 nhé, bạn đoán đúng rồi 50 sheet kia có cấu trúc khác nhau nên khó gộp thành 1 sub được hi hi

Many thanks./.
 
Upvote 0
Bạn đừng nói với mình là bạn có 50 cái sub nha?
Đâu có sao. Miễn là tên sub đúng với tên sheet là được

For Each sh In WorkSheets
' tự thêm phần bẫy lỗi cho trường hợp tìm không thấy sub
If sh.Range("A2").Value2 <> "" Then Application.Run "data_" & Right(sh.Name, 3)
Next sh
 
Upvote 0
Đâu có sao. Miễn là tên sub đúng với tên sheet là được

For Each sh In WorkSheets
' tự thêm phần bẫy lỗi cho trường hợp tìm không thấy sub
If sh.Range("A2").Value2 <> "" Then Application.Run "data_" & Right(sh.Name, 3)
Next sh
Giúp em bẫy lỗi với ạ hí hí. EM đang sợ 02 trường hợp có thể xảy ra mà không biết bẫy thế nào
1. Lỗi khi không tìm thấy Sub (Như anh nói)
2. Lỗi khi có sub mà không thỏa điều kiện => End Sub
 
Upvote 0
Cảm ơn 02 cách của @VetMini@lameco411 nhưng code vẫn không Call Sub.

Có lẽ em làm theo thủ công code dài 02 bước
Bước 1: Call hết sub
Mã:
Sub CallAllsub()
    Call data_101
    Call data_102
    Call data_103
    Call data_104
Tiếp tục đến max
    Call data_150
End sub

Bước 2: Trong từng sub đặt check giá trị sheets để xác định có chạy tiếp code hay exit sub:
Mã:
Sub data_101()
If sheets("AAA0101").range("A2")=0 then exit sub
else if -------Chạy code chính
End sub
Cứ thế đặt hết 50 sub
Mã:
Sub data_102()
If sheets("AAA0102").range("A2")=0 then exit sub
else if -------Chạy code chính
End sub
Mã:
Sub data_150()
If sheets("AAA0150").range("A2")=0 then exit sub
else if -------Chạy code chính
End sub

Như thế này không rõ file có nặng hơn không ạ hic
 
Upvote 0
Có lẽ em làm theo thủ công code dài 02 bước
Bước 1: Call hết sub
Bước 2: Trong từng sub đặt check giá trị sheets để xác định có chạy tiếp code hay exit sub:
Như thế này không rõ file có nặng hơn không ạ hic
Bước 1 của bạn hơi dài, có thể rút gọn:
Mã:
Public Sub test()
Dim i As Long
    For i = 101 To 150
        If Sheets("AAA0" & i).Range("A2") <> 0 Then
            Application.Run "Module1.data_" & i
        End If
    Next
End Sub
50 sub còn lại không thấy nên chưa biết có rút gọn được hay không?
 
Upvote 0
Thực ra câu hỏi bạn không hề khó, nhưng bạn hãy đưa file lên đi, mọi người sẽ dễ hình dung hơn
 
Upvote 0
Thanks @xuanhiencp
Để dễ hình dung em gửi kèm file với sheets("Result") là chủ yếu, một số sheets khác để demo Sub. Anh/Chị giúp em với ạ
 

File đính kèm

  • Main.xlsm
    58.6 KB · Đọc: 4
Upvote 0
Cảm ơn @xuanhiencp
Để dễ hình dung em gửi kèm file với sheets("Result") là chủ yếu, một số sheets khác để demo Sub. Anh/Chị giúp em với ạ
Khi có những đoạn code lặp đi lặp lại mà chỉ có "chút" thay đổi thì nên nghĩ ngay tới vòng lặp FOR, vì nó được sinh ra để xử lý những trường hợp như thế.

Toàn bộ code trong Module2
Mã:
Sub Callallsub()
Dim k As Long, sh As Worksheet
    delete
    For k = 1 To 50
        Set sh = Worksheets("AAA" & Format(k, "000"))
        If sh.Range("A2").Value <> "" Then data sh         ' hoặc Call data(sh)
    Next k
End Sub

Sub delete()
Dim lr As Long
    With Worksheets("result")
        lr = .Cells(Rows.Count, "B").End(xlUp).Row
        .Range("A1:B" & lr).Clear
    End With
End Sub

Sub data(ByVal sh As Worksheet)
Dim lr As Long
    With Worksheets("result")
        lr = .Cells(Rows.Count, "B").End(xlUp).Row + 1
        .Range("B" & lr).Value = sh.Range("B3").Value
    End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Anh/Chị ạ. hí hí
 
Upvote 0
Web KT
Back
Top Bottom