Lỗi tách sheets khi lập trình VBA " That name is already taken.try a different one"

Liên hệ QC

hungmanh.th1

Thành viên mới
Tham gia
22/10/22
Bài viết
15
Được thích
0
Chào mọi người ! Mình có một sheets excle cần tách ra thành nhiều sheets nhưng gặp lỗi "that name is already taken. try a different one"
Chỉ tạo ra 1 sheet đầu tiên và báo lỗi như vậy . Nhờ anh em xem code và chỉ giáo ạ !

1667696943152.png
1667696957337.png

Public Sub GPE()
Dim I, Arr, Dic As Object, Tem, Item As String, Wb As Object, Rng As Range, Ws As Worksheet
Application.DisplayAlerts = False
Application.ScreenUpdating = False
For Each Ws In Worksheets
If Ws.Name <> "ABC1" Then Ws.Delete
Next Ws
Set Wb = ActiveWorkbook
With Wb.Sheets("ABC1")
Set Rng = .Range(.[A11], .[K65000].End(3))
Set Dic = CreateObject("Scripting.Dictionary")
Arr = .Range(.[K12], [K65000].End(3)).Value
For I = 1 To UBound(Arr)
Tem = Arr(I, 1)
If Tem <> Empty And Not Dic.exists(Tem) Then
Item = Tem
Rng.AutoFilter 11, Item
.Range(.[A1], Rng).SpecialCells(12).Copy
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = Item
Sheets(Item).[A1].PasteSpecial xlPasteValues
Sheets(Item).[A1].PasteSpecial xlPasteFormats
End If
Next I
.Activate
.AutoFilterMode = False
End With
Application.CutCopyMode = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
Tốt nhất là bạn nên upload file lên để tiện test thử code.
Bca s bạn hỗ trợ mình với
Bài đã được tự động gộp:

