Hỏi: Code kiểm tra tên Sheet

  • Thread starter Thread starter pmhoang
  • Ngày gửi Ngày gửi
Liên hệ QC

pmhoang

Thành viên thường trực
Tham gia
4/7/08
Bài viết
269
Được thích
83
Trong quá trình sử dung, người khác có thể, xóa các sheet có tô màu, hoặc là đổi tên
Mình muốn viết 1 Code, kiểm tra các sheet đó còn tồn tại hay không
Nếu tất cả điều tồn tại, thì thực hiện code A nào đó
Nếu 1 trong các sheet bị thay đổi thì thực hien code B nào đó

Nhưng Code kiem tra minh viết thấy nó dài dòng, và không vừa ý mình.
Mình nghĩ hình như ta phải dùng 1 range nào đó, range đó chứa tất cả các tên Sheet cần kiểm tra
Dùng lệnh tìm các ten sheet, néu nó có trong Range thì thực hien lenh A
Nếu 1 trong các ten sheet trong Range ma o ben ngoai ko có thì thuc hien lenh B

Mình chỉ nghi vay thoi, chứ ko hiểu nhiều về mảng, nen lam ko dc. Mong các ban giúp với.
PHP:
Sub KiemTraTenSheet()
Call Dam
Call Cot
Call Data
Call Time
MsgBox "Da kiem tra xong"
End Sub

Private Sub Dam()
  Dim ActiSh As Integer
  For ActiSh = 1 To Sheets.Count
    If Sheets(ActiSh).Name = "Dam" Then Exit Sub
  Next
  MsgBox "Sheet <Dam> khong co"
End Sub
Private Sub Cot()
  Dim ActiSh As Integer
  For ActiSh = 1 To Sheets.Count
    If Sheets(ActiSh).Name = "Cot" Then Exit Sub
  Next
  MsgBox "Sheet <Cot> khong co"
End Sub
Private Sub Data()
  Dim ActiSh As Integer
  For ActiSh = 1 To Sheets.Count
    If Sheets(ActiSh).Name = "Data" Then Exit Sub
  Next
  MsgBox "Sheet <Data> khong co"
End Sub
Private Sub Time()
  Dim ActiSh As Integer
  For ActiSh = 1 To Sheets.Count
    If Sheets(ActiSh).Name = "Time" Then Exit Sub
  Next
  MsgBox "Sheet <Time> khong co"
End Sub
 

File đính kèm

Bạn dùng UDF để kiểm tra sự tồn tại của sheet sẽ gọn hơn:
PHP:
Function SheetExist(WorkSheetName As String) As Boolean
  On Error Resume Next
  SheetExist = Not Sheets(WorkSheetName) Is Nothing
End Function
Hàm trả về giá trị = TRUE nếu sheet tồn tại và FALSE cho điều ngược lại
 
Upvote 0
Trong quá trình sử dung, người khác có thể, xóa các sheet có tô màu, hoặc là đổi tên
Mình muốn viết 1 Code, kiểm tra các sheet đó còn tồn tại hay không
Nếu tất cả điều tồn tại, thì thực hiện code A nào đó
Nếu 1 trong các sheet bị thay đổi thì thực hien code B nào đó

Nhưng Code kiem tra minh viết thấy nó dài dòng, và không vừa ý mình.
Mình nghĩ hình như ta phải dùng 1 range nào đó, range đó chứa tất cả các tên Sheet cần kiểm tra
Dùng lệnh tìm các ten sheet, néu nó có trong Range thì thực hien lenh A
Nếu 1 trong các ten sheet trong Range ma o ben ngoai ko có thì thuc hien lenh B

Mình chỉ nghi vay thoi, chứ ko hiểu nhiều về mảng, nen lam ko dc. Mong các ban giúp với.
PHP:
Sub KiemTraTenSheet()
Call Dam
Call Cot
Call Data
Call Time
MsgBox "Da kiem tra xong"
End Sub

Private Sub Dam()
  Dim ActiSh As Integer
  For ActiSh = 1 To Sheets.Count
    If Sheets(ActiSh).Name = "Dam" Then Exit Sub
  Next
  MsgBox "Sheet <Dam> khong co"
