Add thêm sheet trong excel bằng vb

Để khắc phục những điều phiền toái bạn đang gặp, xin hướng dẫn các bạn một cách rất đơn giản mà rất hiệu quả, tự động cập nhật khi Sheet mới được tạo hoặc xóa sheet, chúng ta sẽ tạo ra một Form VBA đơn giản như sau nhé
Đầu tiên giả sử bạn có một Workbook khoảng 30 sheet hoặc nhiều hơn hoặc ít hơn, không quan tâm nhé

1 Mở cửa sổ soạn thảo Code (VBE)

Mở cửa sổ VBE bằng cách ALT+F11 hoặc Deverloper->VisulBasic hoặc ViewCode, bạn có thể tham khảo In Phiếu Lương Hàng Loạt hoặc VBA Căn Bản Bài 01

2 Tạo UserForm mới có tên quản lý sheet

Tại cửa sổ VBA Project, nhấp chuột phải và chọn Insert UserForm, sau đó các bạn làm tiếp theo như sau:
       

Sau khi vẽ xong, tiến hành đặt tên tại mục "Name" và mục "Caption" nếu có trên cửa sổ Properties như sau.
tại mục Name chính là tên của Sub, còn Caption chính là tên hiển thị của Form


Lable: Name=MENU SHEET
Textbox: Name=txtTenHH 
Listbox: Name=lstSheets
Button: Name=SHOW ALL SHEET, Caption=cmdShowSheet
UserForm: Name=FrmShowSheet, Caption=SHEET IN WORKBOOK


3 Viết code cho TextBox, ListBox, CommandButton

Private Sub txtTenHH_Change()
    If txtTenHH <> "" Then
        cmdShowSheet_Click
        For k = ListBox1.ListCount - 1 To 0 Step -1
            If Not UCase(ListBox1.List(k)) Like "*" & UCase(txtTenHH) & "*" Then
                ListBox1.RemoveItem (k)
            End If
        Next
    ElseIf txtTenHH = "" Then
        cmdShowSheet_Click
    End If
End Sub

'---Code cho ListBox(lstSheets)
Private Sub lstSheets_Click()
    Sheets(frmShowSheet.lstSheets.Value).Select
    frmShowSheet.txtTenHH.SetFocus
End Sub

'---Code cho CommandButton(cmdShowSheet)
Private Sub cmdShowSheet_Click()
    Dim Sh As Worksheet
    For Each Sh In Sheets
        frmShowSheet.lstSheets.AddItem Sh.Name
    Next
    Dim i As Long, j As Long
    With lstSheets
        For i = 0 To .ListCount - 1
            For j = .ListCount - 1 To (i + 1) Step -1
                If .List(j) = .List(i) Then
                    .RemoveItem j
                    frmShowSheet.txtTenHH.SetFocus
                End If
            Next j
        Next i
    End With
End Sub

4 Tạo một Moule mới và tạo một Sub mới có tên MenuSheet

Sub MenuSheet()
    Call frmShowSheet.Show(0)
End Sub

Tạo nút bấm để hiển thị Form

Ra sheet bất kỳ, vẽ một nút Shapes, nhấp chuột phải vào Shapes, chọn AsignMacro, chọn Macro có tên MenuSheet, sau đó nhấn OK

6 Sử dụng

Nhấp chuột vào nút SHOW ALL SHEET để hiển thị tất cả các sheet, bây giờ bạn thử tạo một sheet mới hoặc xóa sheet nào đó, và bấm lại nút SHOW ALL SHEET để xem nó cập nhật không, bạn chọn sheet bất kỳ trong ô ListBox, hoặc gõ từ khóa bất kỳ lên ô TextBox để cảm nhận

    
 

Các bạn quan tâm môn Lập Trình VBA có thể tham khảo thêm tại bài này  "Lập Trình VBA Từ Căn Bản Đến Nâng Cao", bài tiếp theo tôi sẽ hướng dẫn các bạn tùy biến MenuRibbon

  • #2

Bạn thử 2 dòng này xem

PHP:

Sheets.Add ActiveSheet.Name = "Thang" & Month(Now()) & "-" & Year(Now())

TDN

  • #3

chào mọi người.
tôi muốn tạo 01 sheet mới bằng macro đưa vào 01 command để tạo ra sheet theo tháng _vd tạo sheet mới, đặt tên là thang3/2010.rồi qua tháng 4 lại tạo sheet và đặt là thang4/2010
tôi có thử qua thu macro để chỉnh sửa, nhưng trình độ còn yếu làm không được.
Mong mọi người không chê và giúp đỡ.Cảm ơn nhiều.

