Cần giúp đỡ- Đổi tên sheet hàng loạt theo giá trị bất kì.

Liên hệ QC

victorphung11111

Thành viên mới
Tham gia
9/7/18
Bài viết
5
Được thích
0
Dear Anh chị,
- Công việc của em là tổng hợp file excel từ 200 nhân viên khác nhau. ( mỗi file tầm 200 sheet). Tuy nhiên mỗi người lại có 1 cách đặt tên sheet riêng ,dù nhắc nhở nhưng 200 người không thể đồng nhất.
- Ví dụ: em cần tên sheet là AB001, AB002... ( tên này ko theo thứ tự. giả sử nhân viên có mã AB003 đã nghỉ việc thì AB002 sẽ tới AB004)
nhưng nhân viên lại đặt tên sheet như sau: anh A: 001 , anh B: 2, anh C: 05, anh D: AB6......
Như bình thường em sẽ đổi tên thủ công mỗi sheet ( 200 lần) => mất thời gian, dễ sai sót, mệt mỏi...
- Em đã học được cách tạo mục lục cho các sheet hiện có, và những thứ liên quan, nhưng em không biết làm cách nào để đổi tên sheet hàng loạt theo chuỗi giá trị có sẵn cả ( anh chị vui lòng xem file đính kèm)

Nhờ anh chị giúp em viết code ( em xài excel 2016) đổi tên các sheet theo chuỗi giá trị đã liệt kê ở sheet MUCLUC.
( nếu có bài viết nào tương tự anh chị cho em xin link)
 

File đính kèm

dù nhắc nhở nhưng 200 người không thể đồng nhất.
Tốn một trang A4 ghi: "Nhân viên nào không thực hiện đúng (việc đặt tên sheet theo quy định abc nào đó) trừ 01 ngày lương / 01 lần."
Đem kêu ông sếp to nhất ký rồi đóng dấu đỏ. Đem trang giấy đó scan rồi gửi email cho 200 anh/ chị ương ngạnh kia. Thông báo cho toàn công ty biết.
Xong! Mọi thứ ngon lành.
tạo mục lục cho các sheet hiện có, và những thứ liên quan, nhưng em không biết làm cách nào để đổi tên sheet hàng loạt theo chuỗi giá trị có sẵn cả
Vậy cái tên ở cột B gán tương ứng với sheet nào? Ví dụ B2="AB1" thì gán cho thằng sheet nào?
 
Upvote 0
Tốn một trang A4 ghi: "Nhân viên nào không thực hiện đúng (việc đặt tên sheet theo quy định abc nào đó) trừ 01 ngày lương / 01 lần."
Đem kêu ông sếp to nhất ký rồi đóng dấu đỏ. Đem trang giấy đó scan rồi gửi email cho 200 anh/ chị ương ngạnh kia. Thông báo cho toàn công ty biết.
Xong! Mọi thứ ngon lành.

Vậy cái tên ở cột B gán tương ứng với sheet nào? Ví dụ B2="AB1" thì gán cho thằng sheet nào?
@1: em là nhân viên mới anh ơi.
@2: Đổi tên bắt đầu từ sheet thứ 2 tính từ "MUCLUC". tên sheet = giá trị B2 trở xuống ạ.
 
Upvote 0
Vậy đó là cơ hội ghi điểm với sếp to rồi. Có khi lên chức, tăng lương ngay lập tức. Chưa kể, 200 anh/ chị ương ngạnh kia lại "theo" mình luôn.
Làm liều ăn nhiều, chứ e dè thời nay thì...

Đổi tên bắt đầu từ sheet thứ 2 tính từ "MUCLUC". tên sheet = giá trị B2 trở xuống
Vậy thì mông lung quá, ai đó kéo qua kéo lại đổi chỗ các sheets đó cho nhau thì trật khớp rồi.
 
Upvote 0
Vậy đó là cơ hội ghi điểm với sếp to rồi. Có khi lên chức, tăng lương ngay lập tức. Chưa kể, 200 anh/ chị ương ngạnh kia lại "theo" mình luôn.


