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

nhnn1986

Thành viên chính thức
Tham gia ngày
30 Tháng mười 2017
Bài viết
93
Được thích
15
Điểm
170
Tuổi
29
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 ạ./.
 

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
2,512
Được thích
2,362
Điểm
360
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
 

lameco411

Thành viên hoạt động
Tham gia ngày
27 Tháng mười một 2015
Bài viết
162
Được thích
63
Điểm
180
Tuổi
30
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?
 

nhnn1986

Thành viên chính thức
Tham gia ngày
30 Tháng mười 2017
Bài viết
93
Được thích
15
Điểm
170
Tuổi
29
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
 

lameco411

Thành viên hoạt động
Tham gia ngày
27 Tháng mười một 2015
Bài viết
162
Được thích
63
Điểm
180
Tuổi
30
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
 

nhnn1986

Thành viên chính thức
Tham gia ngày
30 Tháng mười 2017
Bài viết
93
Được thích
15
Điểm
170
Tuổi
29
Để 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 Cảm ơn./.
 

lameco411

Thành viên hoạt động
Tham gia ngày
27 Tháng mười một 2015
Bài viết
162
Được thích
63
Điểm
180
Tuổi
30

VetMini

Bàn phiếm qua bàn phím
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
8,313
Được thích
9,660
Điểm
560
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
 

nhnn1986

Thành viên chính thức
Tham gia ngày
30 Tháng mười 2017
Bài viết
93
Được thích
15
Điểm
170
Tuổi
29
Đâ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
 

nhnn1986

Thành viên chính thức
Tham gia ngày
30 Tháng mười 2017
Bài viết
93
Được thích
15
Điểm
170
Tuổi
29
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
 

phuocam

Thành viên mới
Tham gia ngày
16 Tháng năm 2013
Bài viết
2,437
Được thích
3,243
Điểm
560
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?
 

xuanhiencp

Thành viên mới
Tham gia ngày
3 Tháng một 2017
Bài viết
25
Được thích
3
Điểm
165
Tuổi
32
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
 

nhnn1986

Thành viên chính thức
Tham gia ngày
30 Tháng mười 2017
Bài viết
93
Được thích
15
Điểm
170
Tuổi
29
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 ạ
 

File đính kèm

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,071
Được thích
4,518
Điểm
560
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:

nhnn1986

Thành viên chính thức
Tham gia ngày
30 Tháng mười 2017
Bài viết
93
Được thích
15
Điểm
170
Tuổi
29
Cảm ơn Anh/Chị ạ. hí hí
 
Top Bottom