Xử lý lỗi Name khi Insert Sheet từ Template vào File

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

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
720
Được thích
97
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Kính gửi các anh chị!
Em đang vướng mắc là khi dùng em có tạo 1 file Template mẫu mỗi khi dùng đến cái nào em hay insert vào file hiện tại đang dùng. Tuy nhiên phát sinh chỗ Insert bao nhiêu Sheet thì sẽ phát sinh bấy nhiêu Name như trong hình vào File mới (như hình)
+ Có cách nào khi Insert không chèn thêm Name như hiện tại em đang bị không
+ File Template không tạo Name mà sẽ sử dụng Name trong VBA Code
Mã:
Sub MakeRange()
 
    ActiveWorkbook.Names.Add Name:="DATA", RefersTo:="=OFFSET(TEMP!$B$4,,,COUNTA(TEMP!$B$4:$B$1048576),9)"
    ActiveWorkbook.Names.Add Name:="LOC", RefersTo:="=IF(OFFSET(DATA,,,,1)=Input_TBi!$C17,ROW(INDIRECT("1:"&ROWS(DATA))),"")"
End Sub

Hiện Code đang bị lỗi chỗ đoạn INDIRECT("1:"&ROWS(DATA))
Mong các anh giúp đỡ

1630342183586.png

1630343684155.png
 

File đính kèm

Lần chỉnh sửa cuối:
File Template không tạo Name mà sẽ sử dụng Name trong VBA Code
Mình thấy bạn bảo File Template không tạo name, mà khi copy qua có name do người dùng đặt là vô lý, nếu name rác thì có thể còn có lý. Mà bạn gửi file temp đó lên luôn
Bài đã được tự động gộp:

Hiện Code đang bị lỗi chỗ đoạn INDIRECT("1:"&ROWS(DATA))
Cặp dấu nháy chứ không phải 1 nháy kép nhé bạn (vì cái này là nháy kép trong nháy kép)
 
Mình thấy bạn bảo File Template không tạo name, mà khi copy qua có name do người dùng đặt là vô lý, nếu name rác thì có thể còn có lý. Mà bạn gửi file temp đó lên luôn
Bài đã được tự động gộp:


Cặp dấu nháy chứ không phải 1 nháy kép nhé bạn (vì cái này là nháy kép trong nháy kép)
Dạ anh
1. File Template em có tạo Name sẵn khi Copy bao nhiêu Sheet qua File mới nó sẽ tạo bấy nhiêu Name đó qua file mới anh
2. Em đã điều chỉnh dấu nháy kép ("") thành nháy đơn ('') vẫn bị lỗi anh xem giúp em với ạ
1630372447464.png
 

File đính kèm

"Cặp nháy kép" có nghĩa là hai dấu " chứ không phải hai dấu ',
nghĩa là là ""
Nghĩa là là là ""1:""
 
Dạ cám ơn các anh chỉ giúp em đã đúng theo ý em rồi ạ
Cám ơn các anh
Bài của bạn có 2 ý mà đúng không?
1/ Cái thứ nhất là lỗi dấu nháy kép => Xong rồi
2/ Cái thứ 2 là vụ name, ý bạn là vẫn muốn copy name qua nhưng không phải là dạng name liên kết về file cũ kiểu 'D:\... hay là không muốn copy name qua nhỉ?
 
Kính gửi các anh chị!
Em đang vướng mắc là khi dùng em có tạo 1 file Template mẫu mỗi khi dùng đến cái nào em hay insert vào file hiện tại đang dùng. Tuy nhiên phát sinh chỗ Insert bao nhiêu Sheet thì sẽ phát sinh bấy nhiêu Name như trong hình vào File mới (như hình)
+ Có cách nào khi Insert không chèn thêm Name như hiện tại em đang bị không
+ File Template không tạo Name mà sẽ sử dụng Name trong VBA Code
Mã:
Sub MakeRange()
 
    ActiveWorkbook.Names.Add Name:="DATA", RefersTo:="=OFFSET(TEMP!$B$4,,,COUNTA(TEMP!$B$4:$B$1048576),9)"
    ActiveWorkbook.Names.Add Name:="LOC", RefersTo:="=IF(OFFSET(DATA,,,,1)=Input_TBi!$C17,ROW(INDIRECT("1:"&ROWS(DATA))),"")"
End Sub