Vậy thì mông lung quá, ai đó kéo qua kéo lại đổi chỗ các sheets đó cho nhau thì trật khớp rồi.
ah vâng. em có tìm được 1 code tạo mục lục cho các sheet ( dù tên gì đi nữa) để lấy ra danh sách các sheet hiện có, sau đó dùng các hàm tách số và chuỗi dựa trên danh sách ở sheet MUCLUC.
Ví dụ:
- ban đầu em có 200 sheet hỗn tạp, nhưng dùng code tạo mục lục bên dưới thì em sẽ được Sheet "MUCLUC" liệt kê ra tên các sheet hiện có ( gồm cả thứ tự các sheet đó)
- sheet thứ 32: tên là AB35 ( dù đặt thế nào thì Mã nhân viên vẫn đúng). em dùng hàm tách 35 ra và add vào chuỗi "AB0"&35 là ra tên em mong muốn. (AB035)
- File đính kèm là ví dụ của em sau khi chỉnh sửa theo tên em mong muốn
=> giờ em chỉ cần đặt lại tên các sheet hiện có theo danh sách tên mới. rồi dùng code Sort sheet theo thứ tự tăng dần là xong rồi.

( code em xài chùa sau khi google - anh nào thấy thì cho e cảm ơn :D)
Private Sub CreateTableOfContents()
Dim wsSheet As Worksheet
Dim ws As Worksheet
Dim Counter As Long
On Error Resume Next
Set wsSheet = Sheets("Mucluc")
'Kiem tra su ton tai cua Sheet
On Error GoTo 0
If wsSheet Is Nothing Then
'Neu chua co thi them vao vi tri dau tien cua Workbook
Set wsSheet = ActiveWorkbook.Sheets.Add(Before:=Worksheets(1))
wsSheet.Name = "Mucluc"
End If
With wsSheet
.Cells(2, 1) = "DANH SACH CH"
.Cells(2, 1).Name = "Index"
.Cells(4, 1).Value = "TT"
.Cells(4, 2).Value = "STORE"
End With
'Merge Cell
With Range("A2:B2")
.Merge
.HorizontalAlignment = xlCenter
.Font.Bold = True
End With
'Set ColumnWidth
With Columns("A:A")
.ColumnWidth = 8
.HorizontalAlignment = xlCenter
End With
With Range("A4")
.HorizontalAlignment = xlCenter
.Font.Bold = True
End With
Columns("B:B").ColumnWidth = 10
With Range("B4")
.HorizontalAlignment = xlCenter
.Font.Bold = True
End With
Counter = 1
For Each ws In Worksheets
If ws.Name <> wsSheet.Name Then
'Gan gia tri cot thu tu
wsSheet.Cells(Counter + 4, 1).Value = Counter
'Tao lien ket
wsSheet.Hyperlinks.Add Anchor:=wsSheet.Cells(Counter + 4, 2), _
Address:="", _
SubAddress:=ws.Name & "!A1", _
ScreenTip:=ws.Name, _
TextToDisplay:=ws.Name
'Them nut Quay ve Sheet Muc luc tai moi Sheet
With ws
.Hyperlinks.Add Anchor:=.Range("H1"), Address:="", SubAddress:="Index", TextToDisplay:="Quay ve"
End With
Counter = Counter + 1
End If
Next ws
Set xlSheet = Nothing
End Sub
 

File đính kèm

Upvote 0
file này hay, nhưng có 2 hạn chế đó là:
1. ví dụ: nếu có 100 sheet nhưng chỉ có 99 tên sheet, code sẽ bị lỗi
2. ví dụ: nếu có 100 sheet nhưng có đến 101 tên sheet thì code lại không báo gì.
thêm nữa, theo mình nghĩ nên dùng 1 file chứa code & tên sheet để đổi tên cho 1 file gồm các sheet sẽ là khoa học hơn.
Bạn có thể tham khảo file đính kèm & cho mình xin ý kiến nhé.
 

File đính kèm

Upvote 0
nếu có 100 sheet nhưng chỉ có 99 tên sheet, code sẽ bị lỗi
Lỗi chỗ nào nhỉ? :confused:
nếu có 100 sheet nhưng có đến 101 tên sheet thì code lại không báo gì.
Chưa rõ mục đích "báo" lắm? Đang cần đổi tên sheet(s) mà. Mang xiền đi chợ, dư thì tự cầm về, không lẽ kêu cả chợ biết mình mang dư xiền?
:rolleyes::rolleyes:
-----
Nếu nói thiếu bẫy lỗi tên sheet chứa ký tự không cho phép thì thiếu thật! Tuy nhiên, chủ thớt lựa tên đẹp rồi. :)
 
