Code lấy từ khóa từ Word sang excel bị thiếu

Liên hệ QC

vc_đi chơi

Thành viên hoạt động
Tham gia
21/9/19
Bài viết
159
Được thích
32
Thưa các bác và các bạn.
Tôi có sử dụng đoạn code, phím chạy code là (Ctrl + Shift + W) để lấy từ khóa từ file Word sang file excel chứa trong cùng một foder
Các từ khóa trong Word được bôi đỏ mã màu RGB (255, 0, 0)
Khi mở file Excel và chạy code bằng phím tắt nói trên thì các từ khóa được lấy sang cột B của sheet Data, nhưng code lại không lấy được hết từ khóa trong file word có tên là (File_Mau) (như hình tôi đăng)
Nhờ các các bạn giúp tôi để lấy được từ khóa đầy đủ từ Word (File_Mau) sang cột B của sheet (Data) trong file excel.
Xin sự giúp đỡ từ các bác, mong hồi âm, xin cảm ơn.
1/ hình thứ nhất: file word ban đầu
2/ hình thứ hai: từ khóa được lấy sang file excel khi chạy code
3/ hình thứ 3: khi chạy code sẽ xuất 1 file word mới (có tên là "biên bản hiện trường") ứng với tên được điền trong sheet (Trang chu), các từ khóa bị thiếu chưa được lấy trong file word (File_Mau) xuất ra file word mới (biên bản hiện trường) vẫn còn màu đỏ.
Tôi có đính kèm file ở dưới, file excel và word đều trong một foder, khi chạy code cũng phải để trong cùng một foder
View attachment 225561View attachment 225562View attachment 225563
Bài đã được tự động gộp:

file Word.png

Key duoc lay.png

Tu khoa con thieu.png
 

File đính kèm

  • file.rar
    62.6 KB · Đọc: 20
Lần chỉnh sửa cuối:
Người ta viết ẩu thôi. Không phải là KEY ở cột B mà là các đoạn thay thế ở cột C, D, E, ...
Dạ! Vâng ạ!
Tức là khi xuất ra file Word mới không lấy được nội dung tương ứng từ các ô ở cột B,..... thuộc sheet Data mà có nội dung > 250 ký tự đúng không Thầy?
 
Upvote 0
Dạ! Vâng ạ!
Tức là khi xuất ra file Word mới không lấy được nội dung tương ứng từ các ô ở cột B,..... thuộc sheet Data mà có nội dung > 250 ký tự đúng không Thầy?
Vd. ở cột B có KEY [công trình], và ở cột C cùng dòng có <nhiều hơn 255 ký tự> thì khi tạo "Biên bản hiện trường.docx" thì không thay thế [công trình] bằng <nhiều hơn 255 ký tự> được (sẽ báo lỗi).

Vd. <nhiều hơn 255 ký tự> = "Công trình dự kiến sẽ được xây dựng trong vòng 5 năm tới. Chủ thầu là ... Tổng vốn là .... Blala hic hic he he ...". Tóm lại ở chỗ [công trình] trong tập tin File_Mau người ta muốn dán cả một bài báo dài vào.

Ở trường hợp của bạn sẽ là: cột B có KEY [Nội dung] (nội dung biên bản), ở cột C cùng dòng là nội dung của biên bản:"Ngày ... đoàn kiểm tra do Bà Gia Cát Lượng cầm đầu đã lặn lội (vừa lặn vừa lội) từ Hà Nội vào ... Đoàn đã kiểm tra hiện trường vụ tai nạn kinh hoàng đã sảy ra ngày ... với số thương vong là ... người. Đoàn cũng gọi quản lý thi công công trình, Ông Đỗ Quản Lý, lên thảm quì để chất vấn ...".

Đoại loại là cả một nội dung biên bản dài như từ Trái Đất lên Mặt Trăng rồi lại từ Mặt Trăng về Trái Đất.
 
Lần chỉnh sửa cuối:
Upvote 0
Vd. ở cột B có KEY [công trình], và ở cột C cùng dòng có <nhiều hơn 255 ký tự> thì khi tạo "Biên bản hiện trường.docx" thì không thay thế [công trình] bằng <nhiều hơn 255 ký tự> được (sẽ báo lỗi).

Vd. <nhiều hơn 255 ký tự> = "Công trình dự kiến sẽ được xây dựng trong vòng 5 năm tới. Chủ thầu là ... Tổng vốn là .... Blala hic hic he he ...". Tóm lại ở chỗ [công trình] trong tập tin File_Mau người ta muốn dán cả một bài báo dài vào.

Ở trường hợp của bạn sẽ là: cột B có KEY [Nội dung] (nội dung biên bản), ở cột C cùng dòng là nội dung của biên bản:"Ngày ... đoàn kiểm tra do Bà Gia Cát Lượng cầm đầu đã lặn lội (vừa lặn vừa lội) từ Hà Nội vào ... Đoàn đã kiểm tra hiện trường vụ tai nạn kinh hoàng đã sảy ra ngày ... với số thương vong là ... người. Đoàn cũng gọi quản lý thi công công trình, Ông Đỗ Quản Lý, lên thảm quì để chất vấn ...".

Đoại loại là cả một nội dung biên bản dài như từ Trái Đất lên Mặt Trăng rồi lại từ Mặt Trăng về Trái Đất.
Vâng, em cũng tham khảo một số bài với nội dung >255 ký tự sẽ hay bị lỗi như thầy nói, có giải pháp nào để khắc phục không vậy thầy ơi?
 
Upvote 0
Vâng, em cũng tham khảo một số bài với nội dung >255 ký tự sẽ hay bị lỗi như thầy nói, có giải pháp nào để khắc phục không vậy thầy ơi?
Giải pháp là với các đoạn > 250 thì dán thông qua ClipBoard, còn lại dán trực tiếp.

Xóa toàn bộ code
Mã:
Sub createWordAndSheet(ByVal filename As String, ByVal rng As Range)
...
End Sub