End Sub
Private Sub Cot()
  Dim ActiSh As Integer
  For ActiSh = 1 To Sheets.Count
    If Sheets(ActiSh).Name = "Cot" Then Exit Sub
  Next
  MsgBox "Sheet <Cot> khong co"
End Sub
Private Sub Data()
  Dim ActiSh As Integer
  For ActiSh = 1 To Sheets.Count
    If Sheets(ActiSh).Name = "Data" Then Exit Sub
  Next
  MsgBox "Sheet <Data> khong co"
End Sub
Private Sub Time()
  Dim ActiSh As Integer
  For ActiSh = 1 To Sheets.Count
    If Sheets(ActiSh).Name = "Time" Then Exit Sub
  Next
  MsgBox "Sheet <Time> khong co"
End Sub
Tính trả lời mà thấy ndu đã trả lời, thôi thì up lên luôn.
PHP:
Option Base 1
Sub kiemtra()
Dim ShArr As Variant, shName As String, i As Long
ShArr = Array("Dam", "cot", "Time")
For i = 1 To UBound(ShArr)
  shName = ShArr(i)
  If SheetExists(shName) = False Then
    MsgBox "Khong co " & shName
    Exit Sub
  End If
Next
MsgBox "Da test xong"
End Sub

Function SheetExists(shName) As Boolean
    Dim x As Object
    On Error Resume Next
    Set x = ActiveWorkbook.Sheets(shName)
    If Err = 0 Then SheetExists = True _
        Else SheetExists = False
End Function
 
Upvote 0
Tôi thì làm vầy:
PHP:
Sub KiemTraTenSheet()
  Dim SheetArr, Item As Variant
  SheetArr = Array("Time", "Data", "Cot", "Dam")
  For Each Item In SheetArr
    If SheetExist(Item) = False Then MsgBox "Sheet " & Item & " khong ton tai"
  Next
MsgBox "Da kiem tra xong"
End Sub
PHP:
Function SheetExist(ByVal WorkSheetName As String) As Boolean
  On Error Resume Next
  SheetExist = Not Sheets(WorkSheetName) Is Nothing
End Function
Cũng hao hao giống
 
Upvote 0
Bạn dùng UDF để kiểm tra sự tồn tại của sheet sẽ gọn hơn:
PHP:
Function SheetExist(WorkSheetName As String) As Boolean
  On Error Resume Next
  SheetExist = Not Sheets(WorkSheetName) Is Nothing
End Function
Hàm trả về giá trị = TRUE nếu sheet tồn tại và FALSE cho điều ngược lại

Ham nay dùng tốt quá, nhưng mỗi mỗi khi kiểm tra phải nhập tên Sheet vào, mà ý ở đây là
Nếu tất cả điều tồn tại, thì thực hiện code A nào đó
Nếu 1 trong các sheet bị thay đổi thì thực hien code B nào đó
Anh ThuNghi da lam lồng hàm nay vao code tốt quá.

Mình vẫn chưa hiểu Not Sheets(WorkSheetName) Is Nothing Ban giai thich cho minh biet di
Mình chỉ hiểu theo nghĩa thong thường là = Không phải là Sheets(..) thì lấy Nothing, nhưng sao no lai tra ve True va False?
 
Upvote 0
Mình vẫn chưa hiểu Not Sheets(WorkSheetName) Is Nothing Ban giai thich cho minh biet di
Mình chỉ hiểu theo nghĩa thong thường là = Không phải là Sheets(..) thì lấy Nothing, nhưng sao no lai tra ve True va False?
Thì như bạn nói bình thường thôi...
KHÔNG ĐƯỢC TÈ ---> Đơn giản nghĩa là CẤM TÈ
CẤM KHÔNG ĐƯỢC TÈ ---> Ngược lại điều này, lý ra phải là ĐƯỢC PHÉP TÈ VÔ TƯ (Trong khi có 1 số người không biết tại sao lại cứ dùng cấm không được ...)
Ẹc... Ẹc...
Quay lại bài toán:
Sheets(SHEET NÀY) Is Nothing then...
Nghĩa SHEET NÀY KHÔNG CÓ... (hay Không có sheet này)
Vậy
Not Sheets(SHEET NÀY) Is Nothing...
Nghĩa là điều ngược lại ---> SHEET NÀY.. CÓ... (có tìm thấy)
Thế thôi!
---------
Bạn sẽ còn gặp cái vụ If Not... Is Nothing này dài dài
---------
Như bạn nói, kiểm tra nếu có 1 sheet không tồn tại thì làm code A, ngược lại thì làm code B ---> Vậy thêm Exit Sub như ThuNghi làm ấy:
PHP:
Sub KiemTraTenSheet()
  Dim SheetArr, Item As Variant
  SheetArr = Array("Time", "Data", "Cot", "Dam")
  For Each Item In SheetArr
    If SheetExist(Item) = False Then
      MsgBox "Sheet " & Item & " khong ton tai"
      Exit Sub
    End If
  Next