Upvote 0
Lỗi chỗ nào nhỉ? :confused:

Chưa rõ mục đích "báo" lắm? Đang cần đổi tên sheet(s) mà. Mang xiền đi chợ, dư thì tự cầm về, không lẽ kêu cả chợ biết mình mang dư xiền?
:rolleyes::rolleyes:
-----
Nếu nói thiếu bẫy lỗi tên sheet chứa ký tự không cho phép thì thiếu thật! Tuy nhiên, chủ thớt lựa tên đẹp rồi. :)
có trách thì là trách tôi cẩn thận quá thôi :)
 
Upvote 0
Upvote 0
Anh ơi. Anh chỉ giúp em lỗi chỗ nào đi, em tìm mãi mà chưa rõ lỗi như anh nêu:
"nếu có 100 sheet nhưng chỉ có 99 tên sheet, code sẽ bị lỗi ".

Mấy tiếng rồi em chưa đi ngủ nè. Anh chỉ giúp em để em sửa với nhé. -\\/.-\\/.
Vì khi đó a(j, 1) = trống, mà tên sheet thì không thể trống được.
theo tôi nên sửa thế này:
Mã:
If SheetExists(ws.Name) = True Then
            If ws.Name <> sName Then
                j = j + 1
                If a(j, 1) = "" Then Exit For
                ws.Name = a(j, 1)
                If j = m Then Exit For
            End If
        End If
 
Upvote 0
Tốn một trang A4 ghi: "Nhân viên nào không thực hiện đúng (việc đặt tên sheet theo quy định abc nào đó) trừ 01 ngày lương / 01 lần."
Đem kêu ông sếp to nhất ký rồi đóng dấu đỏ. Đem trang giấy đó scan rồi gửi email cho 200 anh/ chị ương ngạnh kia. Thông báo cho toàn công ty biết.
Xong! Mọi thứ ngon lành.
Chưa chắc ngon lành đâu. Theo luật lao động tổng quát thì việc trừ lương là trái luật. Cái này cần ghi rõ trong văn bản chi tiết công việc. Ngừoi quản lý có nhiệm vụ phải chắc ăn là nhân viên hiểu mọi chi tiết. Theo nguyên tắc "the buck stops at the top" thì nhân viên làm sơ xuất là trach nhiệm của quản lý.
Tuy nhiên, chắc tại văn bản chi tiết công việc của công ty này bắt đầu bằng câu "đia nhân viên" hay "đĩa boy en gơ", "đía em pờ loi i", "địa ốp phít sờ", "tu hum đít mai con sơn" gì gì đó cho nên nhân viên đọc chả hiểu.
 
Upvote 0
Đổi tên sheet, bài toán vừa dễ lại vừa khó. Dễ khi mọi chuyện suôn sẻ và khó khi có cả đống vấn đề không lường trước. Ví dụ:
- Tên sheet mà ta chuẩn bị đổi đã tồn tại (định đổi sheets(1) thành AB1 nhưng cái tên AB1 đang có và đang nằm ở vị trí thứ 2)
- Danh sách tên sheet chuẩn bị đổi có vài tên không hợp lệ theo quy định (ai biết được, danh sách do NGƯỜI tự gõ thì luôn có sai sót)
Vậy sẽ tính sao trong 2 trường hợp nói trên?
 
Upvote 0
Sau 1 đêm áp dụng thử code của anh befaint cho file của em với 200 sheet em thấy code vẫn chạy được. ( chỉ cần chỉnh lại vùng dữ liệu từ B2:B201)
- nếu Danh sách có 200 tên nhưng chỉ có 50 sheet thì code vẫn đổi tên 50 sheet đầu tiên/ hoặc danh sách co 50 tên nhưng có 200 sheet thì cũng chỉ 50 sheet có tên được đổi, sheet 51 trở đi ko ảnh hưởng.
- code đổi tên sheet đúng theo danh sách cho sẵn, dù tên đó đã tồn tại ở 1 sheet nào đó (tên này sẽ bị đổi theo thứ tự danh sách luôn)
=> để đổi tên được suôn sẻ thì em phải chuẩn bị danh sách và thứ tự các sheet để đảm bảo code chạy chính xác rồi.
=> có thể với các trường hợp khác code này có lỗi, nhưng với trường hợp của em thì code này quá ok rồi.
do tính chất công việc mới, em phải làm nhiều về excel, em ko hề có căn bản về các code này nên chỉ biết sưu tầm và nhờ anh chị giúp đỡ thôi.