Thêm code
Mã:
Sub createWordAndSheet(ByVal filename As String, ByVal rng As Range)
Const wdFindContinue = 1
Const wdReplaceAll = 2
Dim lastRow As Long, lastCol As Long, r As Long, pos As Long, stt As Long
Dim data(), danhmuc(), sheetname As String, prefix As String, vanban_ As Boolean
Dim wb As Workbook, sh As Worksheet, wordApp As Object, wordDoc As Object, wordSelection As Object
'    ---------- Tao sheet trong tap tin Danh Muc.xlsx - bat dau ------------
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\Danh Muc.xlsx")
    sheetname = filename
    On Error Resume Next
'    xoa noi dung sheet neu da ton tai
    Set sh = wb.Worksheets(sheetname)
    If Err.Number Then
        Set sh = wb.Worksheets.Add
        sh.Range("A1:E10000").ClearContents
    End If
    On Error GoTo 0
    data = rng.Value
    lastCol = UBound(data, 2)
    ReDim danhmuc(1 To UBound(data), 1 To 5)
'    Tieu de
    danhmuc(1, 1) = "Stt"
    danhmuc(1, 2) = "N" & ChrW(7897) & "i dung v" & ChrW(259) & "n b" & ChrW(7843) & "n"
    danhmuc(1, 3) = "S" & ChrW(7889) & " v" & ChrW(259) & "n b" & ChrW(7843) & "n"
    danhmuc(1, 4) = "Ng" & ChrW(224) & "y th" & ChrW(225) & "ng ban h" & ChrW(224) & "nh"
    danhmuc(1, 5) = "Ghi ch" & ChrW(250)
    For r = 1 To UBound(data)
        pos = InStr(1, data(r, 1), "_")
        If pos > 2 Then
            prefix = UCase(Mid(data(r, 1), 2, pos - 2))
            If prefix = "VANBAN" Then
                vanban_ = True
            ElseIf prefix = "TENVB" Or prefix = "SOVB" Or prefix = "NGAYVB" Then
                If vanban_ Then
                    vanban_ = False
                    stt = stt + 1
                    danhmuc(stt + 1, 1) = stt
                End If
                If prefix = "TENVB" Then
                    danhmuc(stt + 1, 2) = data(r, lastCol)
                ElseIf prefix = "SOVB" Then
                    danhmuc(stt + 1, 3) = data(r, lastCol)
                Else
                    danhmuc(stt + 1, 4) = data(r, lastCol)
                End If
            End If
        End If
    Next r
    
    With sh
        .Name = sheetname
        With .Range("A1").Resize(stt + 1, UBound(danhmuc, 2))
            .Value = danhmuc
            .Columns.AutoFit
            .Resize(1).Font.Bold = True
        End With
    End With
    With wb
        .Save
        .Close
    End With
'    ---------- Tao sheet trong tap tin Danh Muc.xlsx - ket thuc ------------
'    ---------- Tao tap tin Word - bat dau ---------------------------------
    With CreateObject("Scripting.FileSystemObject")
        If Not .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Set wordApp = CreateObject("Word.Application")
    Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\File_Mau.doc")
    Set wordSelection = wordApp.Selection
    With wordSelection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindContinue
    End With
    For r = 1 To UBound(data)
        With wordSelection.Find
            .text = data(r, 1)
            If Len(data(r, lastCol)) > 250 Then
                CopyTextToClipboard data(r, lastCol)
                .Replacement.text = "^c"
            Else
                .Replacement.text = data(r, lastCol)
            End If
            .Execute Replace:=wdReplaceAll
        End With
    Next r
    
    wordDoc.SaveAs ThisWorkbook.Path & "\" & filename & ".doc"
    If MsgBox("Co mo tap tin " & filename & ".doc khong?", vbYesNo) = vbYes Then
        wordApp.Visible = True
    Else
        wordDoc.Close
        wordApp.Quit
    End If
'    ---------- Tao tap tin Word - ket thuc --------------
End Sub

Private Sub CopyTextToClipboard(ByVal text As String)
    With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText text
        .PutInClipboard
    End With
End Sub

Cũng có thể dán thông qua ClipBoard cho mọi đoạn bất kể dài ngắn. Nếu bạn muốn thế thì thay đoạn
Mã:
If Len(data(r, lastCol)) > 250 Then
    CopyTextToClipboard data(r, lastCol)
    .Replacement.text = "^c"
Else
    .Replacement.text = data(r, lastCol)
End If

bằng
Mã:
    CopyTextToClipboard data(r, lastCol)
    .Replacement.text = "^c"
 
Upvote 0
Giải pháp là với các đoạn > 250 thì dán thông qua ClipBoard, còn lại dán trực tiếp.

Xóa toàn bộ code
Mã:
Sub createWordAndSheet(ByVal filename As String, ByVal rng As Range)
...
End Sub

Thêm code
Mã:
Sub createWordAndSheet(ByVal filename As String, ByVal rng As Range)
Const wdFindContinue = 1
Const wdReplaceAll = 2
Dim lastRow As Long, lastCol As Long, r As Long, pos As Long, stt As Long
Dim data(), danhmuc(), sheetname As String, prefix As String, vanban_ As Boolean
Dim wb As Workbook, sh As Worksheet, wordApp As Object, wordDoc As Object, wordSelection As Object
'    ---------- Tao sheet trong tap tin Danh Muc.xlsx - bat dau ------------
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\Danh Muc.xlsx")
    sheetname = filename
    On Error Resume Next
'    xoa noi dung sheet neu da ton tai
    Set sh = wb.Worksheets(sheetname)
    If Err.Number Then
        Set sh = wb.Worksheets.Add
        sh.Range("A1:E10000").ClearContents
    End If
    On Error GoTo 0
    data = rng.Value
    lastCol = UBound(data, 2)
    ReDim danhmuc(1 To UBound(data), 1 To 5)
