Giờ lật ngược bài toán như bạn bogia_Hp7 hỏi: Có sẳn 1 file, giờ liệt kê ra tên sheet và đếm xem có bao nhiêu sheet:
PHP:
Sub SheetName()
Dim CS As Integer
CS = Sheets.Count
For i = 1 To CS
ActiveSheet.Select
Cells(i, 1).Value = Sheets(i).Name
Cells(1, 2).Value = CS
Next i
End Sub
Lại có một vấn đề nữa nhờ các bác.
Em dùng thử các code của các bác thấy nó đổi tên lần lượt từ sheet đầu -> sang sheet bên cạnh. Nếu em để sheet VD: Sheet23, 24 đứng ở vị trí thứ 1,4
có nghĩa là các sheet không lần lượt khi chạy code thì nó vẫn bị đổi tên cụ thể là A1 = Sheet23, A4 = Sheet 24 .... mà đáng ra nó là của sheet1, sheet4. Các bác xem giúp em với.
Đó là code:
Sheets.Count
Cũng với file ở trên bạn thêm code nữa, tại cell B1 của Sheet 13 sẽ đếm bao nhiêu sheet:
PHP:
Sub DoitenvaDem()
For i = 1 To 12
sht = Range("Sheet13!A" & i + 2).Value
Application.Sheets(i).Name = sht
Next i
Range("Sheet13!B1").Value = Sheets.Count
End Sub
Để tránh bị lỗi, nên như thế này : (Tên sheet ở Excel hoặc VBA thay đổi)
PHP:
Sub DoiTen()
On Error GoTo thoat
Dim Sh As Worksheet, i As Integer
For Each Sh In ThisWorkbook.Worksheets
i = i + 1
Sh.Name = Sheet3.Range("A" & i + 2).Value
Next
thoat:
Set Sh = Nothing
End Sub
Nghĩ cũng lạ... lý ra code sẽ lấy theo tên sheet mặc định chứ nhỉ: Sheet đã đỗi tên gì mặc kệ, nhưng mặc định nó là sheet1 thì code phải hiểu nó là sheet1 chứ?
Sao nó lại đỗi tên tuần tự từ trái sang phải mà lại ko theo tên sheet? Điều này tôi cũng thấy khó hiểu!
ANH TUẤN
Đúng là lạ thật nếu đúng ra thì Shees(i).name thì i là số của sheet chứ. khi đổi tên xong ta chuyển vị trí của sheet, chạy code lại báo lỗi ngay vì nó đổi lần lượt nên có sheet trùng tên. Các bác nghiên cứu giúp em với.
Đúng là lạ thật nếu đúng ra thì Shees(i).name thì i là số của sheet chứ. khi đổi tên xong ta chuyển vị trí của sheet, chạy code lại báo lỗi ngay vì nó đổi lần lượt nên có sheet trùng tên. Các bác nghiên cứu giúp em với.
Bạn dời chổ sheet sau đó chạy code thì tất nhiên sẽ báo lỗi vì trùng tên... (nếu sửa dử liệu A1:A20 thành cái khác thì dc)...
Còn vụ tại sao nó ko đỗi tên theo sheet thì tôi cũng chưa hiểu rõ
Đễ xem các cao thủ có ý kiến gì
ANH TUẤN
Nghĩ cũng lạ... lý ra code sẽ lấy theo tên sheet mặc định chứ nhỉ: Sheet đã đỗi tên gì mặc kệ, nhưng mặc định nó là sheet1 thì code phải hiểu nó là sheet1 chứ?
Sao nó lại đỗi tên tuần tự từ trái sang phải mà lại ko theo tên sheet? Điều này tôi cũng thấy khó hiểu!
ANH TUẤN
Option Explicit
Sub DoiTen2()
On Error GoTo thoat
Dim Rng As Range, i As Integer, ShName As String
Set Rng = Sheet1.Range("A1:A5")
For i = 1 To Rng.Count
ShName = "Sheet" & i + 1
If SheetExists(ShName) Then
Sheets(ShName).Name = Rng(i)
Else
MsgBox "Khong co " & ShName
GoTo tiep
End If
tiep:
Next
thoat:
Set Rng = Nothing
End Sub
Private 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
Chào bạn Salam...
Về việc tên sheet, cái nọ sọ cái kia như bạn nói tôi cũng rất thắc mắc... Chiều nay tôi cố tìm hiểu thì phát hiện ra những mấu chốt rất quan trọng... Tôi cũng đang tập tành VBA nên có lẽ giãi thích bạn sẽ hiểu ngay:
-Thứ nhất: Tên sheet mà bạn gọi là "tên trong VBA" chính là CodeName
-Thứ hai: Tên sheet ta có thể thay đỗi nhưng CodeName sẽ ko đỗi.. Ví dụ Sheet5 ta đỗi tên thành Salam, vậy Sheets(5).Name =Salam, còn Sheets(5).CodeName thì luôn = Sheet5
-Thứ ba: khi mở 1 file mới thì mặc định SheetName = CodeName
-Thứ tư: Trong code Sheets(i).Name = thì chử i ở đây là số thứ tự tính từ trái sang phải, điều này bạn đã trải nghiệm qua rồi...
Chính vì những lẽ đó mà nếu bạn muốn đạt dc mục đích rằng Sheet1 (CodeName) luôn bằng giá trị cell A1, Sheet2 (CodeName) luôn bằng giá trị cell A2 thì bạn phải dùng đoạn code: Sheets("Sheet" & i).Name = chứ ko phải là Sheets(i).Name=
Giờ bạn mở 1 file mới lên, add thêm 3 sheet nữa (tổng cộng là 6 sheet).. Tại sheet2 bạn tạo list gì đó từ cell A1 đến A6... Tiếp theo đảo lộn vị trí của sheet, rồi chèn code này vào module nhé:
PHP:
Sub Test()
For i = 1 To 6
Sheets("Sheet" & i).Name = Sheet2.Cells(i, 1).Value
Next i
End Sub
Tôi còn nghĩ ra dc 1 cách an toàn hơn là bạn chuyễn tất cả tên sheet trở về mặc định, rồi từ đây sẽ chạy code đễ đỗi tên sheet là chắc ăn nhất
Code đễ chuyễn tên sheet về mặc định là
PHP:
For i = 1 To 6
Sheets(i).Name = Sheets(i).CodeName
Next i
Nếu bạn đặt code này phía trước code kia thì.. ăn chắc mặc bền luôn... hi.. hi... (trả tên sheet về mặc định, sau đó sẽ đỗi tên)
Đây ko phải là code hoàn hảo đễ đổi tên sheet (còn rất nhiều lỗi), nhưng mong rằng qua đây bạn hiểu dc vấn đề và có thể tùy biến theo ý mình
Mến
ANH TUẤN
-Thứ hai: Tên sheet ta có thể thay đỗi nhưng CodeName sẽ ko đỗi.. Ví dụ Sheet5 ta đỗi tên thành Salam, vậy Sheets(5).Name =Salam, còn Sheets(5).CodeName thì luôn = Sheet5
Sub Test()
For i = 1 To 6
Sheets("Sheet" & i).Name = Sheet2.Cells(i, 1).Value
Next i
End Sub
Bác Tuấn ơi nó bị lỗi sao ấy em làm theo HD của Bác. Như thế này Bác nhé.
File của Em có 30 sheet vị trí linh tinh không lần lượt. ở sheet30(C3:C22) Là list tên sheet. Em muốn đổi tên sheet từ sheet1 đến sheet20 (tên trong VBA) theo list tên sheet. có nghĩa là tên nhìn trong excel thì đổi còn trong VBA thì vẫn là mặc định.
VD: Sheet1 đổi thành "Salam" thì nhìn trong VBA là Sheet1(Salam) khi ta thay đổi tên sheet trong excel thì các code trong VBA vẫn nhận nó là sheet1. Cái này Bác biết rồi.
Em theo các cách của các Bác HD thì nó chỉ đổi tên từ trái sang phải thôi mà em muốn là nó đổi tên theo tên sheet mặc định.
Em thử kiểu củ chuối là:
Sub doitensheet()
Sheet1.Name = Sheet30.Range("C3")
Sheet2.Name = Sheet30.Range("C4")
....
Sheet20.Name = Sheet30.Range("C22")
end sub
thì OK.
Các Bác xem giúp em với.
Đó chỉ là hướng dẩn cơ bản thôi... Bạn xem file này se hiểu... hảy sửa lại tên sheet là cái gì đó tùy bạn trong phần tôi tô màu vàng... Nó sẽ đỗi tên theo đúng sheet mặc định đấy (mở của sổ VBE đễ so sánh)
Với code đơn giãn này, từ đây bạn hảy phát triển thêm nhé
Mến
ANH TUẤN
Chào các bạn!
Tôi lại có vấn đề muốn hõi về chuyện đỗi tên Sheet đây... Các bạn xem code này:
PHP:
Sub DoiTenSheet()
For i = 1 To 12
Shc = Sheets(i).CodeName
Stt = Right(Shc, Len(Shc) - 5)
If Cells(Stt, 1) = "" Then
Sheets(i).Name = Shc
Else: Sheets(i).Name = Cells(Stt, 1).Value
End If
Cells(Stt, 2) = Shc
Next i
End Sub
Nếu tìm ko thấy dử liệu trong mãng A1:A12 thì trã về tên sheet là CodeName, ngược lại thì lấy tên Sheet trong danh sách
Vấn đề ở đây là việc đặt điều kiện IF... thật ra tôi muốn rằng nếu trong quá trình đỗi tên mà gặp lỗi (có thể do trùng tên, hoặc cell trong dach sách bị rỗng hay vì lý do gì đó) thì trã về tên sheet chính là code name.. bằng ngược lại mới lấy sheet name theo danh sách
Trường hợp điều kiện như thế phải viết thế nào đây?
Thay đoạn codeIf Cells(Stt, 1) = "" Then bằng cái gì?
Xin hướng dẫn tôi với
ANH TUẤN
Sub DoiTenSheet()
On Error Resume Next
For i = 1 To 3
Shc = Sheets(i).CodeName
Stt = Right(Shc, Len(Shc) - 5)
If Cells(Stt, 1).Value <> "" And Sheets(Cells(Stt, 1).Value) Is Nothing Then
Sheets(i).Name = Cells(Stt, 1).Value
Else: Sheets(i).Name = Sheets(i).CodeName
End If
Cells(Stt, 2) = Sheets(i).CodeName
Next i
End Sub
Cái đoạn Sheets(Cells(Stt, 1).Value) Is Nothing là em học được trên trang www.ogrid.com đấy.
Ha... ha... hay quá... cũng là 1 ý tưởng, nhưng cách phát biểu của bạn minhlev mang tính tổng quát hơn... thay vì nói CELL KO TỒN TẠI thì bạn lại nói SHEET KO TỒN TẠI...
Rất có lý... tuy nhiên code này vẫn chưa trã về dc CodeName nếu nó ko tìm thấy, chẳng qua nó bỏ qua ko đỗi tên mà thôi... Ý tôi là giã sử Sheet tên Tuan06 có CodeName là Sheet7, nếu nó ko thể đỗi tên dc thì hãy trã về mặc định là Sheet7
Bạn giúp thêm tí nữa nha!
ANH TUẤN
Sub DoiTenSheet()
On Error Resume Next
For i = 1 To 3
Shc = Sheets(i).CodeName
Stt = Right(Shc, Len(Shc) - 5)
Select Case Cells(Stt, 1).Value
Case Is <> ""
If Sheets(Cells(Stt, 1).Value) Is Nothing Then
Sheets(i).Name = Cells(Stt, 1).Value
Else: Sheets(i).Name = Sheets(i).CodeName
End If
Case Is = ""
Sheets(i).Name = Sheets(i).CodeName
End Select
Cells(Stt, 2) = Sheets(i).CodeName
Next i
End Sub