Hỏi cách đặt tên sheet có điều kiện trong Excel (1 người xem)

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

dohoainamnam

Thành viên mới
Tham gia
2/3/11
Bài viết
20
Được thích
0
Tôi muốn đổi tên sheet trong excel giống như dữ liệu của một ô của một sheet khác. Cụ thể trong file đính kèm, tôi muốn tên của sheet2 thay đổi tùy theo công thức của ô C7 của sheet1, khi ô C7 thay đổi thì tên của sheet2 cũng thay đổi theo. Xin mọi người chỉ giáo.
Chân thành cảm ơn
 

File đính kèm

Tôi muốn đổi tên sheet trong excel giống như dữ liệu của một ô của một sheet khác. Cụ thể trong file đính kèm, tôi muốn tên của sheet2 thay đổi tùy theo công thức của ô C7 của sheet1, khi ô C7 thay đổi thì tên của sheet2 cũng thay đổi theo. Xin mọi người chỉ giáo.
Chân thành cảm ơn
Thử với code này nhé :
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect([C7], Target) Is Nothing Then
    Sheet2.Name = [C7].Value
End If
End Sub
 

File đính kèm

Upvote 0
Upvote 0
Phải bẫy lỗi nhiều đấy:
- Tên sheet đã tồn tại
- Tên sheet không hợp lệ
Cảm ơn sư phụ, em cũng phân vân nhưng không biết liệu có khi nào tác giả đặt tên sheet là history không sư phụ nhỉ? Cứ để người dùng trải nghiệm và phản hồi vậy. hehe
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect([C7], Target) Is Nothing Then
    If Checkname([C7].Value) Or UCase([C7].Value) = "HISTORY" Then
        MsgBox "Ten sheet da ton tai Hoac Ten sheet khong hop le"
        Exit Sub
    Else
            Sheet2.Name = [C7].Value
    End If
End If
End Sub
'===============================
Public Function Checkname(sheetName As String) As Boolean
    On Error Resume Next
    Checkname = CBool(Len(Worksheets(sheetName).Name) > 0)
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn sư phụ, em cũng phân vân nhưng không biết liệu có khi nào tác giả đặt tên sheet là history không sư phụ nhỉ? Cứ để người dùng trải nghiệm và phản hồi vậy. hehe
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect([C7], Target) Is Nothing Then
    If Checkname([C7].Value) Or UCase([C7].Value) = "HISTORY" Then
        MsgBox "Ten sheet da ton tai Hoac Ten sheet khong hop le"
        Exit Sub
    Else
            Sheet2.Name = [C7].Value
    End If
End If
End Sub
'===============================
Public Function Checkname(sheetName As String) As Boolean
    On Error Resume Next
    Checkname = CBool(Len(Worksheets(sheetName).Name) > 0)