MsgBox "Da kiem tra xong"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi thì làm vầy:
PHP:
Sub KiemTraTenSheet()
  Dim SheetArr, Item As Variant
  SheetArr = Array("Time", "Data", "Cot", "Dam")
  For Each Item In SheetArr
    If SheetExist(Item) = False Then MsgBox "Sheet " & Item & " khong ton tai"
  Next
MsgBox "Da kiem tra xong"
End Sub
PHP:
Function SheetExist(ByVal WorkSheetName As String) As Boolean
  On Error Resume Next
  SheetExist = Not Sheets(WorkSheetName) Is Nothing
End Function
Hay quá, ngắn gọn mà hiệu quả, chuyến này mình phải tìm sách học về Array mới được.
Nhưng theo mình được biết thì
Dim SheetArr, Item As Variant
Excel hiểu là SheetArr là biến mặc định (là Variant)
Còn Item as Variant là mình đặt cho nó là Variant luôn

Trong trường hợp này thì tự dung nó khùng khớp nên nó đúng. chứ nếu trường hợp khác có thể sẽ không đúng phải ko?
 
Upvote 0
Tôi gữi bạn 1 code khác, gộp Sub và Function lại thành 1 ---> Xem chừng dể hiểu hơn đấy (vì không có NOT ):
PHP:
Sub KiemTraTenSheet()
  Dim SheetArr As Variant, Item As Variant
  On Error Resume Next
  SheetArr = Array("Time", "Data", "Cot", "Dam")
  For Each Item In SheetArr
    If Sheets(Item) Is Nothing Then
      MsgBox "Sheet " & Item & " khong ton tai": Exit Sub
    End If
  Next
  MsgBox "Da kiem tra xong"
End Sub
Với code này, bắt buộc phải có On Error Resume Next ở trên đầu cùng
Hoặc có thể 1 kiểu khác (dùng hàm LEN)
PHP:
Sub KiemTraTenSheet()
  Dim SheetArr As Variant, Item As Variant
  On Error Resume Next
  SheetArr = Array("Time", "Data", "Cot", "Dam")
  For Each Item In SheetArr
    If Len(Sheets(Item).Name) = 0 Then
      MsgBox "Sheet " & Item & " khong ton tai": Exit Sub
    End If
  Next
  MsgBox "Da kiem tra xong"
End Sub
Vân vân và vân vân ---> Biến hóa vô cùng
 

File đính kèm

Upvote 0
Tôi gữi bạn 1 code khác, gộp Sub và Function lại thành 1 ---> Xem chừng dể hiểu hơn đấy (vì không có NOT ):
Mình đã theo hướng của bạn và tạo 1 Code làm việc theo ý muốn của mình (Nếu Tên Sheets A sai thì thực hiện lệnh A, Tên Sheet B sai thi thực hiện lệnh B...,Nếu không có tên nào sai thì thực hiện lệnh XYZ), Bạn xem như vậy đã ngắn gọn chưa nhé. Cảm ơn bạn nhiều!
PHP:
Sub KiemTraTenSheet()
  Dim SheetArr As Variant, Item As Variant, SheetsNoExit As Integer
  On Error Resume Next
  SheetNoExit = 0
  SheetArr = Array("Time", "Data", "Cot", "Dam")
  For Each Item In SheetArr
    If Sheets(Item) Is Nothing Then
      SheetNoExit = 1
      MsgBox "Sheet " & Item & " khong ton tai"
      Select Case Item
        Case "Time"
          MsgBox "Thuc hien lenh sai ten Time"
        Case "Data"
          MsgBox "Thuc hien lenh sai ten Data"
        Case "Cot"
          MsgBox "Thuc hien lenh sai ten Cot"
      End Select
    End If
  Next
  If SheetNoExit = 0 Then MsgBox "Thuc hien lenh Khong co sai ten Sheet"