cám ơn anh befaint đã tài trợ code, cám ơn các anh chị khác đã góp ý.
 
Upvote 0
.... Mang xiền đi chợ, dư thì tự cầm về, không lẽ kêu cả chợ biết mình mang dư xiền?
:rolleyes::rolleyes: -----
Nếu nói thiếu bẫy lỗi tên sheet chứa ký tự không cho phép thì thiếu thật! Tuy nhiên, chủ thớt lựa tên đẹp rồi. :)
Đi chợ thì tiền trao cháo múc. Bạn biết chính xác mua món gì, tiền đưa ra bao nhiêu và thối lại bao nhiêu. Công việc này có thể ví như cách làm thủ công.
Ở đây là code làm việc giùm cho bạn. Có thể ví như sai lính đi chợ giùm. Trường hợp này lính phải hạch toán rõ rệt. Và những lúc món hàng không có, hay giá cả khong nằm trong dự định, trăm ngàn thứ bất trắc, và có cả tá quy trình. Tỷ dụ:
- lính gọi điện thoại về hỏi lại
- lính chụp hình món hàng thay thế, MMS lại cho sếp chờ quyết định

Bẫy lỗi là phương pháp lừoi biếng nhất, trong những trường hợp gắt gao có thể coi như vô trách nhiệm (*).

Đổi tên một lúc hàng trăm vật thể (tên sheet, tên file, tên gì gì đó...) phải được làm việc theo nguyên tắc hợp đồng xuất nhập cảng. Bạn phải chọn trước cách giải quyết trường hợp bất trắc:
1. nếu công việc tối quan trọng thì code sẽ đi ngược lại, gỡ hết những gì nó đã làm. Cái này trong nghề gội là transaction rollback. Tôi khong nghĩ là trong diễn đàn này có ngừoi đạt đến tình độ này - nếu có thì cũng chưa thấy ra tay.
2. nếu công việc không quan trọng lắm thì code phải ghi lại một danh sách những gì nó thực hiện và những gì nó không thực hiện được. Một trong những cách làm trong nghề là ghi lại cái log. Điều này hoàn toàn nằm trong khả năng của các bạn ở đây. Nhưng tôi cũng khong hiểu tại sao không thấy ai làm. Có lẽ tại sì tin của các bậc lão thành như vậy rồi lớp trẻ nhắm mắt chạy theo.

(*) tôi nhớ cách đây vài tháng có một bạn nêu vấn đề rằng nhiều code ở diễn đàn này được viết theo đường lối (coding style) rất ***.
Bạn này đưa ra nhiều điểm, trong đó có một điểm về cách dùng On Error...
Tôi đọc bài này nhưng bỏ qua vì ngại rằng sẽ gây ra cãi cọ và rốt cuộc là chả ai học được gì cả.

(**) tôi viết bài này chủ ý cho bạn. Nếu còn có ý muốn code thì nên học THÊM styles của các trường phái khác. Chỉ quanh quẩn ở đây sẽ là in-breeding (lộn máu). Tôi viết hoa từ "thêm" ở trên để nhấn mạnh rằng những gì bạn đã qua không phải là sai, nhưng chúng cần mở rộng thêm ra bằng cái nhìn khác.
 
Lần chỉnh sửa cuối:
Upvote 0
1. nếu công việc tối quan trọng thì code sẽ đi ngược lại, gỡ hết những gì nó đã làm. Cái này trong nghề gội là transaction rollback. Tôi khong nghĩ là trong diễn đàn này có ngừoi đạt đến tình độ này - nếu có thì cũng chưa thấy ra tay.
2. nếu công việc không quan trọng lắm thì code phải ghi lại một danh sách những gì nó thực hiện và những gì nó không thực hiện được. Một trong những cách làm trong nghề là ghi lại cái log. Điều này hoàn toàn nằm trong khả năng của các bạn ở đây. Nhưng tôi cũng khong hiểu tại sao không thấy ai làm. Có lẽ tại sì tin của các bậc lão thành như vậy rồi lớp trẻ nhắm mắt chạy theo.