Hiện Code đang bị lỗi chỗ đoạn INDIRECT("1:"&ROWS(DATA))
Mong các anh giúp đỡ

View attachment 265100

View attachment 265102
Sai ngay từ đầu code:
1/ Đầu dòng code dùng ActiveWorkbook nên nó mang theo File mới là phải rồi.
2/ Đầu dòng code thay ActiveWorkbook là chính ngay tên sheet TEMP thử coi nó còn mang đi đâu nữa không?
 
Sai ngay từ đầu code:
1/ Đầu dòng code dùng ActiveWorkbook nên nó mang theo File mới là phải rồi.
2/ Đầu dòng code thay ActiveWorkbook là chính ngay tên sheet TEMP thử coi nó còn mang đi đâu nữa không?
Hình như anh đang nhầm giữa Workbook với WorkSheet thì phải anh nhỉ?
 
Hình như anh đang nhầm giữa Workbook với WorkSheet thì phải anh nhỉ?
Dựa vào nội dung Bài 3, chủ Topic nêu vày nè em "File Template em có tạo Name sẵn khi Copy bao nhiêu Sheet qua File mới nó sẽ tạo bấy nhiêu Name đó qua file mới".
Nên anh mới nêu thay ActiveWorkbook là chính cái tên sheet TEMP là sheet chứa Name Range thôi.
 
Lần chỉnh sửa cuối:
Bài của bạn có 2 ý mà đúng không?
1/ Cái thứ nhất là lỗi dấu nháy kép => Xong rồi
2/ Cái thứ 2 là vụ name, ý bạn là vẫn muốn copy name qua nhưng không phải là dạng name liên kết về file cũ kiểu 'D:\... hay là không muốn copy name qua nhỉ?
Dạ đúng anh ạ
Bài toán em có 2 trường hợp
1. Nếu Copy thì chỉ copy duy nhất 1 Name (VD của em có 2 Name là DATA và LOC) thôi chứ ko phải Copy nhiều Name rác và ko có liên kết file cũ
2. Xử lý lỗi mục 1 thì xóa toàn bộ Name ở file Template đưa vào file mới bằng cách tạo Name bằng Code như trên ạ
Bài đã được tự động gộp:

Em Up toàn bộ 3 Sub em đang dùng cho file Template của em mong các anh góp ý giúp, sau khi các anh chỉ giáo cơ bản đã chạy theo đúng ý em nhưng do code góp nhặt chắc chắn sẽ không tối ưu ạ
1. Sub Insert_HS: Mục đích Intert các Sheet vào file mới
2. Sub Run_ReaplaceLinks: Mục đích xóa bỏ liên kết từ file cũ
3. Sub Insert_MakeRange : Tạo Name lại sau khi đã xóa toàn bộ Name từ file Template và tạo lại trong file mới