'    Tieu de
    danhmuc(1, 1) = "Stt"
    danhmuc(1, 2) = "N" & ChrW(7897) & "i dung v" & ChrW(259) & "n b" & ChrW(7843) & "n"
    danhmuc(1, 3) = "S" & ChrW(7889) & " v" & ChrW(259) & "n b" & ChrW(7843) & "n"
    danhmuc(1, 4) = "Ng" & ChrW(224) & "y th" & ChrW(225) & "ng ban h" & ChrW(224) & "nh"
    danhmuc(1, 5) = "Ghi ch" & ChrW(250)
    For r = 1 To UBound(data)
        pos = InStr(1, data(r, 1), "_")
        If pos > 2 Then
            prefix = UCase(Mid(data(r, 1), 2, pos - 2))
            If prefix = "VANBAN" Then
                vanban_ = True
            ElseIf prefix = "TENVB" Or prefix = "SOVB" Or prefix = "NGAYVB" Then
                If vanban_ Then
                    vanban_ = False
                    stt = stt + 1
                    danhmuc(stt + 1, 1) = stt
                End If
                If prefix = "TENVB" Then
                    danhmuc(stt + 1, 2) = data(r, lastCol)
                ElseIf prefix = "SOVB" Then
                    danhmuc(stt + 1, 3) = data(r, lastCol)
                Else
                    danhmuc(stt + 1, 4) = data(r, lastCol)
                End If
            End If
        End If
    Next r
   
    With sh
        .Name = sheetname
        With .Range("A1").Resize(stt + 1, UBound(danhmuc, 2))
            .Value = danhmuc
            .Columns.AutoFit
            .Resize(1).Font.Bold = True
        End With
    End With
    With wb
        .Save
        .Close
    End With
'    ---------- Tao sheet trong tap tin Danh Muc.xlsx - ket thuc ------------
'    ---------- Tao tap tin Word - bat dau ---------------------------------
    With CreateObject("Scripting.FileSystemObject")
        If Not .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Set wordApp = CreateObject("Word.Application")
    Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\File_Mau.doc")
    Set wordSelection = wordApp.Selection
    With wordSelection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindContinue
    End With
    For r = 1 To UBound(data)
        With wordSelection.Find
            .text = data(r, 1)
            If Len(data(r, lastCol)) > 250 Then
                CopyTextToClipboard data(r, lastCol)
                .Replacement.text = "^c"
            Else
                .Replacement.text = data(r, lastCol)
            End If
            .Execute Replace:=wdReplaceAll
        End With
    Next r
   
    wordDoc.SaveAs ThisWorkbook.Path & "\" & filename & ".doc"
    If MsgBox("Co mo tap tin " & filename & ".doc khong?", vbYesNo) = vbYes Then
        wordApp.Visible = True
    Else
        wordDoc.Close
        wordApp.Quit
    End If
'    ---------- Tao tap tin Word - ket thuc --------------
End Sub

Private Sub CopyTextToClipboard(ByVal text As String)
    With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText text
        .PutInClipboard
    End With
End Sub

Cũng có thể dán thông qua ClipBoard cho mọi đoạn bất kể dài ngắn. Nếu bạn muốn thế thì thay đoạn
Mã:
If Len(data(r, lastCol)) > 250 Then
    CopyTextToClipboard data(r, lastCol)
    .Replacement.text = "^c"
Else
    .Replacement.text = data(r, lastCol)
End If

bằng
Mã:
    CopyTextToClipboard data(r, lastCol)
    .Replacement.text = "^c"
Vâng, em cám ơn thầy nhiều.
Chúc Thầy ngày mới vui vẻ!
 
Upvote 0
Giải pháp là với các đoạn > 250 thì dán thông qua ClipBoard, còn lại dán trực tiếp.

Xóa toàn bộ code
Mã:
Sub createWordAndSheet(ByVal filename As String, ByVal rng As Range)
...
End Sub

Thêm code
Mã:
Sub createWordAndSheet(ByVal filename As String, ByVal rng As Range)
Const wdFindContinue = 1
Const wdReplaceAll = 2
Dim lastRow As Long, lastCol As Long, r As Long, pos As Long, stt As Long
Dim data(), danhmuc(), sheetname As String, prefix As String, vanban_ As Boolean
Dim wb As Workbook, sh As Worksheet, wordApp As Object, wordDoc As Object, wordSelection As Object
'    ---------- Tao sheet trong tap tin Danh Muc.xlsx - bat dau ------------
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\Danh Muc.xlsx")
    sheetname = filename
    On Error Resume Next
'    xoa noi dung sheet neu da ton tai
    Set sh = wb.Worksheets(sheetname)
    If Err.Number Then
        Set sh = wb.Worksheets.Add
        sh.Range("A1:E10000").ClearContents
    End If
    On Error GoTo 0
    data = rng.Value
    lastCol = UBound(data, 2)
    ReDim danhmuc(1 To UBound(data), 1 To 5)
'    Tieu de
    danhmuc(1, 1) = "Stt"
    danhmuc(1, 2) = "N" & ChrW(7897) & "i dung v" & ChrW(259) & "n b" & ChrW(7843) & "n"
    danhmuc(1, 3) = "S" & ChrW(7889) & " v" & ChrW(259) & "n b" & ChrW(7843) & "n"
    danhmuc(1, 4) = "Ng" & ChrW(224) & "y th" & ChrW(225) & "ng ban h" & ChrW(224) & "nh"
    danhmuc(1, 5) = "Ghi ch" & ChrW(250)
    For r = 1 To UBound(data)
        pos = InStr(1, data(r, 1), "_")
        If pos > 2 Then
            prefix = UCase(Mid(data(r, 1), 2, pos - 2))
            If prefix = "VANBAN" Then
                vanban_ = True
            ElseIf prefix = "TENVB" Or prefix = "SOVB" Or prefix = "NGAYVB" Then
                If vanban_ Then
                    vanban_ = False
                    stt = stt + 1
                    danhmuc(stt + 1, 1) = stt
                End If
                If prefix = "TENVB" Then
                    danhmuc(stt + 1, 2) = data(r, lastCol)
                ElseIf prefix = "SOVB" Then
                    danhmuc(stt + 1, 3) = data(r, lastCol)
                Else
                    danhmuc(stt + 1, 4) = data(r, lastCol)
                End If
            End If
        End If
    Next r
  
    With sh
        .Name = sheetname
        With .Range("A1").Resize(stt + 1, UBound(danhmuc, 2))
            .Value = danhmuc
            .Columns.AutoFit
            .Resize(1).Font.Bold = True
        End With
    End With
    With wb
        .Save
        .Close
    End With
