Đổi tên sheet macro sai ở chỗ nào?

  • Thread starter Thread starter salam
  • Ngày gửi Ngày gửi
Liên hệ QC

salam

Thành viên gắn bó
Tham gia
4/11/06
Bài viết
1,945
Được thích
1,896
Giới tính
Nam
Nghề nghiệp
Accountant
Em muốn đổi tên sheet từ sheet1:Sheet20 theo Mảng A1:A20 ở sheet30 em viết như dưới nhưng không được. Nhờ các bác xem giúp với.

Sub doitensheets()
Rng = Array("A1:A20")
For i = 0 To 19
Sheets(i + 1).Name = Range(Rng(i)).Value
Next i
End Sub
 
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
ANH TUẤN
 
Upvote 0
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.
 
Upvote 0
anhtuan1066 đã viết:
Đó 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

Nếu muốn kỹ nữa thì trước khi chạy
  1. Kiểm tra xem Sheet 3 có tồn tại hay không
  2. Tên Sheet có dược chấp nhận hay không ??
TenSheet.jpg


Thân!
 
Upvote 0
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
 
Upvote 0
Đú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.
 
Upvote 0
salam đã viết:
Đú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
 
Upvote 0
anhtuan1066 đã viết:
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

Ý bác muốn gọi tên Sheet(i) trong VBA hay là trong excel thuần túy ??

Tên ở môi trường nào cũng đổi được bác ạ


Thân!
 
Upvote 0
Mr Okebab đã viết:
Ý bác muốn gọi tên Sheet(i) trong VBA hay là trong excel thuần túy ??

Tên ở môi trường nào cũng đổi được bác ạ


Thân!
Tên trong VBA ấy bác. Bác xem cho nhé.
 
Upvote 0
Bạn dùng thử cái này.
PHP:
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ỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
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
 
Lần chỉnh sửa cuối:
Upvote 0
anhtuan1066 đã viết:
-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

Cảm ơn tinh thần của bác.
Code name vẫn đổi được bác ạ. (Nhấn F4)
Em hay dùng để viết code dễ hơn và chính xác hơn.
Bác xem qua nhé :
http://www.giaiphapexcel.com/forum/showpost.php?p=22050&postcount=2

Thân!
 
Upvote 0
Cảm ơn Bắp... nhưng là tập tành với VBA, tôi nghĩ với cách giãi thích của tôi thì Salam sẽ đồng cảm hơn... vì cùng cấp độ hiểu biết... hi.. hi...
 
Upvote 0
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.
 
Upvote 0
Đó 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
 

File đính kèm

Upvote 0
Cách của bác anhtuan1066 rất hay, sáng tạo. Tuy nhiên bác nên đặt địa chỉ cụ thể hơn (VD như sheet7.cells...) nếu để code trong module. Cảm ơn bác.
 
Lần chỉnh sửa cuối:
Upvote 0
Cũng bài toán này, nhưng nếu là đỗi CodeName theo 1 danh sách có sẳn thì làm thế nào nhỉ?
ANH TUẤN
 
Upvote 0
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
 
Upvote 0
Bác xem thử code sau nhé.
Mã:
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.
 
Lần chỉnh sửa cuối:
Upvote 0
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
 
Upvote 0
Có phải như thế này không ạ.
Mã:
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
 
Upvote 0
Web KT

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

Back
Top Bottom