Tên sheet không thể có dấu / được đâu nha ---> Có thể thay dấu / thành dấu -
Tôi để xuất 1 code gần giống với code của thầy Phước

PHP:

With Sheets.Add .Name = Format(Now(), """Thang ""mm-yyyy") End With

  • #4

Em dùng code sau để kiểm tra sheet có tồn tại hay chưa, nếu chưa thì thêm, ngược lại thì xóa bỏ.

Mã:

Sub AddSheet() On Error GoTo loi With Sheets.Add .Name = Format(Now(), """Thang ""mm-yyyy") End With loi: If Err.Number = 1004 Then MsgBox "Sheet " & Format(Now(), """Thang ""mm-yyyy") & " da ton tai" Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Exit Sub End If End Sub

  • #5

Em dùng code sau để kiểm tra sheet có tồn tại hay chưa, nếu chưa thì thêm, ngược lại thì xóa bỏ.

Mã:

Sub AddSheet() On Error GoTo loi With Sheets.Add .Name = Format(Now(), """Thang ""mm-yyyy") End With loi: If Err.Number = 1004 Then MsgBox "Sheet " & Format(Now(), """Thang ""mm-yyyy") & " da ton tai" Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Exit Sub End If End Sub

Như vậy là Doom Add sheet trước, xong mới kiểm tra sự tồn tại của sheet này ---> hơi tốn công!
Sao không kiểm tra trước, nếu tồn tại rồi thì ta... làm thinh luôn
Hàm kiểm tra sheet có tồn tại hay không

PHP:

Function SheetExist(WorkSheetName As String) As Boolean On Error Resume Next SheetExist = Not Sheets(WorkSheetName) Is Nothing End Function

Cuối cùng là code thêm sheet:

PHP:

Sub AddSheet() Dim ShN As String ShN = Format(Now(), """Thang ""mm-yyyy") If Not SheetExist(ShN) Then Sheets.Add.Name = ShN End Sub

Tôi nghĩ là gọn hơn!

Lần chỉnh sửa cuối: 16/3/10

  • #6

Em nghĩ việc bẫy lỗi là cần thiết nhưng thường thì đưa ra giải pháp để giải quyết vấn đề. Còn vấn đề bẫy lỗi thì tuỳ theo trường hợp và nhu cầu của tác giả; từ đó sẽ bổ sung thêm. Nhiều khi "ôm đồm" quá sẽ làm rối thêm, hi hi. Vì giải quyết cặn kẽ 1 vấn đề (dù nhỏ) đôi khi bàn hoài vẫn không hết

  • #7

Cho em đào mộ tí,
Em có 1 danh sách nhân viên, một cột là mã số nhân viên, NV001 đến NV099, các cột bên cạnh là họ tên và một vài thông tin khác
Các bác có thể viết hộ em đoạn Macro sao cho em click vào mã số nhân viên nào thì Excel sẽ mở ra 1 sheet có tên đó được không?, ví dụ click vào mã số nhân viên NV001 thì excel sẽ mở ra sheet NV001
Và khi em thêm một nhân viên với vào, ví dụ NV100, thì Excel sẽ tự động tạo thêm một sheet mới có tên là NV100 và mở luôn sheet đó ra để làm việc
Nếu chức năng tạo thêm sheet mới mà thêm theo kiểu copy từ một Sheet template thì tốt quá ạ
Em cảm ơn

  • #8

Cho em đào mộ tí,
Em có 1 danh sách nhân viên, một cột là mã số nhân viên, NV001 đến NV099, các cột bên cạnh là họ tên và một vài thông tin khác
Các bác có thể viết hộ em đoạn Macro sao cho em click vào mã số nhân viên nào thì Excel sẽ mở ra 1 sheet có tên đó được không?, ví dụ click vào mã số nhân viên NV001 thì excel sẽ mở ra sheet NV001
Và khi em thêm một nhân viên với vào, ví dụ NV100, thì Excel sẽ tự động tạo thêm một sheet mới có tên là NV100 và mở luôn sheet đó ra để làm việc
Nếu chức năng tạo thêm sheet mới mà thêm theo kiểu copy từ một Sheet template thì tốt quá ạ
Em cảm ơn

Mọi thứ đều có thể nếu bạn gởi file cụ thể

  • #9

Cho em đào mộ tí,
Em có 1 danh sách nhân viên, một cột là mã số nhân viên, NV001 đến NV099, các cột bên cạnh là họ tên và một vài thông tin khác
Các bác có thể viết hộ em đoạn Macro sao cho em click vào mã số nhân viên nào thì Excel sẽ mở ra 1 sheet có tên đó được không?, ví dụ click vào mã số nhân viên NV001 thì excel sẽ mở ra sheet NV001
Và khi em thêm một nhân viên với vào, ví dụ NV100, thì Excel sẽ tự động tạo thêm một sheet mới có tên là NV100 và mở luôn sheet đó ra để làm việc
Nếu chức năng tạo thêm sheet mới mà thêm theo kiểu copy từ một Sheet template thì tốt quá ạ
Em cảm ơn

Bạn không nên chen ngang bài của người khác, nên tìm chủ đề về Hyperlink (trên diễn đàn đã có nhiều bài viết rồi), hoặc tham khảo File trong bài viết của Link sau:

//www.giaiphapexcel.com/dienda...g-1-file-excel-không-bị-mất-đường-dẫn.111134/

Nếu File trong Link trên chưa đáp ứng yêu cầu thì bạn nên mở Topic mới, với tiêu đề là tạo Hyper Link đết các sheet rồi nêu cụ thể nội dung bạn muốn làm cái gì?

  • #10

Bạn không nên chen ngang bài của người khác, nên tìm chủ đề về Hyperlink (trên diễn đàn đã có nhiều bài viết rồi), hoặc tham khảo File trong bài viết của Link sau:

//www.giaiphapexcel.com/diendan/threads/cách-giữ-hyperlink-các-sheet-trong-cùng-1-file-excel-không-bị-mất-đường-dẫn.111134/

Nếu File trong Link trên chưa đáp ứng yêu cầu thì bạn nên mở Topic mới, với tiêu đề là tạo Hyper Link đết các sheet rồi nêu cụ thể nội dung bạn muốn làm cái gì?

8 năm rồi, họ không còn trao đổi nữa thì có gọi là chen ngang không?
Với cả ý em không phải là chỉ hyperlink đơn thuần, ý em là macro vừa tạo hyperlink sang sheet hiện có, nếu chưa có thì tạo mới sheet, cũng liên quan đến chủ đề này đấy chứ

  • #11

8 năm rồi, họ không còn trao đổi nữa thì có gọi là chen ngang không?
Với cả ý em không phải là chỉ hyperlink đơn thuần, ý em là macro vừa tạo hyperlink sang sheet hiện có, nếu chưa có thì tạo mới sheet, cũng liên quan đến chủ đề này đấy chứ

Có liên quan đến tạo sheet mới là được rồi
Xem file

  • CreateSheets.xlsb

    17.2 KB · Đọc: 67

  • #12

Có liên quan đến tạo sheet mới là được rồi
Xem file

Cảm ơn bác!
Bác cho em hỏi 1 chút:
1. Tại sao các ô 'Bước x" thì lại tạo được sheet mới, còn ô "a[n" thì lại không ạ?
2. Có thể tạo sheet mới bằng cách copy 1 sheet template có sẵn rồi đổi tên không bác?

  • #13

Cảm ơn bác!
Bác cho em hỏi 1 chút:
1. Tại sao các ô 'Bước x" thì lại tạo được sheet mới, còn ô "a[n" thì lại không ạ?
2. Có thể tạo sheet mới bằng cách copy 1 sheet template có sẵn rồi đổi tên không bác?

Trả lời câu 1: Bạn thử đổi tên sheet nào đó thành a[n xem Excel có cự nự gì không? ---> Suy ra điều cần biết
Trả lời câu 2: Có thể, với điều kiện bạn cho file lên đây rồi tính (file không cần có dữ liệu thật nhưng cấu trúc dữ liệu phải giống như thật)

  • #14

Trả lời câu 1: Bạn thử đổi tên sheet nào đó thành a[n xem Excel có cự nự gì không? ---> Suy ra điều cần biết
Trả lời câu 2: Có thể, với điều kiện bạn cho file lên đây rồi tính (file không cần có dữ liệu thật nhưng cấu trúc dữ liệu phải giống như thật)

Ah, là có kí tự đặc biệt đúng không bác?
Sáng mai em mới lên cty mới có thể gửi file đc ạ.
Nhưng bác cho em hỏi cấu trúc dữ liệu là như thế nào ạ? Chỉ là form mẫu sẵn để đỡ phải copy sau này thôi mà bác!
Cảm ơn bác nhiều ạ!

  • #15

Trả lời câu 1: Bạn thử đổi tên sheet nào đó thành a[n xem Excel có cự nự gì không? ---> Suy ra điều cần biết
Trả lời câu 2: Có thể, với điều kiện bạn cho file lên đây rồi tính (file không cần có dữ liệu thật nhưng cấu trúc dữ liệu phải giống như thật)

File đây ạ,
bác có thể sửa cho em khi tạo mới sheet thì nó copy từ Sheet NV000 rồi rename thành tên mà mình vừa click ô vào đấy ạ!
Cảm ơn bác!

  • Nhanvien.xlsb

    22.7 KB · Đọc: 30

  • #16

File đây ạ,
bác có thể sửa cho em khi tạo mới sheet thì nó copy từ Sheet NV000 rồi rename thành tên mà mình vừa click ô vào đấy ạ!
Cảm ơn bác!

Góp ý cho bạn:
1/ Nói về quản lý nhân sự thì không ai theo dõi mỗi người 1 sheet như kiểu bạn làm.
2/ Theo dõi tất tần tật các thứ trong sheet Main là đủ.
3/ Dùng 1 sheet tạm gọi là nhân viên, có thể dùng hàm để truy vấn dữ liệu từng nhân viên bên sheet Main, ngon hơn nữa thì truy vấn dữ liệu của nhân viên nào thì nó hiện cái hình vào cho hoành tráng.
4/ Ngon hơn nữa thì Scan bằng cấp, lý lịch lưu vào 1 Folder nào đó khi cần thì nó lấy danh sách vào và tạo Link, để muốn xem cái gì của người đó thì click vào Link để xem.

  • #17

Góp ý cho bạn:
1/ Nói về quản lý nhân sự thì không ai theo dõi mỗi người 1 sheet như kiểu bạn làm.
2/ Theo dõi tất tần tật các thứ trong sheet Main là đủ.
3/ Dùng 1 sheet tạm gọi là nhân viên, có thể dùng hàm để truy vấn dữ liệu từng nhân viên bên sheet Main, ngon hơn nữa thì truy vấn dữ liệu của nhân viên nào thì nó hiện cái hình vào cho hoành tráng.
4/ Ngon hơn nữa thì Scan bằng cấp, lý lịch lưu vào 1 Folder nào đó khi cần thì nó lấy danh sách vào và tạo Link, để muốn xem cái gì của người đó thì click vào Link để xem.

Vâng, cảm ơn bác!
Cái này em không phải là để quản lý nhân sự, mà làm một vài việc liên quan đến nhân sự thôi ạ!
Chứ còn hồ sơ thì vẫn phải lưu file cứng và scan file mềm chứ ạ

  • #18

Vâng, cảm ơn bác!
Cái này em không phải là để quản lý nhân sự, mà làm một vài việc liên quan đến nhân sự thôi ạ!
Chứ còn hồ sơ thì vẫn phải lưu file cứng và scan file mềm chứ ạ

Nếu vậy thì chỉ cần 2 sheet là đủ:

1/ Theo dõi tất tần tật các thứ trong sheet Main.
2/ Sử dụng 1 sheet tạm gọi là nhân viên để truy vấn.

  • #19

Em dùng code sau để kiểm tra sheet có tồn tại hay chưa, nếu chưa thì thêm, ngược lại thì xóa bỏ.

Mã:

Sub AddSheet() On Error GoTo loi With Sheets.Add .Name = Format(Now(), """Thang ""mm-yyyy") End With loi: If Err.Number = 1004 Then MsgBox "Sheet " & Format(Now(), """Thang ""mm-yyyy") & " da ton tai" Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Exit Sub End If End Sub

cho em hỏi đặt tên 5 sheet liên tục theo ngày thì viết sao anh?
em cảm ơn!

  • #20

cho em hỏi đặt tên 5 sheet liên tục theo ngày thì viết sao anh?
em cảm ơn!

tên sheets không đặt được giống nhau nhé bạn.nếu bạn muốn đặt 5 sheets thì có thể dùng vòng lặp for nhé

Chủ đề