'    ---------- Tao sheet trong tap tin Danh Muc.xlsx - ket thuc ------------
'    ---------- Tao tap tin Word - bat dau ---------------------------------
    With CreateObject("Scripting.FileSystemObject")
        If Not .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Set wordApp = CreateObject("Word.Application")
    Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\File_Mau.doc")
    Set wordSelection = wordApp.Selection
    With wordSelection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindContinue
    End With
    For r = 1 To UBound(data)
        With wordSelection.Find
            .text = data(r, 1)
            If Len(data(r, lastCol)) > 250 Then
                CopyTextToClipboard data(r, lastCol)
                .Replacement.text = "^c"
            Else
                .Replacement.text = data(r, lastCol)
            End If
            .Execute Replace:=wdReplaceAll
        End With
    Next r
  
    wordDoc.SaveAs ThisWorkbook.Path & "\" & filename & ".doc"
    If MsgBox("Co mo tap tin " & filename & ".doc khong?", vbYesNo) = vbYes Then
        wordApp.Visible = True
    Else
        wordDoc.Close
        wordApp.Quit
    End If
'    ---------- Tao tap tin Word - ket thuc --------------
End Sub

Private Sub CopyTextToClipboard(ByVal text As String)
    With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText text
        .PutInClipboard
    End With
End Sub

Cũng có thể dán thông qua ClipBoard cho mọi đoạn bất kể dài ngắn. Nếu bạn muốn thế thì thay đoạn
Mã:
If Len(data(r, lastCol)) > 250 Then
    CopyTextToClipboard data(r, lastCol)
    .Replacement.text = "^c"
Else
    .Replacement.text = data(r, lastCol)
End If

bằng
Mã:
    CopyTextToClipboard data(r, lastCol)
    .Replacement.text = "^c"
Xin chào anh batman1.
Em có vấn đề sau nhờ anh giúp trong chủ đề này:

Khi xuất ra file excek "Danh Muc"Có thể tạo một đường link hay bằng cách nào đấy để mở đến nhanh trang văn bản word có chủ đề tương ứng với nội dung văn bản trong sheet "Danh Muc" không vậy anh?

Giup.pngn1.pngn2.png
 

File đính kèm

  • File.rar
    65.3 KB · Đọc: 2
Upvote 0
Bạn xem và kiểm tra tập tin đính kèm.

Lưu ý:
1. Về các mã có tiền tố tenvb_, sovb_ và ngayvb_
Tôi không biết đặc thù các văn bản trong File_Mau của bạn như thế nào nhưng tôi nghĩ là chỉ tenvb_ là luôn có trong mỗi văn bản. Có thể ai đó có File_Mau với cấu trúc hơi khác và rất có thể tất cả hoặc một số văn bản trong File_Mau không có sovb_ và/hoặc ngayvb_. Và tôi không biết bạn có thế nào nhưng ai đó có thể có 3 mã kia với thứ tự bất kỳ. Trong File_Mau có thể do đặc thù văn bản mà tenvb_ xuất hiện trước sovb_ nhưng ở văn bản khác thì ngược lại. Do tôi viết không chỉ cho mình bạn, vì viết cho 1 người hơi phí công, nên tôi giả thiết là 3 mã kia không bắt buộc có đồng thời trong mỗi văn bản, và chúng có thể ở thứ tự bất kỳ.
Nhưng với giả thiết như thế thì phát sinh vấn đề "không xác định". Chẳng hạn có:
[tenvb_TÊN BIÊN BẢN]
[sovb_số bb]
[ngayvb_ngày, tháng, năm]
[tenvb_BIÊN BẢN XỬ PHẠT]


Thì không biết được [sovb_số bb] và [ngayvb_ngày, tháng, năm] thuộc văn bản 1 hay thuộc văn bản 2.

Yêu cầu: Ở đầu mỗi văn bản phải có mã [vanban_***]. *** là số hoặc chuỗi bất kỳ nhưng phải thỏa điều kiện là mỗi mã như thế chỉ xuất hiện trong 1 văn bản. Tức trong văn bản 1 có thể là [VANBAN_12] (không phân biệt hoa thường), trong văn bản 2 lại là [VANBAN_hichic], nhưng [VANBAN_12] không thể xuất hiện trong văn bản 2 (không chỉ ở đầu mà còn ở chỗ bất kỳ), còn [VANBAN_hichic] không thể xuất hiện ở văn bản 1. Chúng phải duy nhất cho mỗi văn bản.

Tất nhiên [VanBan_***] chỉ xuất hiện ở File_MAU và trong sheet Data dòng ứng với mỗi mã đó là rỗng. Khi tạo tập tin Word có tên ở B2 thì những mã đó sẽ được thay bằng chuỗi rỗng - tức bị xóa đi.

Tóm lại trước khi chạy code thì sửa tập tin File_Mau và thêm [Vanban_***] vào trước tất cả các mã trong mỗi văn bản có trong tập tin File_Mau.

2. Mỗi mã trong phạm vi 1 văn bản có thể lặp lại nhiều lần, nhưng một mã không được phép xuất hiện ở >= 2 văn bản.

3. Toàn bộ code của tôi có trong Module2 và sheet "Trang Chu".