End Sub
 
Upvote 0
Mình đã theo hướng của bạn và tạo 1 Code làm việc theo ý muốn của mình (Nếu Tên Sheets A sai thì thực hiện lệnh A, Tên Sheet B sai thi thực hiện lệnh B...,Nếu không có tên nào sai thì thực hiện lệnh XYZ), Bạn xem như vậy đã ngắn gọn chưa nhé. Cảm ơn bạn nhiều!
PHP:
Sub KiemTraTenSheet()
  Dim SheetArr As Variant, Item As Variant, SheetsNoExit As Integer
  On Error Resume Next
  SheetNoExit = 0
  SheetArr = Array("Time", "Data", "Cot", "Dam")
  For Each Item In SheetArr
    If Sheets(Item) Is Nothing Then
      SheetNoExit = 1
      MsgBox "Sheet " & Item & " khong ton tai"
      Select Case Item
        Case "Time"
          MsgBox "Thuc hien lenh sai ten Time"
        Case "Data"
          MsgBox "Thuc hien lenh sai ten Data"
        Case "Cot"
          MsgBox "Thuc hien lenh sai ten Cot"
      End Select
    End If
  Next
  If SheetNoExit = 0 Then MsgBox "Thuc hien lenh Khong co sai ten Sheet"
End Sub
Cũng gọn rồi... nhưng tôi vẫn thắc mắc tại sao lại cần đến Select Case, trong khi với code trên tôi sửa lại chỉ vầy:
PHP:
Sub KiemTraTenSheet()
  Dim SheetArr As Variant, Item As Variant
  On Error Resume Next
  SheetNoExit = 0
  SheetArr = Array("Time", "Data", "Cot", "Dam")
  For Each Item In SheetArr
    If Sheets(Item) Is Nothing Then
      MsgBox "Sheet " & Item & " khong ton tai"
      MsgBox "Thuc hien lenh sai ten " & Item
      Exit Sub
    End If
  Next
  MsgBox "Thuc hien lenh Khong co sai ten Sheet"
End Sub
Tôi lấy ví dụ bạn đang có 4 đoạn code dành thực hiện lệnh khi sai tên sheet:
PHP:
Private Sub Time()
  MsgBox "Day la code sai Time"
End Sub
PHP:
Private Sub Data()
  MsgBox "Day la code sai Data"
End Sub
PHP:
Private Sub Cot()
  MsgBox "Day la code sai Cot"
End Sub
PHP:
Private Sub Dam()
  MsgBox "Day la code sai Dam"
End Sub
và 1 đoạn code thực hiện lệnh khi kiểm tra chính xác tên sheet
PHP:
Private Sub Chinhxac()
  MsgBox "Day la code Khong co sai ten Sheet"
End Sub
Vậy code chính của bạn sẽ là:
PHP:
Sub KiemTraTenSheet()
  Dim SheetArr As Variant, Item As Variant
  On Error Resume Next
  SheetNoExit = 0
  SheetArr = Array("Time", "Data", "Cot", "Dam")
  For Each Item In SheetArr
    If Sheets(Item) Is Nothing Then
      MsgBox "Sheet " & Item & " khong ton tai"
      Run Item: Exit Sub
    End If
  Next
  Run "Chinhxac"
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cũng gọn rồi... nhưng tôi vẫn thắc mắc tại sao lại cần đến Select Case, trong khi với code trên tôi sửa lại chỉ vầy:
Cam ơn bạn rất nhiều. Mình dùng Select Case vì mình không có biết lệnh Run "Sub", Nay thấy bạn dùng. thật sự sáng mắt ra. Trước giờ chỉ biết dùng Call Sub à. Cảm on ban nhiều. Chúc bạn luôn khỏe... đẻ giúp được nhiều người chưa biết gì như mình.
 
Upvote 0
Web KT

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

Back
Top Bottom