End Function
Như đã nói ở trên: Còn thiếu hàm kiểm tra tính hợp lệ của tên sheet nữa.
Theo quy định của anh Bill thì tên sheet hợp lệ phải là:
- Tên không được dài quá 31 ký tự
- Tên không được chứa các ký tự: \:\][/?*
Vậy nên phải thêm hàm thế này:
Mã:
Function isValidSheetName(ByVal SheetName As String) As Boolean
  If (Len(SheetName) > 31) Or (Len(SheetName) = 0) Then Exit Function
  With CreateObject("VBScript.RegExp")
    .Pattern = "[\\:\][/?*]"
    isValidSheetName = Not .Test(SheetName)
  End With
End Function
Lồng vào code trên là hoàn chỉnh
Còn cái vụ History cứ để Err.Description nó "mô tả" lỗi cho rõ ràng
Toàn bộ code để xuất:
1> Trong Module:
Mã:
Function SheetExists(ByVal SheetName As String) As Boolean
  On Error Resume Next
  SheetExists = Not ThisWorkbook.Sheets(SheetName) Is Nothing
End Function
Function isValidSheetName(ByVal SheetName As String) As Boolean
  If (Len(SheetName) > 31) Or (Len(SheetName) = 0) Then Exit Function
  With CreateObject("VBScript.RegExp")
    .Pattern = "[\\:\][/?*]"
    isValidSheetName = Not .Test(SheetName)
  End With
End Function
2> Trong Sheet1
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  On Error GoTo ErrHandler
  If Target.Address = "$C$7" Then
    If isValidSheetName(Target.Value) Then
      If Not SheetExists(Target.Value) Then Sheet2.Name = Target.Value
    End If
  End If
  Exit Sub
ErrHandler:   MsgBox Err.Description
End Sub
------------------
Hoặc đơn giản chỉ cần thế này:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  On Error GoTo ErrHandler
  If Target.Address = "$C$7" Then Sheet2.Name = Target.Value
  Exit Sub
ErrHandler:   MsgBox Err.Description
End Sub
Khỏi code trong module, tức giao phần thông báo lỗi cho bác Bill "phát biểu"
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề đổi tên sheet đã được giải quyết. Song tôi muốn có thể ẩn sheet có điều kiện.
Chẳng hạn như ô C7 không có giá trị hoặc bằng 0 thì sheet có tên tương ứng với ô C7 (sheet2) sẽ bị ẩn, C7 khác 0 thì sheet hiện lên với tên tương ứng.
Xin mọi người chỉ giáo thêm.
Chân thành cảm ơn.
 
Upvote 0
Vấn đề đổi tên sheet đã được giải quyết. Song tôi muốn có thể ẩn sheet có điều kiện.
Chẳng hạn như ô C7 không có giá trị hoặc bằng 0 thì sheet có tên tương ứng với ô C7 (sheet2) sẽ bị ẩn, C7 khác 0 thì sheet hiện lên với tên tương ứng.
Xin mọi người chỉ giáo thêm.
Chân thành cảm ơn.

Gì vậy
Nếu C7 không có giá trị hoặc =0 thì làm gì có sheet nào có tên giống với C7 mà ẩn?
 
Upvote 0
Gì vậy
Nếu C7 không có giá trị hoặc =0 thì làm gì có sheet nào có tên giống với C7 mà ẩn?
Ý bạn ấy là đặt cho ô C7 bằng 1 công thức nào đó, nên khi giá trị đầu ra(C7=0) thì sheet này có tên là "0" thì ẩn đi. Nếu khác "0" thì lại hiện ra. không biết có phải ý bạn ấy phải vậy không nữa ?
 
Lần chỉnh sửa cuối:
Upvote 0
Ý tôi giống như trên vậy. Nếu C7=0 thì sheet2 có một cái tên nào đó và được ẩn đi. Bở vì tôi muốn thử thiết kế một bảng tính điểm gồm nhiều sheet, mỗi sheet là một lớp, có một sheet để thiết lập và đặt tên cho các lớp.
 
Upvote 0
Cảm ơn sư phụ, em cũng phân vân nhưng không biết liệu có khi nào tác giả đặt tên sheet là history không sư phụ nhỉ? Cứ để người dùng trải nghiệm và phản hồi vậy. hehe
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect([C7], Target) Is Nothing Then
    If Checkname([C7].Value) Or UCase([C7].Value) = "HISTORY" Then
        MsgBox "Ten sheet da ton tai Hoac Ten sheet khong hop le"
        Exit Sub
    Else
            Sheet2.Name = [C7].Value
    End If
End If
End Sub
'===============================
Public Function Checkname(sheetName As String) As Boolean
    On Error Resume Next
    Checkname = CBool(Len(Worksheets(sheetName).Name) > 0)
End Function

bạn ơi, bây giờ muốn làm code cho như vầy đặt tên cho khoảng 40 sheet ví dụ chạy từ c7:ba7 chẳng hạn thì code phải sửa lại thế nào giúp mình với
 
Lần chỉnh sửa cuối:
Upvote 0
bạn ơi, bây giờ muốn làm code cho như vầy đặt tên cho khoảng 40 sheet ví dụ chạy từ c7:ba7 chẳng hạn thì code phải sửa lại thế nào giúp mình với.
Mong bạn giúp đỡ!
 
Upvote 0
bạn ơi, bây giờ muốn làm code cho như vầy đặt tên cho khoảng 40 sheet ví dụ chạy từ c7:ba7 chẳng hạn thì code phải sửa lại thế nào giúp mình với.
Mong bạn giúp đỡ!

Dùng cái này:
Mã:
Function SheetExists(ByVal SheetName As String) As Boolean
  On Error Resume Next
  SheetExists = Not Sheets(SheetName) Is Nothing
End Function
Function isValidSheetName(ByVal SheetName As String) As Boolean
  If (Len(SheetName) > 31) Or (Len(SheetName) = 0) Then Exit Function
  With CreateObject("VBScript.RegExp")
    .Pattern = "[\\:\][/?*]"
    isValidSheetName = Not .Test(SheetName)
  End With
End Function
Sub CreateSheet(ByVal arrSheets As Variant)
  Dim tmpArr, Item
  On Error GoTo ErrHandler
  tmpArr = arrSheets
  If Not IsArray(tmpArr) Then tmpArr = Array(tmpArr)
  For Each Item In tmpArr
    If isValidSheetName(CStr(Item)) Then
      If Not (SheetExists(CStr(Item))) Then
        Sheets.Add(After:=Sheets(Sheets.Count)).Name = CStr(Item)
      End If
    End If
  Next
  Exit Sub
ErrHandler: MsgBox Err.Description
End Sub
Sub Main()
  CreateSheet Sheet1.Range("[COLOR=#ff0000]C7:BA7[/COLOR]")
End Sub
 
Upvote 0
Các sư phụ cho hỏi nếu muốn đổi tên sheet theo ô A1 của các sheet thì phải làm sao
 

File đính kèm

Upvote 0
Các sư phụ cho hỏi nếu muốn đổi tên sheet theo ô A1 của các sheet thì phải làm sao

Cho đoạn code này vào Thisworkbook nhé:
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  On Error GoTo ErrHandler
  If Target.Address = "$A$1" Then Sh.Name = Target.Value
  Exit Sub
ErrHandler:   MsgBox Err.Description
End Sub
 
Upvote 0

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

Back
Top Bottom