4. Khi TrangChu!B2 thay đổi thì code gọi Sub createWordAndSheet để tạo sheet trong tập tin "Danh Muc.xlsx", sau đó tạo tập tin Word.

5. Code tạo sheet với tên tiếng Việt nếu B2 là tiếng Việt. Nếu bạn muốn tên không dấu thì tự tìm hàm chuyển chuỗi có dấu thành không dấu. Bạn có thể tìm trên GPE - tôi không tìm hộ bạn. Hàm nhận 1 tham số là chuỗi có dấu hoặc không và trả về kết quả là chuỗi không dấu. Giả sử hàm đó tên là khongdau thì trong Sub createWordAndSheet bạn hãy thay (chỉ có 1)
Mã:
sheetname = filename
thành
Mã:
sheetname = khongdau(filename)

Các lưu ý bạn nên ghi vào sheet Trang Chu để khỏi quên.
Em chào Thầy, thầy khỏe chứ ạ!
Em xin thầy ít phút.
Khi TrangChu!B2 thay đổi thì code gọi Sub createWordAndSheet để tạo sheet trong tập tin "Danh Muc.xlsx" nhưng không thể lấy được từ khóa ở biên bản thứ 2 có tên [vanban_2][tenvb_lenhkhoicong] từ file word có tên là "File_Mau" sang file excel có tên "Word_excel"
Nếu chạy trực tiếp macro có tên ReadKeysFromWord trong file excel có tên "Word_excel" thì sẽ lấy được các [key] từ file word sang file excel nhưng các từ điền sẵn tương ứng với các [key] cũ sẽ bị mất hết và phải điền lại từ đầu thầy ạ!
Thầy xem giúp em mới ạ! có cách nào để không bị mất [key] cũ đã điền mà vẫn lấy được [key] mới sang không vậy thầy?
Em cám ơn thầy!

 

File đính kèm

  • File thuc hanh.rar
    76.5 KB · Đọc: 6
Upvote 0
Khi TrangChu!B2 thay đổi thì code gọi Sub createWordAndSheet để tạo sheet trong tập tin "Danh Muc.xlsx" nhưng không thể lấy được từ khóa ở biên bản thứ 2 có tên [vanban_2][tenvb_lenhkhoicong] từ file word có tên là "File_Mau" sang file excel có tên "Word_excel"
Nếu chạy trực tiếp macro có tên ReadKeysFromWord trong file excel có tên "Word_excel" thì sẽ lấy được các [key] từ file word sang file excel nhưng các từ điền sẵn tương ứng với các [key] cũ sẽ bị mất hết và phải điền lại từ đầu thầy ạ!
Thầy xem giúp em mới ạ! có cách nào để không bị mất [key] cũ đã điền mà vẫn lấy được [key] mới sang không vậy thầy?
Nói thẳng ra là tôi không mở tập tin Excel.
Tôi mở tập tin Word và cuộn xem 2 văn bản. Xong tôi đóng và không xem gì nữa. Vì tôi biết là tuy chưa chạy Excel và chưa biết sẽ lấy được và không lấy được gì, thì tôi vẫn biết một điều chắc chắn là tập tin Word không đúng với những lưu ý của tôi.

Bạn ngồi ở GPE đã lâu. Chắc bạn để ý thấy tôi là người duy nhất hướng dẫn rất tỉ mỉ. Ngoài code ra thì nếu cần lưu ý gì thì tôi viết rất chi tiết, rất rõ. Tôi chưa thấy ai tỉ mỉ và chi tiết như tôi. Phần lớn chỉ đưa code, không giải thích kỹ như tôi.

Nhưng tôi mất rất nhiều công sức, thời gian để viết mà người khác không đọc. Tôi mất thời gian công sức chứ không phải người khác nên người ta không tiếc cái thời gian công sức ấy.

Có những cái tôi lưu ý tới 3 lần ở các bài #36, #39, #41 nhưng bạn không đọc kỹ hoặc không ghi vào sổ tay nên sau một thời gian thì quên. Chưa biết bạn sai tới mức nào nhưng có 1 cái tôi nhắc 3 lần trong 3 bài kia mà bây giờ nhìn vào tập tin Word thì thấy bạn không làm đúng. Có ít nhất một lưu ý nữa tôi viết rất rõ nhưng bạn cũng không làm đúng.

Hãy làm đúng với các lưu ý của tôi. Nếu làm đúng với các lưu ý mà code chưa chuẩn thì tôi sẽ sửa.

Góp ý về ghi video. Nếu ghi thì nên cho người khác cơ hội nhìn xem mình thao tác thế nào. Vd. khi click và danh sách thả hiện ra thì dừng một chút cho người ta nhìn thấy danh sách có những gì. Khi định chọn mục trong danh sách thì đưa chuột tới mục đó rồi dừng chút để người ta biết mình chọn mục nào. Đưa chuột vụt tới mục rồi click luôn thì ai kịp phát hiện mình chọn mục nào?
 
Upvote 0
Nói thẳng ra là tôi không mở tập tin Excel.
Tôi mở tập tin Word và cuộn xem 2 văn bản. Xong tôi đóng và không xem gì nữa. Vì tôi biết là tuy chưa chạy Excel và chưa biết sẽ lấy được và không lấy được gì, thì tôi vẫn biết một điều chắc chắn là tập tin Word không đúng với những lưu ý của tôi.

Bạn ngồi ở GPE đã lâu. Chắc bạn để ý thấy tôi là người duy nhất hướng dẫn rất tỉ mỉ. Ngoài code ra thì nếu cần lưu ý gì thì tôi viết rất chi tiết, rất rõ. Tôi chưa thấy ai tỉ mỉ và chi tiết như tôi. Phần lớn chỉ đưa code, không giải thích kỹ như tôi.

Nhưng tôi mất rất nhiều công sức, thời gian để viết mà người khác không đọc. Tôi mất thời gian công sức chứ không phải người khác nên người ta không tiếc cái thời gian công sức ấy.

Có những cái tôi lưu ý tới 3 lần ở các bài #36, #39, #41 nhưng bạn không đọc kỹ hoặc không ghi vào sổ tay nên sau một thời gian thì quên. Chưa biết bạn sai tới mức nào nhưng có 1 cái tôi nhắc 3 lần trong 3 bài kia mà bây giờ nhìn vào tập tin Word thì thấy bạn không làm đúng. Có ít nhất một lưu ý nữa tôi viết rất rõ nhưng bạn cũng không làm đúng.

Hãy làm đúng với các lưu ý của tôi. Nếu làm đúng với các lưu ý mà code chưa chuẩn thì tôi sẽ sửa.

Góp ý về ghi video. Nếu ghi thì nên cho người khác cơ hội nhìn xem mình thao tác thế nào. Vd. khi click và danh sách thả hiện ra thì dừng một chút cho người ta nhìn thấy danh sách có những gì. Khi định chọn mục trong danh sách thì đưa chuột tới mục đó rồi dừng chút để người ta biết mình chọn mục nào. Đưa chuột vụt tới mục rồi click luôn thì ai kịp phát hiện mình chọn mục nào?
Vâng ạ! file em đăng lên thì cấu trúc biên bản ở 2 biên bản khác nhau, ở biên bản thứ nhất thì đã được như ý nhưng sang biên bản thứ 2 thì [tenvb_****] không nằm ở đầu dòng mà nằm ở dòng thứ 3 nên đã có sự thay đổi.
Thầy có nói "Cái [VANBAN_***] chỉ thêm 1 lần cho mỗi văn bản và thêm 1 lần ở ĐẦU văn bản."
Nhưng trong văn bản thứ 2 thì cấu trúc khác văn bản thứ nhất, em không hình dung ra vị trí "đầu văn bản" ở chỗ nào?
Em đã thêm [vanban_2] vào văn bản thứ 2 ở vị trí như 2 hình dưới em đăng nhưng đầu không được
Em có tải file word lên, ở văn bản thứ 2 thầy xem giúp em được không ạ?

1111.png333333.png
 

File đính kèm

  • File_Mau.doc
    78 KB · Đọc: 4
Lần chỉnh sửa cuối:
Upvote 0
Vâng ạ! file em đăng lên thì cấu trúc biên bản ở 2 biên bản khác nhau, ở biên bản thứ nhất thì đã được như ý nhưng sang biên bản thứ 2 thì [tenvb_****] không nằm ở đầu dòng mà nằm ở dòng thứ 3 nên đã có sự thay đổi.
Trích bài #36
Yêu cầu: Ở đầu mỗi văn bản phải có mã [vanban_***]. *** là số hoặc chuỗi bất kỳ nhưng phải thỏa điều kiện là mỗi mã như thế chỉ xuất hiện trong 1 văn bản. Tức trong văn bản 1 có thể là [VANBAN_12] (không phân biệt hoa thường), trong văn bản 2 lại là [VANBAN_hichic], nhưng [VANBAN_12] không thể xuất hiện trong văn bản 2 (không chỉ ở đầu mà còn ở chỗ bất kỳ), còn [VANBAN_hichic] không thể xuất hiện ở văn bản 1. Chúng phải duy nhất cho mỗi văn bản.

Tất nhiên [VanBan_***] chỉ xuất hiện ở File_MAU và trong sheet Data dòng ứng với mỗi mã đó là rỗng. Khi tạo tập tin Word có tên ở B2 thì những mã đó sẽ được thay bằng chuỗi rỗng - tức bị xóa đi.

Tóm lại trước khi chạy code thì sửa tập tin File_Mau và thêm [Vanban_***] vào trước tất cả các mã trong mỗi văn bản có trong tập tin File_Mau.
- ở "đầu văn bản" với hàm ý là [vanban_***] là key đầu tiên trong văn bản.
- mỗi văn bản phải có key [vanban_***]. Mỗi key như thế phải là duy nhất trong toàn bộ tập tin Word, tức chỉ xuất hiện 1 lần trong toàn bộ Word. Và xuất hiện sau tất cả các key của văn bản trước, đồng thời trước tất cả các key của văn bản hiện hành. Vì thế tôi dùng từ "đầu văn bản" (hiện hành).

Trong tập tin Word ở bài trước key [vanban_2] nằm sau 4 key [chủ đầu tư_vh], [sovb_lenhkhoicong], [địa danh], [ngayvb_lenhkhoicong] của văn bản hiện hành. Phải di chuyển [vanban_2] sao cho nó nằm ở đâu cũng cũng được - đầu, giữa, gần cuối văn bản hiện hành, miễn sao nó nằm trước key đầu tiên của văn bản. Trong trường hợp này phải nằm trước key [chủ đầu tư_vh]. Thế thôi.

Tôi còn viết
Có ít nhất một lưu ý nữa tôi viết rất rõ nhưng bạn cũng không làm đúng.

Trích bài #36
2. Mỗi mã trong phạm vi 1 văn bản có thể lặp lại nhiều lần, nhưng một mã không được phép xuất hiện ở >= 2 văn bản.

Tập tin Word trước không thỏa mãn lưu ý này. Những key sau xuất hiện ở cả 2 văn bản:
[công trình]
[địa điểm]
[tên hợp đồng]
[số hợp đồng]
[ngày ký hợp đồng]
[nhà thầu thi công]
[chủ đầu tư]

Tóm lại yêu cầu là:
1. Trong mỗi văn bản phải có 1 key [vanban_***]. Key đó phải là duy nhất trong toàn bộ Word. Tức chỉ xuất hiện 1 lần. Và key đó phải đứng trước tất cả các key khác của văn bản hiện hành.