Mã:
Sub Insert_HS()

    Dim vraag       As Variant
    Dim sh          As Worksheet
    Dim wkbTarget As Workbook, wkbSource As Workbook
    Dim i, arrNames, sFile As String

    On Error GoTo QuitOpen
    ActiveWorkbook.Activate
    If ActiveWorkbook.FileFormat = 56 Then
        MsgboxUni UNC("V× ActiveWorkbook lµ mét tÖp Excel 97-2003 nªn kh«ng thÓ chÌn Template vµo ®îc" & vbNewLine & _
                "H·y chuyÓn ®æi ®Þnh d¹ng File sang d¹ng Office cao h¬n (VD: .xlsx, .xlsm, .xlsb)"), 64, UNC("Thong Bao")
    Else
        If ActiveWorkbook.ProtectStructure = True Then
            MsgboxUni UNC("V× ActiveWorkbook ®ang ®îc b¶o vÖ nªn kh«ng thÓ chÌn Template vµo ®îc" & vbNewLine & _
                    "Xin vui lßng bá chÕ ®é b¶o vÖ vµ thùc hiÖn l¹i!!!!."), 64, UNC("Thong Bao")
        Else
            vraag = MsgboxUni(UNC("B¹n cã muèn chÌn Template vµo Workbook b¹n ®ang lµm viÖc kh«ng ?"), vbYesNo, "Thong Bao")
            If vraag = vbNo Then Exit Sub
            'Chen Shet vao File

            Call TangTocCode(True)

            Set wkbTarget = ActiveWorkbook

            sFile = GetRegistry(HKEY_SET, "lbPath_HC")

            If sFile <> "" Then
                Set wkbSource = Workbooks.Open(sFile)
            Else
                MsgboxUni UNC("§êng dÉn ®Õn File cha ®îc thiÕt lËp! Vui lßng vµo phÇn CÊu h×nh ®Ó thùc hiÖn"), 64, UNC("Thong Bao")
                Exit Sub
            End If

            If KiemtraSheet("Thongtin_CT") = False And KiemtraSheet("DS_DoiTac") = False Then
                arrNames = VBA.Array("TEMP", "Input_TBi", "BQT-VTU-2", "BQT-2B", "BBLV", "YCNK", "BBNTHT-CN", "PL BBNTHT", "BBBGCT", "BBBG", "Bia", "TH-TDQT", "TM TDQT", "TD-QT-TH", "BTL_HD")
                For i = 0 To 14
                    Set sh = Nothing
                    On Error Resume Next
                    Set sh = wkbSource.Sheets(arrNames(i))
                    On Error GoTo 0
                    If Not sh Is Nothing Then
                        sh.Copy After:=wkbTarget.Worksheets(wkbTarget.Worksheets.count)
                    End If
                Next
            Else
                arrNames = VBA.Array("DS_DoiTac", "Thongtin_CT", "TEMP", "Input_TBi", "BQT-VTU-2", "BQT-2B", "BBLV", "YCNK", "BBNTHT-CN", "PL BBNTHT", "BBBGCT", "BBBG", "Bia", "TH-TDQT", "TM TDQT", "TD-QT-TH", "BTL_HD")
                For i = 0 To 16
                    Set sh = Nothing
                    On Error Resume Next
                    Set sh = wkbSource.Sheets(arrNames(i))
                    On Error GoTo 0
                    If Not sh Is Nothing Then
                        sh.Copy After:=wkbTarget.Worksheets(wkbTarget.Worksheets.count)
                    End If
                Next
            End If

            wkbSource.Close False

            MsgboxUni UNC("TuyÖt vêi!" & vbNewLine & _
                    "Ch¬ng tr×nh ®· chÌn c¸c Sheet cÇn thiÕt theo yªu cÇu!!!"), 64, UNC("Thong Bao")

            Set wkbSource = Nothing
            Set wkbTarget = Nothing



            Call TangTocCode(False)
        End If


    End If
    Exit Sub
QuitOpen:
    MsgboxUni UNC("Kh«ng cã File nµo ®îc më!!!!."), 64, UNC("Thong Bao")
End Sub

Sub Run_ReaplaceLinks()
    'PURPOSE: Find & Replace text/values throughout entire workbook
    'SOURCE: www.TheSpreadsheetGuru.com
    'LINK: https://www.thespreadsheetguru.com/the-code-vault/2014/4/14/find-and-replace-all

    Dim sht         As Worksheet
    Dim fnd         As Variant
    Dim rplc        As Variant
    Dim ReplaceCount As Long


    fnd = "E:\DL QUYENPV\THIET KE 2021\0. Mau Phap Ly 2021\[1. Mau Ho so lam thau.xlsb]"
    rplc = ""

    For Each sht In ActiveWorkbook.Worksheets

        ReplaceCount = ReplaceCount + Application.WorksheetFunction.CountIf(sht.Cells, "*" & fnd & "*")

        sht.Cells.Replace what:=fnd, Replacement:=rplc, _
                LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
                SearchFormat:=False, ReplaceFormat:=False

    Next sht
   ' MsgBox "I have completed my search and made replacements in " & ReplaceCount & " cell(s)."

End Sub

Sub Insert_MakeRange()

    'Tao Name cho BM4A
    ActiveWorkbook.Names.Add Name:="DATA", RefersTo:="=OFFSET(TEMP!$B$4,,,COUNTA(TEMP!$B$4:$B$1048576),9)"
    ActiveWorkbook.Names.Add Name:="LOC", RefersTo:="=IF(OFFSET(DATA,,,,1)=Input_TBi!$C1,ROW(INDIRECT(""1:"" & ROWS(DATA))),"""")"
    'Tao Name DS Doi tac
    ActiveWorkbook.Names.Add Name:="DS_DoiTac", RefersTo:="=OFFSET(DS_DoiTac!$P$4,,,COUNTIF(DS_DoiTac!$P$4:$P$101,""><""""""))"
End Sub
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom