AC cho em hỏi có cách nào khoá tên Sheet không cho thay đổi tên? Giả sử em có Sheet tên DATA và em muốn không cho ai sửa tên nó. AC chỉ dùm em cách nào khoá hữu hiệu nhất!?
Option Explicit
Sub TenSheet()
Sheet1.Name = "MENU"
Sheet2.Name = "CSDL"
Sheet3.Name = "MAIN"
Sheet4.Name = "DN"
Sheet5.Name = "TK"
Sheet6.Name = "SCAI"
Sheet7.Name = "NKC"
Sheet8.Name = "FOOTER"
Sheet9.Name = "SCT"
Sheet10.Name = "KH"
Sheet11.Name = "CDPS"
Sheet12.Name = "KQKD"
Sheet14.Name = "CDKT"
End Sub
Sub Taoso_cdps()
TenSheet
On Error Resume Next
Dim S1 As Worksheet
Dim S2 As Worksheet
Dim rng As Range
Dim eRw1 As Long, eRw2 As Long
Set S1 = Sheets("TK")
Set S2 = Sheets("CDPS")
Application.ScreenUpdating = False
S2.Range("A9:H65535").Clear
eRw1 = S1.Cells(Cells.Rows.Count, "A").End(xlUp).Row
S1.Range("A6:D" & eRw1).Copy Destination:=S2.Range("A9")
eRw2 = S2.Cells(Cells.Rows.Count, "A").End(xlUp).Row
Range("E9").Formula = "=SUMIF(CSDL!$F$2:$F$65535,CDPS!A9&""*"",CSDL!$H$2:$H$65535)"
Range("F9").Formula = "=SUMIF(CSDL!$G$2:$G$65535,CDPS!A9&""*"",CSDL!$I$2:$I$65535)"
Range("G9").Formula = "=MAX(C9+E9-D9-F9,0)"
Range("H9").Formula = "=MAX(D9+F9-C9-E9,0)"
'Range("I9").Formula = "=IF(SUM(C9:H9)<>0,1,0)"
Set rng = S2.Range("E9:H" & eRw2)
Range("E9:H9").Copy rng
rng.Value = rng.Value
rng.NumberFormat = "_(* #,##0_);_(* (#,##0);"""""
With S2.Range("A9").Resize(eRw2 - 8, 8)
.BorderAround LineStyle:=1
.Borders(11).LineStyle = 1: .Borders(11).ColorIndex = 1
.Borders(12).LineStyle = 1: .Borders(12).ColorIndex = 1
End With
Sheets("Footer").Range("A21:H25").Copy S2.Range("A9").Offset(eRw2 - 8)
With S2.Cells(eRw2 + 1, "C").Resize(, 6)
.FormulaR1C1 = "=SUBTOTAL(9,R9C:R[-1]C)"
.Font.Name = "Arial"
.Font.Size = 11
End With
S2.Cells(eRw2 + 1, "C").Resize(, 6).Value = S2.Cells(eRw2 + 1, "C").Resize(, 6).Value
Set rng = Nothing
Set S2 = Nothing
Set S1 = Nothing
End Sub
Trước khi chạy chú cho cái này
Sheet1.Name = "MENU"
Sheet2.Name = "CSDL"
Sheet3.Name = "MAIN"
Sheet4.Name = "DN"
Sheet5.Name = "TK"
Sheet6.Name = "SCAI"
Sheet7.Name = "NKC"
Sheet8.Name = "FOOTER"
Sheet9.Name = "SCT"
Sheet10.Name = "KH"
Sheet11.Name = "CDPS"
Sheet12.Name = "KQKD"
Sheet14.Name = "CDKT"
lên đầu thủ tục (theo file chú đã gửi anh)
đảm bảo không cần bẫy lỗi cái này nữa.
Mã:Option Explicit Sub TenSheet() Sheet1.Name = "MENU" Sheet2.Name = "CSDL" Sheet3.Name = "MAIN" Sheet4.Name = "DN" Sheet5.Name = "TK" Sheet6.Name = "SCAI" Sheet7.Name = "NKC" Sheet8.Name = "FOOTER" Sheet9.Name = "SCT" Sheet10.Name = "KH" Sheet11.Name = "CDPS" Sheet12.Name = "KQKD" Sheet14.Name = "CDKT" End Sub Sub Taoso_cdps() TenSheet On Error Resume Next Dim S1 As Worksheet Dim S2 As Worksheet Dim rng As Range Dim eRw1 As Long, eRw2 As Long Set S1 = Sheets("TK") Set S2 = Sheets("CDPS") Application.ScreenUpdating = False S2.Range("A9:H65535").Clear eRw1 = S1.Cells(Cells.Rows.Count, "A").End(xlUp).Row S1.Range("A6:D" & eRw1).Copy Destination:=S2.Range("A9") eRw2 = S2.Cells(Cells.Rows.Count, "A").End(xlUp).Row Range("E9").Formula = "=SUMIF(CSDL!$F$2:$F$65535,CDPS!A9&""*"",CSDL!$H$2:$H$65535)" Range("F9").Formula = "=SUMIF(CSDL!$G$2:$G$65535,CDPS!A9&""*"",CSDL!$I$2:$I$65535)" Range("G9").Formula = "=MAX(C9+E9-D9-F9,0)" Range("H9").Formula = "=MAX(D9+F9-C9-E9,0)" 'Range("I9").Formula = "=IF(SUM(C9:H9)<>0,1,0)" Set rng = S2.Range("E9:H" & eRw2) Range("E9:H9").Copy rng rng.Value = rng.Value rng.NumberFormat = "_(* #,##0_);_(* (#,##0);""""" With S2.Range("A9").Resize(eRw2 - 8, 8) .BorderAround LineStyle:=1 .Borders(11).LineStyle = 1: .Borders(11).ColorIndex = 1 .Borders(12).LineStyle = 1: .Borders(12).ColorIndex = 1 End With Sheets("Footer").Range("A21:H25").Copy S2.Range("A9").Offset(eRw2 - 8) With S2.Cells(eRw2 + 1, "C").Resize(, 6) .FormulaR1C1 = "=SUBTOTAL(9,R9C:R[-1]C)" .Font.Name = "Arial" .Font.Size = 11 End With S2.Cells(eRw2 + 1, "C").Resize(, 6).Value = S2.Cells(eRw2 + 1, "C").Resize(, 6).Value Set rng = Nothing Set S2 = Nothing Set S1 = Nothing End Sub
Code trong file của chú đấy
Bạn chọn Tools\Protect\Protect Workbook => Nhập 2 lần Password => OK.AC cho em hỏi có cách nào khoá tên Sheet không cho thay đổi tên? Giả sử em có Sheet tên DATA và em muốn không cho ai sửa tên nó. AC chỉ dùm em cách nào khoá hữu hiệu nhất!?
Private Sub Worksheet_Deactivate()
Me.Name = "DATA"
End Sub
Bạn chọn Tools\Protect\Protect Workbook => Nhập 2 lần Password => OK.
Còn nếu muốn dùng code thì bạn nháy chuột phải tại tên sheet DATA, chọn View code và dán code sau vào:
PHP:Private Sub Worksheet_Deactivate() Me.Name = "DATA" End Sub
Private Sub Worksheet_Activate()
Me.Name = "DATA"
End Sub
Bạn đơn thuần dùng Sự kiện này là không ổn rồi. Tôi giả định như sau: Tôi đang ở Sheet "DATA" tôi sửa thành "DATAY" tôi sang Sheet "SoCai" tôi chạy thì lỗi là cái chắc.Cách thứ nhất của anh thì được. Nhưng còn Code thì em test vẫn chưa được. Em sửa code đó thành:
thì khi Sheet đó được kích hoạt nó lại trả lại tên cũ. Cho em hỏi còn cách viết code nào khác để khoá nữa không ah?PHP:Private Sub Worksheet_Activate() Me.Name = "DATA" End Sub
AC cho em hỏi có cách nào khoá tên Sheet không cho thay đổi tên? Giả sử em có Sheet tên DATA và em muốn không cho ai sửa tên nó. AC chỉ dùm em cách nào khoá hữu hiệu nhất!?
Ngồi buồn.. thất nghiệp... làm thử sự kiện này xem chơi nha!Cái này hơi khó vì khi em đổi tên không xảu ra sự kiện nào để mình kiểm soát được. Cách đơn giản là gắn tên đó vào 1 ô nào đó và sử dụng lập trình sự kiện để luôn cập nhật tên.
Ngồi buồn.. thất nghiệp... làm thử sự kiện này xem chơi nha!
Đâu mọi người thử mở file đính kèm và đổi tên sheet xem có được không nha! ---> Đương nhiên khi mở file phải Enable Macros mới tác dụng
Ẹc... Ec.... Cũng thú vị đây
Tôi đang mở file trên Excel 2007 đây, có lỗi gì đâu!Sao em cứ mở file của bác là Excel báo lỗi và tưh thoát. E dùng OFfice2007. Bác gửi cho E xem cái code với.
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private ShArr As Object
Sub TimerProc()
Dim Sh As Worksheet
On Error Resume Next
For Each Sh In ThisWorkbook.Worksheets
If Sh.Name <> ShArr.Item(Sh.CodeName) Then Sh.Name = ShArr.Item(Sh.CodeName)
Next
End Sub
Sub Auto_Open()
Dim Sh As Worksheet
KillTimer Application.hwnd, 1
Set ShArr = CreateObject("Scripting.Dictionary")
For Each Sh In ThisWorkbook.Worksheets
ShArr.Add Sh.CodeName, Sh.Name
Next
SetTimer Application.hwnd, 1, 200, AddressOf TimerProc
End Sub
Sub Auto_Close()
KillTimer Application.hwnd, 1
End Sub
Ngồi buồn.. .. làm thử sự kiện này xem chơi nha!
Đâu mọi người thử mở file đính kèm và đổi tên sheet xem có được không nha! Ẹc... Ec.... Cũng thú vị đây
Có nhiều cách để cải tiến. chẳng hạn:Cũng nhàn cư vi bất thiện: Không đi đường thẳng, ta đi đường ngoằng nghềo vậy: Thực hiện nhân bản vô tính ; sau đó xóa các anh cũ đi & đổi tên các trang đã được nhân bản này; Khà, khà,. . . .
Tôi đang mở file trên Excel 2007 đây, có lỗi gì đâu!
Code thì chỉ có vầy:
PHP:Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long Private ShArr As Object
PHP:Sub TimerProc() Dim Sh As Worksheet On Error Resume Next For Each Sh In ThisWorkbook.Worksheets If Sh.Name <> ShArr.Item(Sh.CodeName) Then Sh.Name = ShArr.Item(Sh.CodeName) Next End Sub
PHP:Sub Auto_Open() Dim Sh As Worksheet KillTimer Application.hwnd, 1 Set ShArr = CreateObject("Scripting.Dictionary") For Each Sh In ThisWorkbook.Worksheets ShArr.Add Sh.CodeName, Sh.Name Next SetTimer Application.hwnd, 1, 200, AddressOf TimerProc End Sub
PHP:Sub Auto_Close() KillTimer Application.hwnd, 1 End Sub
Tôi thêm sheet vào bình thường thôi, có gì không được đâuBác ndu ơi khi em thêm Sheet mới vào thì không được
Tôi test mấy chục lần, chẳng thấy lỗi gì, cả trên Excel 2003 và Excel 2007 ---> Tôi nghĩ Office của bạn chắc có vấn đề rồiVới lại E thấy dùng code này có vẻ dễ bị lỗi hay sao ấy?
Trời! Bạn đọc code của tôi xem có chổ nào liên quan đến MENU không? Code cực đơn giản mà bạn ---> Nói chung là hổng có liên quan gì đến tất cả những lỗi mà bạn đã nêu cả! Xem hình ảnh trên máy tôi đây! Chẳng có menu nào bị mờ hay đổi màu gì cảEm chạy code thấy sau khi đổi tên Sheet thì thoát khỏi file, sau đó vào lại thì code mới có tác dụng. Nhưng khi mở VBE ra thì menu bị chuyển màu. như hình kèm theo. trước đó E mở ra không sao. Cái khung Propeties thì bị mờ đi.
Cần lưu ý rằng: Code này tuy không cho đổi tên sheet nhưng vẫn cho thêm sheet nhé ---> Và với sheet mới thì ta đặt tên thoải mái ---> Chỉ sau khi đóng và lưu file xong, mở lại thì những sheet mới đã thêm lần trước lại bị code khống chế, không cho đổi tên nữaEm làm theo anh ndu chạy bình thường ở cả 2 office 2003 và 2007.
mình thấy đổi bình thương tên sheet được nè bạnNgồi buồn.. thất nghiệp... làm thử sự kiện này xem chơi nha!
Đâu mọi người thử mở file đính kèm và đổi tên sheet xem có được không nha! ---> Đương nhiên khi mở file phải Enable Macros mới tác dụng
Ẹc... Ec.... Cũng thú vị đây
anh ơi a có bản cho 64bit không ạ? máy e dùng 64bit nên không bị lỗi ạ. cảm ơn anhNgồi buồn.. thất nghiệp... làm thử sự kiện này xem chơi nha!
Đâu mọi người thử mở file đính kèm và đổi tên sheet xem có được không nha! ---> Đương nhiên khi mở file phải Enable Macros mới tác dụng
Ẹc... Ec.... Cũng thú vị đây