2. Tất cả các key, ngoại trừ key [vanban_***], có thể xuất hiện nhiều lần trong phạm vi một văn bản, nhưng không được phép xuất hiện ở những văn bản khác. Vd. key [công trình] có thể xuất hiện nhiều lần trong văn bản 1, nhưng key [công trình] này không được phép xuất hiện ở văn bản 2, văn bản 3, ... Ở văn bản 2, 3, ... chỉ có thể xuất hiện các key vd. [công trình2], [công trình3], ... hoặc [công trình - ngày mai em đi], [công trình - biển nhớ tên em gọi về], ...
Tên key thế nào cũng được miễn không lặp lại ở những văn bản khác.

3. Nếu xuất hiện tên, số, ngày thì key phải là [tenvb_***], [ngayvb_***] và [sovb_***]. Tất nhiên 3 key này cũng phải thỏa điều kiện 2.

Những điều kiện trên tôi viết lại lần thứ 4. Tôi sẽ không bao giờ liệt kê lại nữa. Tôi đã viết ở bài #36
Các lưu ý bạn nên ghi vào sheet Trang Chu để khỏi quên.
Nhưng bây giờ thì tôi thấy bạn không làm như thế. Tùy bạn thôi, nhưng tôi sẽ không nhắc lại nữa.
 
Upvote 0
Trích bài #36

- ở "đầu văn bản" với hàm ý là [vanban_***] là key đầu tiên trong văn bản.
- mỗi văn bản phải có key [vanban_***]. Mỗi key như thế phải là duy nhất trong toàn bộ tập tin Word, tức chỉ xuất hiện 1 lần trong toàn bộ Word. Và xuất hiện sau tất cả các key của văn bản trước, đồng thời trước tất cả các key của văn bản hiện hành. Vì thế tôi dùng từ "đầu văn bản" (hiện hành).

Trong tập tin Word ở bài trước key [vanban_2] nằm sau 4 key [chủ đầu tư_vh], [sovb_lenhkhoicong], [địa danh], [ngayvb_lenhkhoicong] của văn bản hiện hành. Phải di chuyển [vanban_2] sao cho nó nằm ở đâu cũng cũng được - đầu, giữa, gần cuối văn bản hiện hành, miễn sao nó nằm trước key đầu tiên của văn bản. Trong trường hợp này phải nằm trước key [chủ đầu tư_vh]. Thế thôi.

Tôi còn viết


Trích bài #36


Tập tin Word trước không thỏa mãn lưu ý này. Những key sau xuất hiện ở cả 2 văn bản:
[công trình]
[địa điểm]
[tên hợp đồng]
[số hợp đồng]
[ngày ký hợp đồng]
[nhà thầu thi công]
[chủ đầu tư]

Tóm lại yêu cầu là:
1. Trong mỗi văn bản phải có 1 key [vanban_***]. Key đó phải là duy nhất trong toàn bộ Word. Tức chỉ xuất hiện 1 lần. Và key đó phải đứng trước tất cả các key khác của văn bản hiện hành.

2. Tất cả các key, ngoại trừ key [vanban_***], có thể xuất hiện nhiều lần trong phạm vi một văn bản, nhưng không được phép xuất hiện ở những văn bản khác. Vd. key [công trình] có thể xuất hiện nhiều lần trong văn bản 1, nhưng key [công trình] này không được phép xuất hiện ở văn bản 2, văn bản 3, ... Ở văn bản 2, 3, ... chỉ có thể xuất hiện các key vd. [công trình2], [công trình3], ... hoặc [công trình - ngày mai em đi], [công trình - biển nhớ tên em gọi về], ...
Tên key thế nào cũng được miễn không lặp lại ở những văn bản khác.

3. Nếu xuất hiện tên, số, ngày thì key phải là [tenvb_***], [ngayvb_***] và [sovb_***]. Tất nhiên 3 key này cũng phải thỏa điều kiện 2.

Những điều kiện trên tôi viết lại lần thứ 4. Tôi sẽ không bao giờ liệt kê lại nữa. Tôi đã viết ở bài #36

Nhưng bây giờ thì tôi thấy bạn không làm như thế. Tùy bạn thôi, nhưng tôi sẽ không nhắc lại nữa.
Vâng em đã hiểu, vậy tên [công trình] chỉ dùng cho một văn bản sang văn bản khác phải là [công trình 2] [công trình .....] .....miễn là nó khác với [công trình] trong văn bản 1.
Như vậy em soạn một loại văn bản pháp lý dài gồm nhiều văn bản thì cũng không thể làm được đứng không thầy, vì các dữ liệu trùng nhau kiểu [công trình] đó chỉ cho được 1 văn bản mà không được sang văn bản khác.
Có cách nào để một các dữ liệu trùng nhau trừ các key [vanban_***]; [teenvb_***]; [sovb_****]; [ngayvb_****] có thể điền được sang văn bản thứ 2 hay thứ 3 nào đó không thầy.
Cùng một [công trình] mà mỗi một văn bản là một key [công trình ....] trong khi đó tên công trình chỉ là một.
Thầy cho em hướng ạ!
Em cảm ơn thầy.
 
Upvote 0
Vâng em đã hiểu, vậy tên [công trình] chỉ dùng cho một văn bản sang văn bản khác phải là [công trình 2] [công trình .....] .....miễn là nó khác với [công trình] trong văn bản 1.
Như vậy em soạn một loại văn bản pháp lý dài gồm nhiều văn bản thì cũng không thể làm được đứng không thầy, vì các dữ liệu trùng nhau kiểu [công trình] đó chỉ cho được 1 văn bản mà không được sang văn bản khác.
Có cách nào để một các dữ liệu trùng nhau trừ các key [vanban_***]; [teenvb_***]; [sovb_****]; [ngayvb_****] có thể điền được sang văn bản thứ 2 hay thứ 3 nào đó không thầy.
Cùng một [công trình] mà mỗi một văn bản là một key [công trình ....] trong khi đó tên công trình chỉ là một.
Thầy cho em hướng ạ!
Em cảm ơn thầy.