Đại ca chỉ giáo dùm :(
Bài đã được tự động gộp:

Chào mọi người ! Mình có một sheets excle cần tách ra thành nhiều sheets nhưng gặp lỗi "that name is already taken. try a different one"
Chỉ tạo ra 1 sheet đầu tiên và báo lỗi như vậy . Nhờ anh em xem code và chỉ giáo ạ !

View attachment 283026
View attachment 283027

Public Sub GPE()
Dim I, Arr, Dic As Object, Tem, Item As String, Wb As Object, Rng As Range, Ws As Worksheet
Application.DisplayAlerts = False
Application.ScreenUpdating = False
For Each Ws In Worksheets
If Ws.Name <> "ABC1" Then Ws.Delete
Next Ws
Set Wb = ActiveWorkbook
With Wb.Sheets("ABC1")
Set Rng = .Range(.[A11], .[K65000].End(3))
Set Dic = CreateObject("Scripting.Dictionary")
Arr = .Range(.[K12], [K65000].End(3)).Value
For I = 1 To UBound(Arr)
Tem = Arr(I, 1)
If Tem <> Empty And Not Dic.exists(Tem) Then
Item = Tem
Rng.AutoFilter 11, Item
.Range(.[A1], Rng).SpecialCells(12).Copy
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = Item
Sheets(Item).[A1].PasteSpecial xlPasteValues
Sheets(Item).[A1].PasteSpecial xlPasteFormats
End If
Next I
.Activate
.AutoFilterMode = False
End With
Application.CutCopyMode = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • Rà soát thuế 2022 (1).xlsx
    358.4 KB · Đọc: 0
Lần chỉnh sửa cuối:
Dữ liệu và code không ăn nhập gì cả, vậy viết code theo dữ liệu hay dữ liệu chạy theo code.
 

File đính kèm

  • Rà soát thuế 2022 (1).xlsx
    358.4 KB · Đọc: 4
Đặt tên Sheet mà lấy cột K là không phù hợp do trong tên có khi có những ký tự Excel không cho phép đặt tên chính vì vậy nó sẽ gặp lỗi tại chổ thay đổi tên sheet.
 
Tui viết cho bạn tham khảo còn tùy biến file của bạn thôi.
Mã:
Public Sub GPE()
    Dim I, Arr, Dic As Object, Tem, Item As String, Wb As Object, Rng As Range, Ws As Worksheet
    Dim aWs As Worksheet
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    For Each Ws In Worksheets
    If Ws.Name <> "ABC1" Then Ws.Delete
    Next Ws
    Set Wb = ActiveWorkbook
    With Wb.Sheets("ABC1")
        Set Rng = .Range(.[A11], .[K65000].End(3))
        Set Dic = CreateObject("Scripting.Dictionary")
        Arr = .Range(.[K11], [K65000].End(3)).Value
        For I = 1 To UBound(Arr)
            Tem = Arr(I, 1)
            If (Tem <> Empty) And (Not Dic.exists(Tem)) Then
                Item = Tem
                Dic.Add Tem, Tem
                Rng.AutoFilter 11, Item
                .Range(.[A1], Rng).SpecialCells(12).Copy
                Set aWs = Sheets.Add(After:=Sheets(Sheets.Count))
                aWs.Name = "Item" & I
                aWs.[A1].PasteSpecial xlPasteValues
                aWs.[A1].PasteSpecial xlPasteFormats
            End If
        Next I
        '.Activate
        .AutoFilterMode = False
        Set Dic = Nothing
    End With
    Set aWs = Nothing
    Set Wb = Nothing
    Application.CutCopyMode = False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
 
Mình làm một vi dụ cột F nó cũng báo vậy bạn à.:(
Thử code cái cột F vs ít cột hơn vẫn vậy bạn ạ
Bài đã được tự động gộp:

Tui viết cho bạn tham khảo còn tùy biến file của bạn thôi.
Mã:
Public Sub GPE()
    Dim I, Arr, Dic As Object, Tem, Item As String, Wb As Object, Rng As Range, Ws As Worksheet
    Dim aWs As Worksheet
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    For Each Ws In Worksheets
    If Ws.Name <> "ABC1" Then Ws.Delete
    Next Ws
    Set Wb = ActiveWorkbook
    With Wb.Sheets("ABC1")
        Set Rng = .Range(.[A11], .[K65000].End(3))
        Set Dic = CreateObject("Scripting.Dictionary")
        Arr = .Range(.[K11], [K65000].End(3)).Value
        For I = 1 To UBound(Arr)
            Tem = Arr(I, 1)
            If (Tem <> Empty) And (Not Dic.exists(Tem)) Then
                Item = Tem
                Dic.Add Tem, Tem
                Rng.AutoFilter 11, Item
                .Range(.[A1], Rng).SpecialCells(12).Copy
                Set aWs = Sheets.Add(After:=Sheets(Sheets.Count))
                aWs.Name = "Item" & I
                aWs.[A1].PasteSpecial xlPasteValues
                aWs.[A1].PasteSpecial xlPasteFormats
            End If
        Next I
        '.Activate
        .AutoFilterMode = False
        Set Dic = Nothing
    End With
    Set aWs = Nothing
    Set Wb = Nothing
    Application.CutCopyMode = False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
Cám ơn bạn .Để mình thử cám ơn
 

File đính kèm

  • image.jpg
    image.jpg
    105.1 KB · Đọc: 5
Lần chỉnh sửa cuối:
Tui viết cho bạn tham khảo còn tùy biến file của bạn thôi.
Mã:
Public Sub GPE()
    Dim I, Arr, Dic As Object, Tem, Item As String, Wb As Object, Rng As Range, Ws As Worksheet
    Dim aWs As Worksheet
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    For Each Ws In Worksheets
    If Ws.Name <> "ABC1" Then Ws.Delete
    Next Ws
    Set Wb = ActiveWorkbook
    With Wb.Sheets("ABC1")
        Set Rng = .Range(.[A11], .[K65000].End(3))
        Set Dic = CreateObject("Scripting.Dictionary")
        Arr = .Range(.[K11], [K65000].End(3)).Value
        For I = 1 To UBound(Arr)
            Tem = Arr(I, 1)
            If (Tem <> Empty) And (Not Dic.exists(Tem)) Then
                Item = Tem
                Dic.Add Tem, Tem
                Rng.AutoFilter 11, Item
                .Range(.[A1], Rng).SpecialCells(12).Copy
                Set aWs = Sheets.Add(After:=Sheets(Sheets.Count))
                aWs.Name = "Item" & I
                aWs.[A1].PasteSpecial xlPasteValues
                aWs.[A1].PasteSpecial xlPasteFormats
            End If
        Next I
        '.Activate
        .AutoFilterMode = False
        Set Dic = Nothing
    End With
    Set aWs = Nothing
    Set Wb = Nothing
    Application.CutCopyMode = False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
Bạn cho mình số để add zalo nha
 
Tui viết cho bạn tham khảo còn tùy biến file của bạn thôi.
Mã:
Public Sub GPE()
    Dim I, Arr, Dic As Object, Tem, Item As String, Wb As Object, Rng As Range, Ws As Worksheet
    Dim aWs As Worksheet
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    For Each Ws In Worksheets
    If Ws.Name <> "ABC1" Then Ws.Delete
    Next Ws
    Set Wb = ActiveWorkbook
    With Wb.Sheets("ABC1")
        Set Rng = .Range(.[A11], .[K65000].End(3))
        Set Dic = CreateObject("Scripting.Dictionary")
        Arr = .Range(.[K11], [K65000].End(3)).Value
        For I = 1 To UBound(Arr)
            Tem = Arr(I, 1)
            If (Tem <> Empty) And (Not Dic.exists(Tem)) Then
                Item = Tem
                Dic.Add Tem, Tem
                Rng.AutoFilter 11, Item
                .Range(.[A1], Rng).SpecialCells(12).Copy
                Set aWs = Sheets.Add(After:=Sheets(Sheets.Count))
                aWs.Name = "Item" & I
                aWs.[A1].PasteSpecial xlPasteValues
                aWs.[A1].PasteSpecial xlPasteFormats
            End If
        Next I
        '.Activate
        .AutoFilterMode = False
        Set Dic = Nothing
    End With
    Set aWs = Nothing
    Set Wb = Nothing
    Application.CutCopyMode = False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
Bạn oi !Công thức này tách thành từng sheets rùi nhưng lại ko theo địa chỉ.Mà 60 dòng thành 60 sheets luôn bạn à. Mình muốn lấy trị chung ví dụ từng huyện như hình á bạn à
1667719326751.png
 
Lần chỉnh sửa cuối:
Hinnf nhuw banj HD mình thêm .Dic Add ITem, "" đúng ko
Code bạn đang viết có đoạn kiểm tra sự tồn tại của tên sheet trong dictionary
PHP:
 If Tem <> Empty And Not Dic.exists(Tem)
Nhưng dòm hoài thì không thấy có chỗ nào bạn đưa giá trị vào trong Dic, vậy thì cứ so sánh với tập rỗng ? thì mặc nhiên là Not Exist luôn đúng. Bạn thêm dòng
PHP:
 Dic.Add Item, ""
Nhưng mà góp ý là bạn đặt tên Sheet bằng tên công ty thì, vừa khó quản lý, vừa dễ lỗi nếu tên công ty có chứa ký tự đặc biệt. Theo mình nên bổ sung tờ mục lục chứa tên mã (hoặc tên rút gọn) và tên đầy đủ, dùng mã để đặt tên sheet, dùng Hyperlink để nhảy đến sheet sẽ tiện quản lý luôn.
 
Code bạn đang viết có đoạn kiểm tra sự tồn tại của tên sheet trong dictionary
PHP:
 If Tem <> Empty And Not Dic.exists(Tem)
Nhưng dòm hoài thì không thấy có chỗ nào bạn đưa giá trị vào trong Dic, vậy thì cứ so sánh với tập rỗng ? thì mặc nhiên là Not Exist luôn đúng. Bạn thêm dòng
PHP:
 Dic.Add Item, ""
Nhưng mà góp ý là bạn đặt tên Sheet bằng tên công ty thì ...
Thêm đoạn này vào trước THen thì nó báo sai câu lệnh bạn à Dic.Add ITem, ""
 
1667724377132.png
Mình thêm vào đoạn này.

PHP:
Public Sub GPE()
    Dim I, Arr, Dic As Object, Tem, Item As String, Wb As Object, Rng As Range, Ws As Worksheet
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    For Each Ws In Worksheets
        If Ws.Name <> "ABC1" Then Ws.Delete
    Next Ws
    Set Wb = ActiveWorkbook
    With Wb.Sheets("ABC1")
        Set Rng = .Range(.[A11], .[K65000].End(3))
        Set Dic = CreateObject("Scripting.Dictionary")
        Arr = .Range(.[K12], [K65000].End(3)).Value
        For I = 1 To UBound(Arr)
            Tem = Arr(I, 1)
            If Tem <> Empty And Not Dic.exists(Tem) Then
            Item = Tem
                Dic.Add Tem, ""
                'Dic.Add Item, ""
                Rng.AutoFilter 11, Item
                .Range(.[A1], Rng).SpecialCells(12).Copy
                Sheets.Add(After:=Sheets(Sheets.Count)).Name = Item
                Sheets(Item).[A1].PasteSpecial xlPasteValues
                Sheets(Item).[A1].PasteSpecial xlPasteFormats
            End If
        Next I
        .Activate
        .AutoFilterMode = False
    End With
    Application.CutCopyMode = False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
View attachment 283042
Mình thêm vào đoạn này.

PHP:
Public Sub GPE()
    Dim I, Arr, Dic As Object, Tem, Item As String, Wb As Object, Rng As Range, Ws As Worksheet
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    For Each Ws In Worksheets
        If Ws.Name <> "ABC1" Then Ws.Delete
    Next Ws
    Set Wb = ActiveWorkbook
    With Wb.Sheets("ABC1")
        Set Rng = .Range(.[A11], .[K65000].End(3))
        Set Dic = CreateObject("Scripting.Dictionary")
        Arr = .Range(.[K12], [K65000].End(3)).Value
        For I = 1 To UBound(Arr)
            Tem = Arr(I, 1)
            If Tem <> Empty And Not Dic.exists(Tem) Then
            Item = Tem
                Dic.Add Tem, ""
                'Dic.Add Item, ""
                Rng.AutoFilter 11, Item
                .Range(.[A1], Rng).SpecialCells(12).Copy
                Sheets.Add(After:=Sheets(Sheets.Count)).Name = Item
                Sheets(Item).[A1].PasteSpecial xlPasteValues
                Sheets(Item).[A1].PasteSpecial xlPasteFormats
            End If
        Next I
        .Activate
        .AutoFilterMode = False
    End With
    Application.CutCopyMode = False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
1667786527340.png

Bạn ơi. Nếu mình muốn hiển thị tên đv, mã số thuế, địa chỉ........................... để chạy theo các sheets khi xuất ra có được không bạn :)
 
View attachment 283042
Mình thêm vào đoạn này.

PHP:
Public Sub GPE()
    Dim I, Arr, Dic As Object, Tem, Item As String, Wb As Object, Rng As Range, Ws As Worksheet
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    For Each Ws In Worksheets
        If Ws.Name <> "ABC1" Then Ws.Delete
    Next Ws
    Set Wb = ActiveWorkbook
    With Wb.Sheets("ABC1")
        Set Rng = .Range(.[A11], .[K65000].End(3))
        Set Dic = CreateObject("Scripting.Dictionary")
        Arr = .Range(.[K12], [K65000].End(3)).Value
        For I = 1 To UBound(Arr)
            Tem = Arr(I, 1)
            If Tem <> Empty And Not Dic.exists(Tem) Then
            Item = Tem
                Dic.Add Tem, ""
                'Dic.Add Item, ""
                Rng.AutoFilter 11, Item
                .Range(.[A1], Rng).SpecialCells(12).Copy
                Sheets.Add(After:=Sheets(Sheets.Count)).Name = Item
                Sheets(Item).[A1].PasteSpecial xlPasteValues
                Sheets(Item).[A1].PasteSpecial xlPasteFormats
            End If
        Next I
        .Activate
        .AutoFilterMode = False
    End With
    Application.CutCopyMode = False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
Mình hỏi chút ! Mình chạy file nhưng cứ chạy ra cái dòng đầu tiên của trang tính 1. Sheets nào cũng có dòng này. Bạn chỉ mình sửa lại CT với
1667791881942.png
1667791908161.png
1667791924925.png
 
Do bạn set AutoFilter vào dòng thứ 11.
bạn đổi
PHP:
Set Rng = .Range(.[A11], .[K65000].End(3))
thành
PHP:
Set Rng = .Range(.[A10], .[K65000].End(3))
 
Web KT
Back
Top Bottom