(*) tôi nhớ cách đây vài tháng có một bạn nêu vấn đề rằng nhiều code ở diễn đàn này được viết theo đường lối (coding style) rất ***.
Bạn này đưa ra nhiều điểm, trong đó có một điểm về cách dùng On Error...
Tôi đọc bài này nhưng bỏ qua vì ngại rằng sẽ gây ra cãi cọ và rốt cuộc là chả ai học được gì cả.

(**) tôi viết bài này chủ ý cho bạn. Nếu còn có ý muốn code thì nên học THÊM styles của các trường phái khác. Chỉ quanh quẩn ở đây sẽ là in-breeding (lộn máu). Tôi viết hoa từ "thêm" ở trên để nhấn mạnh rằng những gì bạn đã qua không phải là sai, nhưng chúng cần mở rộng thêm ra bằng cái nhìn khác.
Em nghĩ trong excel để đề phòng bất trắc thì sao lưu file là tiện nhất, việc này thì chắc mọi người đều làm cả Log thì em không làm chỉ hay ghi chú thích vào 1 file word kèm theo. Còn chữ lộn máu kia hình như là in - bleeding phải không bác?
 
Upvote 0
(**) tôi viết bài này chủ ý cho bạn. Nếu còn có ý muốn code thì nên học THÊM styles của các trường phái khác. Chỉ quanh quẩn ở đây sẽ là in-breeding (lộn máu). Tôi viết hoa từ "thêm" ở trên để nhấn mạnh rằng những gì bạn đã qua không phải là sai, nhưng chúng cần mở rộng thêm ra bằng cái nhìn khác.
Vâng anh.
Em có đang đọc thêm một số thứ khác nhưng là đi tắt, giải quyết tại chỗ thôi ạ.
Vài bữa trước em mới để ý, trên slack (slack.com) không thấy VBA luôn. Không lẽ VBA lại hẹp vậy?
 
Upvote 0
... Còn chữ lộn máu kia hình như là in - bleeding phải không bác?
in-breeding/inbreeding = lộn máu/trùng máu (xin lỗi, đôi khi tôi quên, viết theo kiểu cũ. Kiểu mới bây giờ gần như bỏ hẳn các dấu gạch nối)
Bạn nuôi một bầy gà giống, cứ mỗi lứa thì phải thay trống khác để tránh trùng máu. Theo sinh học thì các gien trùng máu sẽ không bổ khuyết được những chỗ khiếm khuyết cho nhau, tỷ lệ khuyết tật sẽ cao.
Đối với lập trình (lưu ý cụm từ "bổ khuyết những chỗ khiếm khuyết" ở trên), học mãi một chỗ sẽ bị tình trạng tương tự. Tức là khả năng thiếu hẳn một mặt nào đó rất cao.

Vâng anh.
Em có đang đọc thêm một số thứ khác nhưng là đi tắt, giải quyết tại chỗ thôi ạ.
Vài bữa trước em mới để ý, trên slack (slack.com) không thấy VBA luôn. Không lẽ VBA lại hẹp vậy?
Nếu chỉ chú ý vào VBA thì quả là hẹp.
Excel căn bản nó là một công cụ hổ trợ phân tích dữ liệu chứ không phải là công cụ hổ trợ báo cáo và lưu trữ dữ liệu.
Phân tích thì bao gồm cả dự tính tương lai. Chỉ có báo cáo mới giới hạn trong quá khứ và hiện tại (các báo cáo bậc cao cấp thực ra có cả đề nghị dự toán tương lai).
90% các hoạt động trong diễn đàn này chỉ quanh quẩn ở báo cáo bậc thấp. 9,99% chỉ quanh quẩn ở các kỹ xảo mà đáng lẽ dùng phần mềm khác hiệu quả hơn. Chỉ khoảng 0,01% thực sự nói về phong cách làm việc với bảng tính.
 
Upvote 0
Web KT

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

Back
Top Bottom