Tại sao phải là [công trình] ở mọi văn bản? Tại sao không là [công trình 1], [công trình2], [công trình 3]? Nói cho cùng chúng chỉ là key, còn nội dung của chúng là do cột C cung cấp mà. Có chữ "công trình" chẳng qua để nhắc đó là công trình chứ không phải "địa điểm", "người môi giới", "cò", "người đưa phong bì". Thế thôi.

Trước khi đưa ra lời giải bao giờ tôi cũng thống nhất với người hỏi về các yêu cầu, điều kiện. Đồng ý thì tôi viết code cho yêu cầu và điều kiện đã thỏa thuận. Qua bao bài cuối cùng bạn đồng ý với các yêu cầu và điều kiện. Bây giờ bạn định thay đổi yêu cầu nào đó, bỏ điều kiện nào đó? Và tôi lại viết lại cho bạn? Nếu thế thì tôi mất công sức, thời gian để thỏa thuận với bạn làm gì?.

Nếu bạn thấy bất tiện thì hãy lập chủ đề mới hỏi mọi người.
 
Lần chỉnh sửa cuối:
Upvote 0
Tại sao phải là [công trình] ở mọi văn bản? Tại sao không là [công trình 1], [công trình2], [công trình 3]? Nói cho cùng chúng chỉ là key, còn nội dung của chúng là do cột C cung cấp mà. Có chữ "công trình" chẳng qua để nhắc đó là công trình chứ không phải "địa điểm", "người môi giới", "cò", "người đưa phong bì". Thế thôi.

Nếu bạn thấy bất tiện thì hãy lập chủ đề mới hỏi mọi người.
Vâng, ví dụ có 15 văn bản trong 15 văn bản đó có bình quân 10 dữ liệu trùng nhau ở mỗi văn bản vậy nếu các [key] khác nhau thì 150 [key] sẽ được điền sang File excel có tên "Word_excel" thì em thấy quản lý và điền dữ liệu hơi khó thầy ạ!
Nếu có thể tận dụng được dữ liệu trùng nhau từ văn bản này sang văn bản khác thì sẽ tốt hơn ạ!
Khi em chạy maccro "ReadKeysFromWord" vẫn lấy [key] và sau đó chọn ô B2 để gọi code vẫn điền được [key] và tạo file word mới, nhưng có mỗi một cái là những dữ liệu cũ bị xóa hết phải điền lại từ đầu và mỗi khi thêm văn bản nào đó thì đều phải chạy lại và điền lại code.
Em có ý kiến vậy!
Em cám ơn thầy!
 
Lần chỉnh sửa cuối:
Upvote 0
Ngay từ đầu vấn đề đặt ra đã không tốt lắm thì phải.
Cho mình hỏi, tại sao cái form văn bản nhất định phải là file word. Lý do là gì?
Giả thiết rằng, form được thiết kế trên excel và khi in ra cho chất lượng giống như word thì sao?

Lý do là: Code cho excel thì dễ hơn làm việc với word rất nhiều. Nếu đây là bài toán excel, việc giải sẽ không khó như word.
 
Upvote 0
Ngay từ đầu vấn đề đặt ra đã không tốt lắm thì phải.
Cho mình hỏi, tại sao cái form văn bản nhất định phải là file word. Lý do là gì?
Giả thiết rằng, form được thiết kế trên excel và khi in ra cho chất lượng giống như word thì sao?

Lý do là: Code cho excel thì dễ hơn làm việc với word rất nhiều. Nếu đây là bài toán excel, việc giải sẽ không khó như word.
Vâng,
Hãy lập chủ đề mới hỏi mọi người.
Vâng, em cám ơn thầy, hi chắc dừng topic này tại đây ạ!
 
Upvote 0
Vâng, ví dụ có 15 văn bản trong 15 văn bản đó có bình quân 10 dữ liệu trùng nhau ở mỗi văn bản vậy nếu các [key] khác nhau thì 150 [key] sẽ được điền sang File excel có tên "Word_excel" thì em thấy quản lý và điền dữ liệu hơi khó thầy ạ!
Nếu có thể tận dụng được dữ liệu trùng nhau từ văn bản này sang văn bản khác thì sẽ tốt hơn ạ!
Khi em chạy maccro "ReadKeysFromWord" vẫn lấy [key] và sau đó chọn ô B2 để gọi code vẫn điền được [key] và tạo file word mới, nhưng có mỗi một cái là những dữ liệu cũ bị xóa hết phải điền lại từ đầu và mỗi khi thêm văn bản nào đó thì đều phải chạy lại và điền lại code.
Em có ý kiến vậy!
Em cám ơn thầy!
Cứ như bài 06 và bài 24 tui thấy ổn hơn, cái chính là tiện lợi còn xuất ra dang mục làm gì hả Cát Lượng và anh
batman1
ơi?
 
Upvote 0
Ngay từ đầu vấn đề đặt ra đã không tốt lắm thì phải.
Cho mình hỏi, tại sao cái form văn bản nhất định phải là file word. Lý do là gì?
Giả thiết rằng, form được thiết kế trên excel và khi in ra cho chất lượng giống như word thì sao?

Lý do là: Code cho excel thì dễ hơn làm việc với word rất nhiều. Nếu đây là bài toán excel, việc giải sẽ không khó như word.
Vì Word mạnh về văn bản, excel sao trình bày văn bản như word được bạn.
Bài đã được tự động gộp:

Cứ như bài 06 và bài 24 tui thấy ổn hơn, cái chính là tiện lợi còn xuất ra dang mục làm gì hả Cát Lượng và anh
batman1
ơi?
Vâng, cũng tương đối để làm được công việc. Giá mà [key] từ word sang excel được lấy theo thứ tự từu đầu đến cuối văn bản trong word thì cũng khá ổn.
Anh vc_đi chơi có để đến vấn đề đó không?
 
Upvote 0
Web KT
Back
Top Bottom