Code lấy từ khóa từ Word sang excel bị thiếu (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

vc_đi chơi

Thành viên thường trực
Tham gia
21/9/19
Bài viết
201
Được thích
41
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

Lần chỉnh sửa cuối:
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 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 (như hình tôi đăng)
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
3/ hình thứ 3: khi chạy code sẽ xuất 1 file word ứng với tên được điền trong sheet Trang chủ, các từ khóa bị thiếu chưa được lấy trong file xuất ra vẫn còn màu đỏ.
View attachment 225561View attachment 225562View attachment 225563
Bài đã được tự động gộp:

View attachment 225564

View attachment 225565

View attachment 225566
Góp ý:
bạn gửi hình thì anh chị diễn đàn chỉ nhìn thôi và chắc sẽ không ai hỗ trợ được khi bạn không có file mẫu đính kèm.
 
Upvote 0
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)

Trong Sub ChuongTrinh của bạn có gọi ImportWord và KeyDaTa. Tôi ngại đọc code của người khác nên không dò xem chúng có cần thiết hay không. Nếu chúng còn làm gì đó thì bạn tự thêm vào.

Code không kiểm tra mầu đỏ hay mầu gì. Code coi các KEY có dạng [gì đó]

Sub ChuongTrinh của tôi chỉ làm một việc là lấy các KEY từ Word vào cột B của sheet Data.

Mảng Arr tôi khai báo cho max là 10 000 key
Mã:
Sub ChuongTrinh()
Dim Arr(), count As Long, text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, fso As Object
    Application.ScreenUpdating = False
    '''''Kiem tra su ton tai cua File_Mau. Neu khong thay thi Msgbox thong bao va thoat khoi chuong trinh
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Sheets("DaTa").Range("B3:B10000").ClearContents
    ReDim Arr(1 To 10000, 1 To 1)
    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
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            count = count + 1
            Arr(count, 1) = Mid(wordSelection.text, 2, Len(wordSelection.text) - 2)
        Loop
    End With
    If count Then ThisWorkbook.Worksheets("Data").Range("B3").Resize(count).Value = Arr
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub
 
Upvote 0
Trong Sub ChuongTrinh của bạn có gọi ImportWord và KeyDaTa. Tôi ngại đọc code của người khác nên không dò xem chúng có cần thiết hay không. Nếu chúng còn làm gì đó thì bạn tự thêm vào.

Code không kiểm tra mầu đỏ hay mầu gì. Code coi các KEY có dạng [gì đó]

Sub ChuongTrinh của tôi chỉ làm một việc là lấy các KEY từ Word vào cột B của sheet Data.

Mảng Arr tôi khai báo cho max là 10 000 key
Mã:
Sub ChuongTrinh()
Dim Arr(), count As Long, text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, fso As Object
    Application.ScreenUpdating = False
    '''''Kiem tra su ton tai cua File_Mau. Neu khong thay thi Msgbox thong bao va thoat khoi chuong trinh
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Sheets("DaTa").Range("B3:B10000").ClearContents
    ReDim Arr(1 To 10000, 1 To 1)
    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
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            count = count + 1
            Arr(count, 1) = Mid(wordSelection.text, 2, Len(wordSelection.text) - 2)
        Loop
    End With
    If count Then ThisWorkbook.Worksheets("Data").Range("B3").Resize(count).Value = Arr
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub
Vâng, em cám ơn anh!
Anh ơi còn vấn đề này xin anh giúp em thêm chút để hoàn thiện anh ạ!
File này em cũng tham khảo trên GPE, mục đích để soạn thảo văn bản word từ excel.
Anh giúp em code trên, em có ý ghép vào code cũ để sử dụng nhưng lại bị lỗi:
Em lấy key xong rồi, và nhấn tổ hợp phím (Ctrl + shift + w) để chạy code cũ thì sẽ xuất hiện văn bản mới dạng file word có tên ứng với tên được điền vào ô B2 của sheet (Trang chu) trong file excel nhưng file word mới được soạn thảo lấy từ khóa từ excel lại báo lỗi (như hình đính kèm)
Em chưa biết về code, em nhờ anh giúp em thêm vấn đề sau (em không sử dụng code cũ nữa) để hoàn thiện chủ đề này được không ạ?
Nội dung nhờ anh giúp để hoàn thiện:

1/ Khi lấy từ khóa từ file word có tên (File_Mau) để điền vào cột B trong sheet"Data" của file excel thì những từ khóa bị trùng sẽ không điền lặp lại tính theo thứ tự từ đầu đến cuối trang word.
2/ Từ khóa được lấy anh giúp em thêm cả ký hiệu ngoặc " [......]", định dạng từ khóa ở word thế nào khi được lấy ra excel cũng tương tự vậy (cỡ chữ, kiểu chữ, fonr chữ...), ký tự từ khóa được lấy có thể lớn hơn 255 ký tự được không vậy anh?
3/
Anh cho em xin thêm code mới để sau khi lấy từ khóa sang file excel và chạy code đó sẽ xuất ra một file word mới có tên được điền theo tên ở ô B2 của sheet "Trang Chu" ( tên được chọn ở ô B2 của sheet "Trang Chu" là "Drop List" tương ứng với các tên được lấy theo tên ở các ô C2, D2, E2, F2........của sheet "Data"). Nội dung của file word mới này có nội dung tương tự file word (File_Mau) và các từ khóa trong File_Mau sẽ được thay thế bởi các từ tương ứng trong ô của các cột C, D, E, F.......thuộc sheet "Data" của file excel.
Mỗi lần điền tên khác nhau ở ô B2 của sheet "Trang Chu" và chạy code sẽ xuất ra một file word có tên là tên đã được chọn, và file word mới nằm luôn trong foder đó.

Anh giúp em mới nhé! sẽ rất cần để soạn thảo văn bản word từ excel.
Cám ơn anh nhiều!
File đính kèm bài #1
 

File đính kèm

  • kkkkkkk.png
    kkkkkkk.png
    26.8 KB · Đọc: 18
Lần chỉnh sửa cuối:
Upvote 0
1/ Khi lấy từ khóa từ file word có tên (File_Mau) để điền vào cột B trong sheet"Data" của file excel thì những từ khóa bị trùng sẽ không điền lặp lại tính theo thứ tự từ đầu đến cuối trang word.
2/ Từ khóa được lấy anh giúp em thêm cả ký hiệu ngoặc " [......]", định dạng từ khóa ở word thế nào khi được lấy ra excel cũng tương tự vậy (cỡ chữ, kiểu chữ, fonr chữ...), ký tự từ khóa được lấy có thể lớn hơn 255 ký tự được không vậy anh?
Bạn có 2 lựa chọn: hoặc nhờ tác giả code của bạn giúp hoặc nhờ tôi. Nếu nhờ tôi thì tôi đập đi xây mới. Tức bạn phải:
1. Mô tả các việc cần làm. Tôi không dò, không nghiên cứu code của người khác để đoán ý bạn.
2. Ý thức được là code của tôi có thể sẽ xung đột với code hiện có của người khác. Bạn có 2 lựa chọn: hoặc xóa hết các code cũ hoặc tự thích ứng chúng với code mới của tôi.

Trước khi làm thì vào Name Manager và xóa hết tất cả những name DMDA - hiện bạn có 2 DMDA. Một rừng name khác có lỗi nhưng tôi không quan tâm. Tự bạn phải vệ sinh gọn gàng tập tin của mình.

Các Key trong Data!B chỉ là chữ không có định dạng gì cả vì chả để làm gì. Phông chữ thì do bạn chọn thôi.

Dòng 2 trong Data phải định dạng là General.

Sub ChuongTrinh sẽ lấy các Key từ Word vào Data!B. Khi Trang Chu Activate code tạo name mới DMDA thích hợp với nội dung hiện hành tại dòng 2 trong Data. Khi chọn B2 ở Trang Chu thì code sẽ thay thế các Key ở Data!B bằng các tên ở cột tương ứng với B2 được chọn và tạo tập tin có tên là B2.

Toàn bộ code của tôi như sau:
Trong Module
Mã:
Sub ChuongTrinh()
Dim Arr(), count As Long, text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, dic As Object
    Application.ScreenUpdating = False
    '''''Kiem tra su ton tai cua File_Mau. Neu khong thay thi Msgbox thong bao va thoat khoi chuong trinh
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Sheets("DaTa").Range("B3:B10000").ClearContents
    ReDim Arr(1 To 10000, 1 To 1)
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
    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
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            If Not dic.exists(wordSelection.text) Then
                dic.Add wordSelection.text, ""
                count = count + 1
                Arr(count, 1) = wordSelection.text
            End If
        Loop
    End With
    If count Then ThisWorkbook.Worksheets("Data").Range("B3").Resize(count).Value = Arr
    Set dic = Nothing
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub

Sub createWord(ByVal filename As String, ByVal rng As Range)
Const wdFindContinue = 1
Const wdReplaceAll = 2
Dim lastCol As Long, k As Long, data(), wordApp As Object, wordDoc As Object, wordSelection As Object
    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
    data = rng.Value
    lastCol = UBound(data, 2)
    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 k = 1 To UBound(data)
        With wordSelection.Find
            .text = data(k, 1)
            .Replacement.text = data(k, lastCol)
            .Execute Replace:=wdReplaceAll
        End With
    Next k
   
    wordDoc.SaveAs ThisWorkbook.Path & "\" & filename & ".doc"
    wordDoc.Close
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
   
    MsgBox "Da tao tap tin " & filename & ".doc"
End Sub

Trong sheet Trang Chu
Mã:
Private Sub Worksheet_Activate()
Dim lastCol As Long
    With ThisWorkbook.Worksheets("Data")
        lastCol = .Cells(2, Columns.count).End(xlToLeft).Column
        If lastCol >= 3 Then
            On Error Resume Next
            ActiveWorkbook.Names("DMDA").Delete
            ActiveWorkbook.Names.Add "DMDA", "=Data!" & .Range("C2").Resize(1, lastCol - 2).Address
            With Me.Range("B2").Validation
                .Delete
                .Add Type:=xlValidateList, Formula1:="=DMDA"
                .InCellDropdown = True
            End With
            On Error GoTo 0
        End If
    End With
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, [b2]) Is Nothing Then
        Cancel = True
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, rng As Range, sh As Worksheet, cell_ As Range
    If Target.Address <> "$B$2" Then Exit Sub
    Set sh = ThisWorkbook.Worksheets("Data")
    lastRow = sh.Cells(Rows.count, "B").End(xlUp).Row
    If lastRow < 3 Then Exit Sub
    Set rng = sh.Range("DMDA").Find(Me.Range("B2").Value, , xlValues, xlWhole)
    If rng Is Nothing Then Exit Sub
    With sh
        createWord Me.Range("B2").Value, .Range(.Range("B3"), .Cells(lastRow, rng.Column))
    End With
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$2" Then
        Application.SendKeys "%{Down}"
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có 2 lựa chọn: hoặc nhờ tác giả code của bạn giúp hoặc nhờ tôi. Nếu nhờ tôi thì tôi đập đi xây mới. Tức bạn phải:
1. Mô tả các việc cần làm. Tôi không dò, không nghiên cứu code của người khác để đoán ý bạn.
2. Ý thức được là code của tôi có thể sẽ xung đột với code hiện có của người khác. Bạn có 2 lựa chọn: hoặc xóa hết các code cũ hoặc tự thích ứng chúng với code mới của tôi.

Trước khi làm thì vào Name Manager và xóa hết tất cả những name DMDA - hiện bạn có 2 DMDA. Một rừng name khác có lỗi nhưng tôi không quan tâm. Tự bạn phải vệ sinh gọn gàng tập tin của mình.

Các Key trong Data!B chỉ là chữ không có định dạng gì cả vì chả để làm gì. Phông chữ thì do bạn chọn thôi.

Dòng 2 trong Data phải định dạng là General.

Sub ChuongTrinh sẽ lấy các Key từ Word vào Data!B. Khi Trang Chu Activate code tạo name mới DMDA thích hợp với nội dung hiện hành tại dòng 2 trong Data. Khi chọn B2 ở Trang Chu thì code sẽ thay thế các Key ở Data!B bằng các tên ở cột tương ứng với B2 được chọn và tạo tập tin có tên là B2.

Toàn bộ code của tôi như sau:
Trong Module
Mã:
Sub ChuongTrinh()
Dim Arr(), count As Long, text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, dic As Object
    Application.ScreenUpdating = False
    '''''Kiem tra su ton tai cua File_Mau. Neu khong thay thi Msgbox thong bao va thoat khoi chuong trinh
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Sheets("DaTa").Range("B3:B10000").ClearContents
    ReDim Arr(1 To 10000, 1 To 1)
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
    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
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            If Not dic.exists(wordSelection.text) Then
                dic.Add wordSelection.text, ""
                count = count + 1
                Arr(count, 1) = wordSelection.text
            End If
        Loop
    End With
    If count Then ThisWorkbook.Worksheets("Data").Range("B3").Resize(count).Value = Arr
    Set dic = Nothing
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub

Sub createWord(ByVal filename As String, ByVal rng As Range)
Const wdFindContinue = 1
Const wdReplaceAll = 2
Dim lastCol As Long, k As Long, data(), wordApp As Object, wordDoc As Object, wordSelection As Object
    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
    data = rng.Value
    lastCol = UBound(data, 2)
    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 k = 1 To UBound(data)
        With wordSelection.Find
            .text = data(k, 1)
            .Replacement.text = data(k, lastCol)
            .Execute Replace:=wdReplaceAll
        End With
    Next k
 
    wordDoc.SaveAs ThisWorkbook.Path & "\" & filename & ".doc"
    wordDoc.Close
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
 
    MsgBox "Da tao tap tin " & filename & ".doc"
End Sub

Trong sheet Trang Chu
Mã:
Private Sub Worksheet_Activate()
Dim lastCol As Long
    With ThisWorkbook.Worksheets("Data")
        lastCol = .Cells(2, Columns.count).End(xlToLeft).Column
        If lastCol >= 3 Then
            On Error Resume Next
            ActiveWorkbook.Names("DMDA").Delete
            ActiveWorkbook.Names.Add "DMDA", "=Data!" & .Range("C2").Resize(1, lastCol - 2).Address
            With Me.Range("B2").Validation
                .Delete
                .Add Type:=xlValidateList, Formula1:="=DMDA"
                .InCellDropdown = True
            End With
            On Error GoTo 0
        End If
    End With
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, [b2]) Is Nothing Then
        Cancel = True
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, rng As Range, sh As Worksheet, cell_ As Range
    If Target.Address <> "$B$2" Then Exit Sub
    Set sh = ThisWorkbook.Worksheets("Data")
    lastRow = sh.Cells(Rows.count, "B").End(xlUp).Row
    If lastRow < 3 Then Exit Sub
    Set rng = sh.Range("DMDA").Find(Me.Range("B2").Value, , xlValues, xlWhole)
    If rng Is Nothing Then Exit Sub
    With sh
        createWord Me.Range("B2").Value, .Range(.Range("B3"), .Cells(lastRow, rng.Column))
    End With
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$2" Then
        Application.SendKeys "%{Down}"
    End If
End Sub
Dạ! em cám ơn anh rất rất nhiều.
Để em chạy thử, chúc anh nhiều sức khỏe và niềm vui.
 
Upvote 0
Bạn có 2 lựa chọn: hoặc nhờ tác giả code của bạn giúp hoặc nhờ tôi. Nếu nhờ tôi thì tôi đập đi xây mới. Tức bạn phải:
1. Mô tả các việc cần làm. Tôi không dò, không nghiên cứu code của người khác để đoán ý bạn.
2. Ý thức được là code của tôi có thể sẽ xung đột với code hiện có của người khác. Bạn có 2 lựa chọn: hoặc xóa hết các code cũ hoặc tự thích ứng chúng với code mới của tôi.

Trước khi làm thì vào Name Manager và xóa hết tất cả những name DMDA - hiện bạn có 2 DMDA. Một rừng name khác có lỗi nhưng tôi không quan tâm. Tự bạn phải vệ sinh gọn gàng tập tin của mình.

Các Key trong Data!B chỉ là chữ không có định dạng gì cả vì chả để làm gì. Phông chữ thì do bạn chọn thôi.

Dòng 2 trong Data phải định dạng là General.

Sub ChuongTrinh sẽ lấy các Key từ Word vào Data!B. Khi Trang Chu Activate code tạo name mới DMDA thích hợp với nội dung hiện hành tại dòng 2 trong Data. Khi chọn B2 ở Trang Chu thì code sẽ thay thế các Key ở Data!B bằng các tên ở cột tương ứng với B2 được chọn và tạo tập tin có tên là B2.

Toàn bộ code của tôi như sau:
Trong Module
Mã:
Sub ChuongTrinh()
Dim Arr(), count As Long, text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, dic As Object
    Application.ScreenUpdating = False
    '''''Kiem tra su ton tai cua File_Mau. Neu khong thay thi Msgbox thong bao va thoat khoi chuong trinh
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Sheets("DaTa").Range("B3:B10000").ClearContents
    ReDim Arr(1 To 10000, 1 To 1)
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
    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
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            If Not dic.exists(wordSelection.text) Then
                dic.Add wordSelection.text, ""
                count = count + 1
                Arr(count, 1) = wordSelection.text
            End If
        Loop
    End With
    If count Then ThisWorkbook.Worksheets("Data").Range("B3").Resize(count).Value = Arr
    Set dic = Nothing
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub

Sub createWord(ByVal filename As String, ByVal rng As Range)
Const wdFindContinue = 1
Const wdReplaceAll = 2
Dim lastCol As Long, k As Long, data(), wordApp As Object, wordDoc As Object, wordSelection As Object
    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
    data = rng.Value
    lastCol = UBound(data, 2)
    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 k = 1 To UBound(data)
        With wordSelection.Find
            .text = data(k, 1)
            .Replacement.text = data(k, lastCol)
            .Execute Replace:=wdReplaceAll
        End With
    Next k

    wordDoc.SaveAs ThisWorkbook.Path & "\" & filename & ".doc"
    wordDoc.Close
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing

    MsgBox "Da tao tap tin " & filename & ".doc"
End Sub

Trong sheet Trang Chu
Mã:
Private Sub Worksheet_Activate()
Dim lastCol As Long
    With ThisWorkbook.Worksheets("Data")
        lastCol = .Cells(2, Columns.count).End(xlToLeft).Column
        If lastCol >= 3 Then
            On Error Resume Next
            ActiveWorkbook.Names("DMDA").Delete
            ActiveWorkbook.Names.Add "DMDA", "=Data!" & .Range("C2").Resize(1, lastCol - 2).Address
            With Me.Range("B2").Validation
                .Delete
                .Add Type:=xlValidateList, Formula1:="=DMDA"
                .InCellDropdown = True
            End With
            On Error GoTo 0
        End If
    End With
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, [b2]) Is Nothing Then
        Cancel = True
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, rng As Range, sh As Worksheet, cell_ As Range
    If Target.Address <> "$B$2" Then Exit Sub
    Set sh = ThisWorkbook.Worksheets("Data")
    lastRow = sh.Cells(Rows.count, "B").End(xlUp).Row
    If lastRow < 3 Then Exit Sub
    Set rng = sh.Range("DMDA").Find(Me.Range("B2").Value, , xlValues, xlWhole)
    If rng Is Nothing Then Exit Sub
    With sh
        createWord Me.Range("B2").Value, .Range(.Range("B3"), .Cells(lastRow, rng.Column))
    End With
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$2" Then
        Application.SendKeys "%{Down}"
    End If
End Sub
Em vừa chạy code anh viết giúp, em làm phiền anh chút xíu ạ:
1/ Nếu file Word có tên ''File_Mau" mà mở lên cùng với file excel đó thì khi chạy code để lấy key thì bị báo lỗi (như hình đính kèm)
Chỉ khi tắt file Word đó đi và chạy code trong file excel thì mới được ạ? (tức là file Word (File_Mau) và file excel không được mở lên đồng thời, phải tắt file Word đi thì mới chạy được code)
2/ Có thể tự động mở file word mới vừa tạo được không vậy anh? (ngay sau khi điền tên Key vào ô B2 của sheet "Trang Chu" và đã tạo ra file word mới thì ngay sau đó xuất hiện giao diện hỏi "có muốn mở file word vừa được tạo hay không chả hạn" nếu nhấn có sẽ mở file word mới, nhấn không sẽ không mở)
Anh cho em ký kiến về 2 vấn đề em nêu trên ạ! có thể mở đồng thời được file_Mau và file Excel mà chạy code không báo lỗi không ạ? và tối đa tạo được bao nhiêu file word mới tương ứng với cột trong sheet "Data" vậy anh?
 
Lần chỉnh sửa cuối:
Upvote 0
Em vừa chạy code anh viết giúp, em làm phiền anh chút xíu ạ:
1/ Nếu file Word có tên ''File_Mau" mà mở lên cùng với file excel đó thì khi chạy code để lấy key thì bị báo lỗi (như hình đính kèm)
Chỉ khi tắt file Word đó đi và chạy code trong file excel thì mới được ạ? (tức là file Word (File_Mau) và file excel không được mở lên đồng thời, phải tắt file Word đi thì mới chạy được code)
Thôi tôi không sửa nữa đâu. Một lúc bạn chỉ làm được 1 việc. Vậy thì nếu muốn làm việc với Word thì chạy Excel làm gì? Còn nếu muốn làm việc với Excel thì đừng mở Word hoặc đang mở thì đóng. Thế thôi. Cái gì cũng code?
2/ Có thể tự động mở file word mới vừa tạo được không vậy anh? (ngay sau khi điền tên Key vào ô B2 của sheet "Trang Chu" và đã tạo ra file word mới thì ngay sau đó xuất hiện giao diện hỏi "có muốn mở file word vừa được tạo hay không chả hạn" nếu nhấn có sẽ mở file word mới, nhấn không sẽ không mở)
Thay
Mã:
wordDoc.Close
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
   
    MsgBox "Da tao tap tin " & filename & ".doc"
bằng
Mã:
If MsgBox("Co mo tap tin " & filename & ".doc khong?", vbYesNo) = vbYes Then
    wordApp.Visible = True
Else
    wordDoc.Close
    wordApp.Quit
End If
 
Upvote 0
Thôi tôi không sửa nữa đâu. Một lúc bạn chỉ làm được 1 việc. Vậy thì nếu muốn làm việc với Word thì chạy Excel làm gì? Còn nếu muốn làm việc với Excel thì đừng mở Word hoặc đang mở thì đóng. Thế thôi. Cái gì cũng code?

Thay
Mã:
wordDoc.Close
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
  
    MsgBox "Da tao tap tin " & filename & ".doc"
bằng
Mã:
If MsgBox("Co mo tap tin " & filename & ".doc khong?", vbYesNo) = vbYes Then
    wordApp.Visible = True
Else
    wordDoc.Close
    wordApp.Quit
End If
Dạ! Em cám anh, chúc anh buổi tối vui vẻ.
 
Upvote 0
Bạn có 2 lựa chọn: hoặc nhờ tác giả code của bạn giúp hoặc nhờ tôi. Nếu nhờ tôi thì tôi đập đi xây mới. Tức bạn phải:
1. Mô tả các việc cần làm. Tôi không dò, không nghiên cứu code của người khác để đoán ý bạn.
2. Ý thức được là code của tôi có thể sẽ xung đột với code hiện có của người khác. Bạn có 2 lựa chọn: hoặc xóa hết các code cũ hoặc tự thích ứng chúng với code mới của tôi.

Trước khi làm thì vào Name Manager và xóa hết tất cả những name DMDA - hiện bạn có 2 DMDA. Một rừng name khác có lỗi nhưng tôi không quan tâm. Tự bạn phải vệ sinh gọn gàng tập tin của mình.

Các Key trong Data!B chỉ là chữ không có định dạng gì cả vì chả để làm gì. Phông chữ thì do bạn chọn thôi.

Dòng 2 trong Data phải định dạng là General.

Sub ChuongTrinh sẽ lấy các Key từ Word vào Data!B. Khi Trang Chu Activate code tạo name mới DMDA thích hợp với nội dung hiện hành tại dòng 2 trong Data. Khi chọn B2 ở Trang Chu thì code sẽ thay thế các Key ở Data!B bằng các tên ở cột tương ứng với B2 được chọn và tạo tập tin có tên là B2.

Toàn bộ code của tôi như sau:
Trong Module
Mã:
Sub ChuongTrinh()
Dim Arr(), count As Long, text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, dic As Object
    Application.ScreenUpdating = False
    '''''Kiem tra su ton tai cua File_Mau. Neu khong thay thi Msgbox thong bao va thoat khoi chuong trinh
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Sheets("DaTa").Range("B3:B10000").ClearContents
    ReDim Arr(1 To 10000, 1 To 1)
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
    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
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            If Not dic.exists(wordSelection.text) Then
                dic.Add wordSelection.text, ""
                count = count + 1
                Arr(count, 1) = wordSelection.text
            End If
        Loop
    End With
    If count Then ThisWorkbook.Worksheets("Data").Range("B3").Resize(count).Value = Arr
    Set dic = Nothing
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub

Sub createWord(ByVal filename As String, ByVal rng As Range)
Const wdFindContinue = 1
Const wdReplaceAll = 2
Dim lastCol As Long, k As Long, data(), wordApp As Object, wordDoc As Object, wordSelection As Object
    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
    data = rng.Value
    lastCol = UBound(data, 2)
    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 k = 1 To UBound(data)
        With wordSelection.Find
            .text = data(k, 1)
            .Replacement.text = data(k, lastCol)
            .Execute Replace:=wdReplaceAll
        End With
    Next k

    wordDoc.SaveAs ThisWorkbook.Path & "\" & filename & ".doc"
    wordDoc.Close
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing

    MsgBox "Da tao tap tin " & filename & ".doc"
End Sub

Trong sheet Trang Chu
Mã:
Private Sub Worksheet_Activate()
Dim lastCol As Long
    With ThisWorkbook.Worksheets("Data")
        lastCol = .Cells(2, Columns.count).End(xlToLeft).Column
        If lastCol >= 3 Then
            On Error Resume Next
            ActiveWorkbook.Names("DMDA").Delete
            ActiveWorkbook.Names.Add "DMDA", "=Data!" & .Range("C2").Resize(1, lastCol - 2).Address
            With Me.Range("B2").Validation
                .Delete
                .Add Type:=xlValidateList, Formula1:="=DMDA"
                .InCellDropdown = True
            End With
            On Error GoTo 0
        End If
    End With
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, [b2]) Is Nothing Then
        Cancel = True
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, rng As Range, sh As Worksheet, cell_ As Range
    If Target.Address <> "$B$2" Then Exit Sub
    Set sh = ThisWorkbook.Worksheets("Data")
    lastRow = sh.Cells(Rows.count, "B").End(xlUp).Row
    If lastRow < 3 Then Exit Sub
    Set rng = sh.Range("DMDA").Find(Me.Range("B2").Value, , xlValues, xlWhole)
    If rng Is Nothing Then Exit Sub
    With sh
        createWord Me.Range("B2").Value, .Range(.Range("B3"), .Cells(lastRow, rng.Column))
    End With
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$2" Then
        Application.SendKeys "%{Down}"
    End If
End Sub
ChàoThầy! em thấy chủ đề này rất thiết thực.

Có vấn đề sau em xin được Thầy giúp : khi lấy được từ khóa [Key] từ word để sang excel rồi và sau đó điền nội dung vào các cột C, cột D, cột E, cột F...vv....và chọn tên trong ô B2 của sheet_Trang Chu thì biên bản mới được xuất ra.
Nhưng nếu chèn thêm từ khóa vào file word có tên File_Mau vào vị trí bất kỳ trong file đó và lấy lại [key] sang file exel
Thì những nội dung đã được điền ở cột C, cột D, cột E, cột F...vv.... sẽ bị thay đổi, bị nhẩy (tức là các từ khóa cũ trong word và key được lấy sang exel sẽ không còn tương ứng với [key] ban đầu lúc chưa chèn thêm ký tự.

Từ khóa được lấy thêm vào do đó vị trí dòng của [Key] sẽ thay đổi trong khi đó nội dung đã điền trong các cột cột C, cột D, cột E, cột F...vv....lại không thay đổi so với lúc chưa lấy [key] mới, như vậy mỗi lần chèn thêm từ khóa vào File_Mau và lấy [key] sang file excel sẽ phải điền lại tất cả nội dung tương ứng trong các cột C, cột D, cột E, cột F...vv....ở sheet_Data.

Thầy giúp em để mỗi lần chèn từ khóa vào File_Mau mà [key] ở cột B trong sheet_Data tương ứng với nội dung điền trong cột C, cột D, ...vv... không bị thay đổi ( [key] thay đổi vị trí nhưng các nội dung đã điền ở cột C, cột D...vv....luôn gắn liền với [key] đó như lúc chưa chèn thêm từ khóa vào File_Mau).

Em cám ơn Thầy!
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có 2 lựa chọn: hoặc nhờ tác giả code của bạn giúp hoặc nhờ tôi. Nếu nhờ tôi thì tôi đập đi xây mới. Tức bạn phải:
1. Mô tả các việc cần làm. Tôi không dò, không nghiên cứu code của người khác để đoán ý bạn.
2. Ý thức được là code của tôi có thể sẽ xung đột với code hiện có của người khác. Bạn có 2 lựa chọn: hoặc xóa hết các code cũ hoặc tự thích ứng chúng với code mới của tôi.

Trước khi làm thì vào Name Manager và xóa hết tất cả những name DMDA - hiện bạn có 2 DMDA. Một rừng name khác có lỗi nhưng tôi không quan tâm. Tự bạn phải vệ sinh gọn gàng tập tin của mình.

Các Key trong Data!B chỉ là chữ không có định dạng gì cả vì chả để làm gì. Phông chữ thì do bạn chọn thôi.

Dòng 2 trong Data phải định dạng là General.

Sub ChuongTrinh sẽ lấy các Key từ Word vào Data!B. Khi Trang Chu Activate code tạo name mới DMDA thích hợp với nội dung hiện hành tại dòng 2 trong Data. Khi chọn B2 ở Trang Chu thì code sẽ thay thế các Key ở Data!B bằng các tên ở cột tương ứng với B2 được chọn và tạo tập tin có tên là B2.

Toàn bộ code của tôi như sau:
Trong Module
Mã:
Sub ChuongTrinh()
Dim Arr(), count As Long, text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, dic As Object
    Application.ScreenUpdating = False
    '''''Kiem tra su ton tai cua File_Mau. Neu khong thay thi Msgbox thong bao va thoat khoi chuong trinh
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Sheets("DaTa").Range("B3:B10000").ClearContents
    ReDim Arr(1 To 10000, 1 To 1)
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
    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
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            If Not dic.exists(wordSelection.text) Then
                dic.Add wordSelection.text, ""
                count = count + 1
                Arr(count, 1) = wordSelection.text
            End If
        Loop
    End With
    If count Then ThisWorkbook.Worksheets("Data").Range("B3").Resize(count).Value = Arr
    Set dic = Nothing
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub

Sub createWord(ByVal filename As String, ByVal rng As Range)
Const wdFindContinue = 1
Const wdReplaceAll = 2
Dim lastCol As Long, k As Long, data(), wordApp As Object, wordDoc As Object, wordSelection As Object
    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
    data = rng.Value
    lastCol = UBound(data, 2)
    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 k = 1 To UBound(data)
        With wordSelection.Find
            .text = data(k, 1)
            .Replacement.text = data(k, lastCol)
            .Execute Replace:=wdReplaceAll
        End With
    Next k
  
    wordDoc.SaveAs ThisWorkbook.Path & "\" & filename & ".doc"
    wordDoc.Close
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
  
    MsgBox "Da tao tap tin " & filename & ".doc"
End Sub

Trong sheet Trang Chu
Mã:
Private Sub Worksheet_Activate()
Dim lastCol As Long
    With ThisWorkbook.Worksheets("Data")
        lastCol = .Cells(2, Columns.count).End(xlToLeft).Column
        If lastCol >= 3 Then
            On Error Resume Next
            ActiveWorkbook.Names("DMDA").Delete
            ActiveWorkbook.Names.Add "DMDA", "=Data!" & .Range("C2").Resize(1, lastCol - 2).Address
            With Me.Range("B2").Validation
                .Delete
                .Add Type:=xlValidateList, Formula1:="=DMDA"
                .InCellDropdown = True
            End With
            On Error GoTo 0
        End If
    End With
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, [b2]) Is Nothing Then
        Cancel = True
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lastRow As Long, rng As Range, sh As Worksheet, cell_ As Range
    If Target.Address <> "$B$2" Then Exit Sub
    Set sh = ThisWorkbook.Worksheets("Data")
    lastRow = sh.Cells(Rows.count, "B").End(xlUp).Row
    If lastRow < 3 Then Exit Sub
    Set rng = sh.Range("DMDA").Find(Me.Range("B2").Value, , xlValues, xlWhole)
    If rng Is Nothing Then Exit Sub
    With sh
        createWord Me.Range("B2").Value, .Range(.Range("B3"), .Cells(lastRow, rng.Column))
    End With
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$2" Then
        Application.SendKeys "%{Down}"
    End If
End Sub
[Key] và nội dung được điền ở các cột của sheet Data sẽ bị đảo vị trí tương ứng khi [key] mới được tạo
Anh batman1 giúp em khắc phục mới
Bài đã được tự động gộp:

ChàoThầy! em thấy chủ đề này rất thiết thực.

Có vấn đề sau em xin được Thầy giúp : khi lấy được từ khóa [Key] từ word để sang excel rồi và sau đó điền nội dung vào các cột C, cột D, cột E, cột F...vv....và chọn tên trong ô B2 của sheet_Trang Chu thì biên bản mới được xuất ra.
Nhưng nếu chèn thêm từ khóa vào file word có tên File_Mau vào vị trí bất kỳ trong file đó và lấy lại [key] sang file exel
Thì những nội dung đã được điền ở cột C, cột D, cột E, cột F...vv.... sẽ bị thay đổi, bị nhẩy (tức là các từ khóa cũ trong word và key được lấy sang exel sẽ không còn tương ứng với [key] ban đầu lúc chưa chèn thêm ký tự.

Từ khóa được lấy thêm vào do đó vị trí dòng của [Key] sẽ thay đổi trong khi đó nội dung đã điền trong các cột cột C, cột D, cột E, cột F...vv....lại không thay đổi so với lúc chưa lấy [key] mới, như vậy mỗi lần chèn thêm từ khóa vào File_Mau và lấy [key] sang file excel sẽ phải điền lại tất cả nội dung tương ứng trong các cột C, cột D, cột E, cột F...vv....ở sheet_Data.

Thầy giúp em để mỗi lần chèn từ khóa vào File_Mau mà [key] ở cột B trong sheet_Data tương ứng với nội dung điền trong cột C, cột D, ...vv... không bị thay đổi ( [key] thay đổi vị trí nhưng các nội dung đã điền ở cột C, cột D...vv....luôn gắn liền với [key] đó như lúc chưa chèn thêm từ khóa vào File_Mau).

Em cám ơn Thầy!
Gần đúng ý mình
 
Upvote 0
ChàoThầy! em thấy chủ đề này rất thiết thực.

Có vấn đề sau em xin được Thầy giúp : khi lấy được từ khóa [Key] từ word để sang excel rồi và sau đó điền nội dung vào các cột C, cột D, cột E, cột F...vv....và chọn tên trong ô B2 của sheet_Trang Chu thì biên bản mới được xuất ra.
Nhưng nếu chèn thêm từ khóa vào file word có tên File_Mau vào vị trí bất kỳ trong file đó và lấy lại [key] sang file exel
Thì những nội dung đã được điền ở cột C, cột D, cột E, cột F...vv.... sẽ bị thay đổi, bị nhẩy (tức là các từ khóa cũ trong word và key được lấy sang exel sẽ không còn tương ứng với [key] ban đầu lúc chưa chèn thêm ký tự.

Từ khóa được lấy thêm vào do đó vị trí dòng của [Key] sẽ thay đổi trong khi đó nội dung đã điền trong các cột cột C, cột D, cột E, cột F...vv....lại không thay đổi so với lúc chưa lấy [key] mới, như vậy mỗi lần chèn thêm từ khóa vào File_Mau và lấy [key] sang file excel sẽ phải điền lại tất cả nội dung tương ứng trong các cột C, cột D, cột E, cột F...vv....ở sheet_Data.

Thầy giúp em để mỗi lần chèn từ khóa vào File_Mau mà [key] ở cột B trong sheet_Data tương ứng với nội dung điền trong cột C, cột D, ...vv... không bị thay đổi ( [key] thay đổi vị trí nhưng các nội dung đã điền ở cột C, cột D...vv....luôn gắn liền với [key] đó như lúc chưa chèn thêm từ khóa vào File_Mau).

Em cám ơn Thầy!
Chị đặt tên và cố định lại xem
 
Upvote 0
Thầy giúp em để mỗi lần chèn từ khóa vào File_Mau mà [key] ở cột B trong sheet_Data tương ứng với nội dung điền trong cột C, cột D, ...vv... không bị thay đổi ( [key] thay đổi vị trí nhưng các nội dung đã điền ở cột C, cột D...vv....luôn gắn liền với [key] đó như lúc chưa chèn thêm từ khóa vào File_Mau).
Lần sau thì nên làm như chủ chủ đề. Tức đính kèm tập tin và mô tả kỹ yêu cầu. Bắt người khác đọc 100 bài trong chủ đề nào đó và tải hàng loạt tập tin đính kèm để đoán ý tác giả định nói tới bài nào, tập tin nào thì ít ai bỏ công ra giúp. Nhớ nhắc cả bạn Bùi Thúy Thúy ngồi cùng bàn nhé.

Nhìn qua thì như sau, bạn hãy kiểm tra kỹ, bởi tôi không kiểm tra phần thêm KEY này.

Tôi giả thiết là yêu cầu của bạn y như yêu cầu của chủ chủ đề, nhưng thêm phần thêm KEY trong File_Mau.

Code vẫn chỉ có những SUB như bài #6 nhưng thay Sub ChuongTrinh bằng
Mã:
Sub ChuongTrinh()
Dim Arr(), lastRow As Long, k As Long, count As Long, text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, dic As Object
    Application.ScreenUpdating = False
    '''''Kiem tra su ton tai cua File_Mau. Neu khong thay thi Msgbox thong bao va thoat khoi chuong trinh
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
'    ---------- ghi KEY da co vao dic - bat dau ------------
    With ThisWorkbook.Worksheets("Data")
        lastRow = .Cells(Rows.count, "B").End(xlUp).Row
        Arr = .Range("B3:B" & lastRow + 2).Value
    End With
    For k = 1 To UBound(Arr) - 2
        If Arr(k, 1) <> "" Then dic.Add Arr(k, 1), ""
    Next k
'    ---------- ghi KEY da co vao dic - ket thuc ------------
    ReDim Arr(1 To 10000, 1 To 1)
    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
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            text = wordSelection.text
            If Not dic.exists(text) Then
                dic.Add text, ""
                count = count + 1
                Arr(count, 1) = text
            End If
        Loop
    End With
    If count Then ThisWorkbook.Worksheets("Data").Range("B" & lastRow + 1).Resize(count).Value = Arr
    Set dic = Nothing
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Lần sau thì nên làm như chủ chủ đề. Tức đính kèm tập tin và mô tả kỹ yêu cầu. Bắt người khác đọc 100 bài trong chủ đề nào đó và tải hàng loạt tập tin đính kèm để đoán ý tác giả định nói tới bài nào, tập tin nào thì ít ai bỏ công ra giúp. Nhớ nhắc cả bạn Bùi Thúy Thúy ngồi cùng bàn nhé.

Nhìn qua thì như sau, bạn hãy kiểm tra kỹ, bởi tôi không kiểm tra phần thêm KEY này.

Tôi giả thiết là yêu cầu của bạn y như yêu cầu của chủ chủ đề, nhưng thêm phần thêm KEY trong File_Mau.

Code vẫn chỉ có những SUB như bài #6 nhưng thay Sub ChuongTrinh bằng
Mã:
Sub ChuongTrinh()
Dim Arr(), lastRow As Long, k As Long, count As Long, text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, dic As Object
    Application.ScreenUpdating = False
    '''''Kiem tra su ton tai cua File_Mau. Neu khong thay thi Msgbox thong bao va thoat khoi chuong trinh
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
'    ---------- ghi KEY da co vao dic - bat dau ------------
    With ThisWorkbook.Worksheets("Data")
        lastRow = .Cells(Rows.count, "B").End(xlUp).Row
        Arr = .Range("B3:B" & lastRow + 2).Value
    End With
    For k = 1 To UBound(Arr) - 2
        If Arr(k, 1) <> "" Then dic.Add Arr(k, 1), ""
    Next k
'    ---------- ghi KEY da co vao dic - ket thuc ------------
    ReDim Arr(1 To 10000, 1 To 1)
    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
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            text = wordSelection.text
            If Not dic.exists(text) Then
                dic.Add text, ""
                count = count + 1
                Arr(count, 1) = text
            End If
        Loop
    End With
    If count Then ThisWorkbook.Worksheets("Data").Range("B" & lastRow + 1).Resize(count).Value = Arr
    Set dic = Nothing
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub
Hi dạ! em cám ơn Thầy! thầy vẫn nhớ Bùi Thúy Thúy, hi..
Em có tải file đính kèm luôn ở bài #1 để thực hành
Em đã coppy Sub ChuongTrinh thầy viết dùm ở bài #14 vào và chạy Sub ChuongTrinh đó để lấy [key] từ word sang excel thì đã lấy được [key]
Tiếp đó em chọn tên ô B2 trong sheet_TrangChu để xuất file word mới thì em thấy hiện thông báo lỗi:
Em có tải kèm luôn file em đã thực hành và hình ảnh bị lỗi.
Thầy xem giúp em nhé! em không biết lỗi do đâu, em làm lại 3 lần mà vẫn thông báo lỗi vậy, nếu Sub ChuongTrinh ở bài #6 thì không thấy lỗi nhưng với Sub ChuongTrinh ở bài #14 thì có lỗi thầy ạ!

motaloi_1.pngmo ta loi _2.png
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tiếp đó em chọn tên ô B2 trong sheet_TrangChu để xuất file word mới thì em thấy hiện thông báo lỗi:
Tôi viết rất rõ.
Code vẫn chỉ có những SUB như bài #6 nhưng thay Sub ChuongTrinh bằng
...

Trong bài #6 có ghi
Toàn bộ code của tôi như sau:
Trong Module
...
Trong Module có 2 SUB là Sub ChuongTrinh và Sub createWord. Nhưng trong tập tin của bạn chỉ có Sub ChuongTrinh. Sai là hiển nhiên.
 
Upvote 0
Đọc kỹ bài 14.
Tôi không xem file, chỉ xem hình và xem lại bài 6 và tôi biết chắc bạn chưa làm đúng theo hướng dẫn.
 
Upvote 0
Tôi viết rất rõ.


Trong bài #6 có ghi

Trong Module có 2 SUB là Sub ChuongTrinh và Sub createWord. Nhưng trong tập tin của bạn chỉ có Sub ChuongTrinh. Sai là hiển nhiên.
Vâng, Thầy ơi! Khi xóa từ khóa trong File_Mau đi và lấy [key] sang file excel, các từ khóa bị xóa đi trong File_Mau khi lấy sang file Excel vẫn còn, và nội dung tương ứng với các [key] đã bị xóa đó vẫn còn.
Nếu File_Mau mà có các từ khóa bị xóa đi để chỉnh sửa thì dẫn đến khi lấy [key] sang file excel sẽ thừa [key] và thừa nội dung tương ứng với các [key] đó ở các cột C, cột D...vv... _hình thứ 2
Em làm phiền thầy chút với 02 vấn đề sau:
1/ Khi lấy lại [key] sang file excel, những [key] thừa và nội dung tương ứng với các [key] thừa ở các cột sẽ bị thay thế bởi toàn bộ [key] mới.
2/ Các [key] lấy được điền xuống dòng dưới trong sheet Data mà không theo thứ tự từ đầu trang đến cuối trang trong File_Mau, có thể lấy [key] được theo thứ tự từ đầu trang đến cuối trang như trong File_Mau được không thầy? (như file em đính kèm từ khóa [Anh nguyet] ở vị trí lấy [key] số 09 nhưng khi lấy [key] lại bị đẩy xuống cuối cùng_hình đầu tiên)
Em cám ơn Thầy!
tretre.pngNho thay_1.png
Bài đã được tự động gộp:

Đọc kỹ bài 14.
Tôi không xem file, chỉ xem hình và xem lại bài 6 và tôi biết chắc bạn chưa làm đúng theo hướng dẫn.
Dạ em chỉnh lại rồi nhưng vẫn còn chút xíu vấn đề nữa mà có chạy code mới biết anh ạ! Hy vọng là sẽ hoàn thiện.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vâng, Thầy ơi! Khi xóa từ khóa trong File_Mau đi và lấy [key] sang file excel, các từ khóa bị xóa đi trong File_Mau khi lấy sang file Excel vẫn còn, và nội dung tương ứng với các [key] đã bị xóa đó vẫn còn.
Nếu File_Mau mà có các từ khóa bị xóa đi để chỉnh sửa thì dẫn đến khi lấy [key] sang file excel sẽ thừa [key] và thừa nội dung tương ứng với các [key] đó ở các cột C, cột D...vv... _hình thứ 2
Bạn hãy suy nghĩ kỹ và nêu hết các yêu cầu. Tôi sẽ chỉ viết cho bạn 1 lần nứa thôi. Tôi không ham trò chơi "Thông tin nhỏ giọt".
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn hãy suy nghĩ kỹ và nêu hết các yêu cầu. Tôi sẽ chỉ viết cho bạn 1 lần nứa thôi. Tôi không ham trò chơi "Thông tin nhỏ giọt".
Bạn hãy suy nghĩ kỹ và nêu hết các yêu cầu. Tôi sẽ chỉ viết cho bạn 1 lần nứa thôi. Tôi không ham trò chơi "Thông tin nhỏ giọt".
Tại em chưa có ý tưởng nên khi chạy code mới phát hiện ra vậy ạ!
Vâng, em cám ơn thầy, vậy nhờ thầy giúp em một lần cuối nhé!
Em tổng hợp mấy vấn đề sau xin được thầy giúp ạ!
1/ Xóa từ khóa trong File_Mau: Khi xóa từ khóa trong File_Mau và lấy lại [Key] mới sang file excel thì những [key] bị xóa trong word cũng tự động bị xóa đi trong excel và các nội dung tương ứng với [key] bị xóa đó ở các cột B, cột C …vv… trong sheet Data của file excel cũng bị xóa .
2/ Thêm từ khóa trong File_Mau: trường hợp thêm từ khóa trong File_Mau thì ở sheet Data những từ khóa và các nội dung tương ứng đã được điền trước đó vẫn được giữ nguyên, từ khóa mới thêm vào ở vị trí nào trong File_Mau thì khi lấy [key] sang file excel theo đúng thứ tự từ trên xuống dưới trong trang File_Mau.
3/ Xuất danh mục văn bản trong file Word mới tạo ra: Khi xuất ra file Word mới có tên như tên chọn trong ô B2 của sheet TrangChu thì có thể xuất tiếp “List danh mục biên bản “ ra file Excel có tên: “List_Tên được chọn trong ô B2 của sheet TrangChu” [có hình đính kèm]

List danh mục này có tên: “List_Tên được chọn trong ô B2 của sheet TrangChu” tạo ra có luật như sau:
Cột “Nội dung văn bản” (Cột B) sẽ lấy các từ có mã màu dạng RGB (0,0,255)
Cột “Số văn bản” (Cột C) sẽ lấy các từ có mã màu dạng RGB (51,51,153)
Cột “Ngày tháng ban hành” (Cột D) sẽ lấy các từ có mã màu dạng RGB (153,0,204) và có định dạng chung.

Theo thứ tự từ đầu đến cuối trang của file word mới được tạo ra thì 03 nội dung tương ứng với 3 mã màu trên chỉ xét trong phạm vi trang đầu tiên xuất hiện cả 03 mã màu đó sẽ tương ứng với số thứ tự là 01 ở cột A , xét tiếp đến trong phạm vi trang thứ 2 chứa cả 03 mã màu đó sẽ tương ứng với số thứ tự 02 và nội dung được điền vào dòng số thứ tự 02 ở các cột B, cột C, cột D trong List_Tên được chọn trong ô B2 của sheet TrangChu .
Số thứ tự được điện tự động theo trình tự xuất hiện của trang trong file word mới xét theo chiều từ đầu đến cuối trang.
(Số thứ tự và nội dung được tạo ra tương ứng với số thứ tự trang trong file word mới mà trang đó phải tính có cả 03 mã màu thì gọi là số thứ tự số 01, xét tiếp trang nào chữa cả 03 mã màu thì gọi là trang thứ 2….theo thứ tự từ đầu đến cuối file Word mới)

Em diễn giải dài dòng quá! thầy giúp em mới ạ!
Em cám ơn Thầy!
097.png
 
Lần chỉnh sửa cuối:
Upvote 0
Tại em chưa có ý tưởng nên khi chạy code mới phát hiện ra vậy ạ!
Vâng, em cám ơn thầy, vậy nhờ thầy giúp em một lần cuối nhé!
Em tổng hợp mấy vấn đề sau xin được thầy giúp ạ!
1/ Xóa từ khóa trong File_Mau: Khi xóa từ khóa trong File_Mau và lấy lại [Key] mới sang file excel thì những [key] bị xóa trong word cũng tự động bị xóa đi trong excel và các nội dung tương ứng với [key] bị xóa đó ở các cột B, cột C …vv… trong sheet Data của file excel cũng bị xóa .
2/ Thêm từ khóa trong File_Mau: trường hợp thêm từ khóa trong File_Mau thì ở sheet Data những từ khóa và các nội dung tương ứng đã được điền trước đó vẫn được giữ nguyên, từ khóa mới thêm vào ở vị trí nào trong File_Mau thì khi lấy [key] sang file excel theo đúng thứ tự từ trên xuống dưới trong trang File_Mau.
3/ Xuất danh mục văn bản trong file Word mới tạo ra: Khi xuất ra file Word mới có tên như tên chọn trong ô B2 của sheet TrangChu thì có thể xuất tiếp “List danh mục biên bản “ ra file Excel có tên: “List_Tên được chọn trong ô B2 của sheet TrangChu” [có hình đính kèm]

List danh mục này có tên: “List_Tên được chọn trong ô B2 của sheet TrangChu” tạo ra có luật như sau:
Cột “Nội dung văn bản” (Cột B) sẽ lấy các từ có mã màu dạng RGB (0,0,255)
Cột “Số văn bản” (Cột C) sẽ lấy các từ có mã màu dạng RGB (51,51,153)
Cột “Ngày tháng ban hành” (Cột D) sẽ lấy các từ có mã màu dạng RGB (153,0,204) và có định dạng chung.

Theo thứ tự từ đầu đến cuối trang của file word mới được tạo ra thì 03 nội dung tương ứng với 3 mã màu trên chỉ xét trong phạm vi trang đầu tiên xuất hiện cả 03 mã màu đó sẽ tương ứng với số thứ tự là 01 ở cột A , xét tiếp đến trong phạm vi trang thứ 2 chứa cả 03 mã màu đó sẽ tương ứng với số thứ tự 02 và nội dung được điền vào dòng số thứ tự 02 ở các cột B, cột C, cột D trong List_Tên được chọn trong ô B2 của sheet TrangChu .
Số thứ tự được điện tự động theo trình tự xuất hiện của trang trong file word mới xét theo chiều từ đầu đến cuối trang.
(Số thứ tự và nội dung được tạo ra tương ứng với số thứ tự trang trong file word mới mà trang đó phải tính có cả 03 mã màu thì gọi là số thứ tự số 01, xét tiếp trang nào chữa cả 03 mã màu thì gọi là trang thứ 2….theo thứ tự từ đầu đến cuối file Word mới)

Em diễn giải dài dòng quá! thầy giúp em mới ạ!
Em cám ơn Thầy!
View attachment 225828
Nhìu vấn đề đó em gái.
Cái mà [key] bị đảo khi chạy code tui cũng biết, cái đó anh batman1 đã giải quyết rồi thây
 
Upvote 0
Đang chờ bác batman1 đây mà! thôi ngủ thôi
Bạn chờ cái gì? Yêu cầu của bạn tôi đã đáp ứng. Về yêu cầu của Cát Lượng thì tôi đang chờ khẳng định hết các yêu cầu vì tôi chỉ làm 1 lần nữa.

Tôi chờ chứ không phải ai chờ tôi.
 
Upvote 0
Bạn chờ cái gì? Yêu cầu của bạn tôi đã đáp ứng. Về yêu cầu của Cát Lượng thì tôi đang chờ khẳng định hết các yêu cầu vì tôi chỉ làm 1 lần nữa.

Tôi chờ chứ không phải ai chờ tôi.
Chúc Thầy ngày mới nhiều niềm vui!
Các vấn đề em nêu ở bài #20, em đã tổng hợp lại, có thể diễn giải hơi dài.
Đó là hết các yêu cầu của em đã nêu ra.
Mong thầy giúp em một lần nữa.
 
Upvote 0
2/ Thêm từ khóa trong File_Mau: trường hợp thêm từ khóa trong File_Mau thì ở sheet Data những từ khóa và các nội dung tương ứng đã được điền trước đó vẫn được giữ nguyên, từ khóa mới thêm vào ở vị trí nào trong File_Mau thì khi lấy [key] sang file excel theo đúng thứ tự từ trên xuống dưới trong trang File_Mau.
Thứ tự để mà làm gì? Thứ tự nào mà chả được, miễn khi xuất ra tập tin Word thì xuất chuẩn.

Những Key mới thêm tôi cho vào các dòng cuối. Các key bị xóa sẽ biến mất khỏi sheet Data.

Vẫn toàn bộ code của bài #6 nhưng riêng sub ChuongTrinh thì thay bằng
Mã:
Sub ChuongTrinh()
Dim Arr(), lastRow As Long, lastCol As Long, r As Long, c As Long, count As Long, curr_pos As Long
Dim text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, dic As Object
    Application.ScreenUpdating = False
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
'    ---------- ghi KEY da co vao dic - bat dau ------------
    With ThisWorkbook.Worksheets("Data")
        lastCol = .Cells(2, Columns.count).End(xlToLeft).Column
        lastRow = .Cells(Rows.count, "B").End(xlUp).Row
        With .Range("B3").Resize(5000, lastCol - 1)
            Arr = .Value
            If lastRow > 2 Then .Resize(lastRow - 2).ClearContents
        End With
    End With
    For r = 1 To lastRow - 2
        If Arr(r, 1) <> "" Then dic.Add Arr(r, 1), "loai_bo"
    Next r
'    ---------- ghi KEY da co vao dic - ket thuc ------------
    Set wordApp = CreateObject("Word.Application")
    Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\File_Mau.doc")
    Set wordSelection = wordApp.Selection
    count = lastRow - 2
    With wordSelection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            text = wordSelection.text
            If Not dic.exists(text) Then
                dic.Add text, ""
                count = count + 1
                Arr(count, 1) = text
            Else
                dic.Item(text) = ""
            End If
        Loop
    End With
    For r = 1 To lastRow - 2
        If dic.exists(Arr(r, 1)) Then
            If dic.Item(Arr(r, 1)) = "" Then
                curr_pos = curr_pos + 1
                For c = 1 To UBound(Arr, 2)
                    Arr(curr_pos, c) = Arr(r, c)
                Next c
            End If
        End If
    Next r
    For r = lastRow - 1 To count
        curr_pos = curr_pos + 1
        For c = 1 To UBound(Arr, 2)
            Arr(curr_pos, c) = Arr(r, c)
        Next c
    Next r
    
    If curr_pos Then ThisWorkbook.Worksheets("Data").Range("B3").Resize(curr_pos, UBound(Arr, 2)).Value = Arr
    Set dic = Nothing
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub

List danh mục này có tên: “List_Tên được chọn trong ô B2 của sheet TrangChu” tạo ra có luật như sau:
Giả sử B2 = "Biên bản hiện trường". Lúc đó “List_Tên được chọn trong ô B2 của sheet TrangChu” là "List_Biên bản hiện trường". Cái "List_Biên bản hiện trường" là tên của cái gì? Nếu đó là tên của sheet tạo mới mà trong đó sẽ có bảng như trong hình thì đừng gọi đó là tên của "List Danh mục". Vì "List Danh mục" nó là cái gì? Là tên của bảng gồm 3 cột B, C và D trong cái sheet "Trang_tính1" kia?

Tóm lại có phải là: tạo sheet mới và đặt tên là "List_Biên bản hiện trường". Và trong đó có dữ liệu của 3 cột B, C và D? Thế nếu sau đó, sau một thời gian, lại chọn B2 = Biên bản hiện trường thì có tạo sheet mới "List_Biên bản hiện trường" không? Xóa "List_Biên bản hiện trường" cũ lập "List_Biên bản hiện trường" mới?

Không hiểu ý nên tôi không giúp được. Mà tốt nhất là sau khi giải thích thì đính kèm tập tin của mình. Tập tin của chủ thớt là dùng cho yêu cầu của chủ thớt. Bạn thêm vài yêu cầu thì phải đính kèm tập tin của mình. Tôi không chơi trò "nói suông", "đoán ý đồng đội". Đính kèm tập tin và tự tạo bằng tay cái gọi là "List Danh mục" với nội dung đầy đủ ứng với tập tin File_Mau. Nó ở sheet nào tên gì phải ghi đúng chỗ.
 
Upvote 0
Thứ tự để mà làm gì? Thứ tự nào mà chả được, miễn khi xuất ra tập tin Word thì xuất chuẩn.

Những Key mới thêm tôi cho vào các dòng cuối. Các key bị xóa sẽ biến mất khỏi sheet Data.

Vẫn toàn bộ code của bài #6 nhưng riêng sub ChuongTrinh thì thay bằng
Mã:
Sub ChuongTrinh()
Dim Arr(), lastRow As Long, lastCol As Long, r As Long, c As Long, count As Long, curr_pos As Long
Dim text As String, wordApp As Object, wordDoc As Object, wordSelection As Object, dic As Object
    Application.ScreenUpdating = False
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(ThisWorkbook.Path & "\" & "File_Mau.doc") = False Then
            MsgBox "Khong co tap tin File_Mau.doc"
            Exit Sub
        End If
    End With
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
'    ---------- ghi KEY da co vao dic - bat dau ------------
    With ThisWorkbook.Worksheets("Data")
        lastCol = .Cells(2, Columns.count).End(xlToLeft).Column
        lastRow = .Cells(Rows.count, "B").End(xlUp).Row
        With .Range("B3").Resize(5000, lastCol - 1)
            Arr = .Value
            If lastRow > 2 Then .Resize(lastRow - 2).ClearContents
        End With
    End With
    For r = 1 To lastRow - 2
        If Arr(r, 1) <> "" Then dic.Add Arr(r, 1), "loai_bo"
    Next r
'    ---------- ghi KEY da co vao dic - ket thuc ------------
    Set wordApp = CreateObject("Word.Application")
    Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\File_Mau.doc")
    Set wordSelection = wordApp.Selection
    count = lastRow - 2
    With wordSelection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .text = "\[*\]"
        .MatchWildcards = True
        Do While .Execute
            text = wordSelection.text
            If Not dic.exists(text) Then
                dic.Add text, ""
                count = count + 1
                Arr(count, 1) = text
            Else
                dic.Item(text) = ""
            End If
        Loop
    End With
    For r = 1 To lastRow - 2
        If dic.exists(Arr(r, 1)) Then
            If dic.Item(Arr(r, 1)) = "" Then
                curr_pos = curr_pos + 1
                For c = 1 To UBound(Arr, 2)
                    Arr(curr_pos, c) = Arr(r, c)
                Next c
            End If
        End If
    Next r
    For r = lastRow - 1 To count
        curr_pos = curr_pos + 1
        For c = 1 To UBound(Arr, 2)
            Arr(curr_pos, c) = Arr(r, c)
        Next c
    Next r

    If curr_pos Then ThisWorkbook.Worksheets("Data").Range("B3").Resize(curr_pos, UBound(Arr, 2)).Value = Arr
    Set dic = Nothing
    wordDoc.Close False
    Set wordDoc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
End Sub


Giả sử B2 = "Biên bản hiện trường". Lúc đó “List_Tên được chọn trong ô B2 của sheet TrangChu” là "List_Biên bản hiện trường". Cái "List_Biên bản hiện trường" là tên của cái gì? Nếu đó là tên của sheet tạo mới mà trong đó sẽ có bảng như trong hình thì đừng gọi đó là tên của "List Danh mục". Vì "List Danh mục" nó là cái gì? Là tên của bảng gồm 3 cột B, C và D trong cái sheet "Trang_tính1" kia?

Tóm lại có phải là: tạo sheet mới và đặt tên là "List_Biên bản hiện trường". Và trong đó có dữ liệu của 3 cột B, C và D? Thế nếu sau đó, sau một thời gian, lại chọn B2 = Biên bản hiện trường thì có tạo sheet mới "List_Biên bản hiện trường" không? Xóa "List_Biên bản hiện trường" cũ lập "List_Biên bản hiện trường" mới?

Không hiểu ý nên tôi không giúp được. Mà tốt nhất là sau khi giải thích thì đính kèm tập tin của mình. Tập tin của chủ thớt là dùng cho yêu cầu của chủ thớt. Bạn thêm vài yêu cầu thì phải đính kèm tập tin của mình. Tôi không chơi trò "nói suông", "đoán ý đồng đội". Đính kèm tập tin và tự tạo bằng tay cái gọi là "List Danh mục" với nội dung đầy đủ ứng với tập tin File_Mau. Nó ở sheet nào tên gì phải ghi đúng chỗ.
Vâng, mục đích của em cũng là trình bày văn bản thông qua excel nên em đọc được chủ đề này tải luôn file đó xuống và xem.
Xin phép Thầy và anh vc_đi chơi em lấy chủ đề chính để cho mọi người tiện theo dõi.
Ý thầy nêu cuối bài đúng là em diễn giải còn lủng củng quá! Thầy nói em mới vỡ nghĩa ra, em xin được diễn gải lại như sau:
Vấn đề tạo ra file excel có tên "Danh Muc" chứa nội dung, số văn bản, ngày tháng ban hành từ file word mới được tạo ra:
Sau khi tạo file word mới có tên là "Tên được chọn trong ô B2 của sheet TrangChu"
Chạy tiếp Sub nào đó thì sẽ tạo ra 1 file Excel (sau khi thầy phân tích vấn đề nêu trên thì em có ý chỉ tạo ra một file excel có tên là “Danh muc”) các sheet của file excel này sẽ có nội dung gồm 01 cột ghi chú, và 03 cột như sau:
Cột “Nội dung văn bản” (Cột B) sẽ lấy các từ có mã màu dạng RGB (0,0,255)
Cột “Số văn bản” (Cột C) sẽ lấy các từ có mã màu dạng RGB (51,51,153)
Cột “Ngày tháng ban hành” (Cột D) sẽ lấy các từ có mã màu dạng RGB (153,0,204) và có định dạng chung.

Tên của sheet trong file excel “Danh Muc” được đặt tên theo file word mới xuất ra và bỏ dấu tiếng việt, nó cũng là tên “Tên được chọn trong ô B2 của sheet TrangChu" (bỏ dấu tiếng việt)

Theo thứ tự từ đầu đến cuối trang của file word mới được tạo ra thì 03 nội dung tương ứng với 3 mã màu trên chỉ xét trong phạm vi trang đầu tiên xuất hiện cả 03 mã màu đó sẽ tương ứng với số thứ tự là 01 ở cột A , xét tiếp đến trong phạm vi trang thứ 2 chứa cả 03 mã màu đó sẽ tương ứng với số thứ tự 02 và nội dung được điền vào dòng số thứ tự 02 ở các cột B, cột C, cột D trong sheet của file excel “Danh Muc”

Sau một thời gian nếu chọn tên ở ô B2 của sheet TrangChu trùng với tên đã chọn trước đó thì sheet mới trong file excel “Danh Muc” sẽ được tạo nên, sheet mới này sẽ thay thế toàn bộ nội dung có trong sheet cũ đã được tạo trước đó.

Ví dụ cụ thể:
Giả sử ban đầu tạo được một file word mới có tên “Biên bản hiện trường” sau đó chạy Sub nào đó sẽ tạo ra một file excel có tên “Danh Muc” và Sheet sẽ xuất hiện trong File “Danh Muc” sẽ có tên là (Bien ban hien truong), nội dung trong sheet này gồm các cột Stt, Nội dung văn bản, Số văn bản, ngày tháng ban hành, ghi chú như trình bày ở trên.

pl.png
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vâng, mục đích của em cũng là trình bày văn bản thông qua excel nên em đọc được chủ đề này tải luôn file đó xuống và xem.
Bạn giải thích vẫn còn rối rắm. Nhưng thôi, tôi hình như đã đoán được ý. Tóm lại là bạn có tập tin Word chứa nhiều tài liệu khác nhau. Như trong tập tin Word đính kèm thì có 2 văn bản là "Biên bản hiện trường" (trang 1 và 2) và "Biên bản xử phạt" (trang 3). Nội dung cho 3 cột B, C và D của sheet trong tập tin "Danh mục" là lấy từ 1 cột duy nhất - cột Data!B của tập tin Excel gốc - tương ứng với "Tên", "Số" và "ngày tháng".
Tôi đề nghị:
1. Không có chuyện mỗi lần chạy code là tạo tập tin "Danh muc.xlsx". Tập tin này chỉ có 1 và bạn tự tạo. Khi chạy code thì code sẽ xóa trong "Danh muc.xlsx" sheet có tên là Trang Chu!B2 nếu đã có, và tạo mới sheet có tên như thế.

2. Không "đánh dấu" 3 mã "Tên", "Số" và "ngày tháng" bằng mầu. Trong tập tin File_Mau riêng 3 trường "Tên", "Số" và "ngày tháng" sẽ có các tiền tố "tenvb_", "sovb_" và "ngayvb_". Tức trong tập tin ví dụ sẽ phải là: [tenvb_TÊN BIÊN BẢN], [sovb_số bb], [ngayvb_ngày, tháng, năm] và ... [tenvb_BIÊN BẢN XỬ PHẠT], [sovb_bbxp], [ngayvb_ngày…tháng…. Năm xp]. Các mã khác không được phép có 3 tền tố "tenvb_", "sovb_" và "ngayvb_"

Để giải quyết yêu cầu thứ 3 này thì tốt nhất trong Data!B cần liệt kê các mã theo thứ tự. Trước đó trong khi chờ bổ sung yêu cầu thì tôi đã làm cho yêu cầu thêm bớt mã và tôi đặt các mã mới ở cuối. Do lười sửa lại nên tôi nói thứ tự không cần thiết. Nhưng bây giờ để dễ cho yêu cầu Danh mục thì tôi sẽ liệt kê mã theo thứ tự.

Tôi sẽ thử làm khi bạn khẳng định có chấp nhận các yêu cầu trên của tôi không. Nếu bạn chấp nhận thì gửi lại tập tin File_mau không cần có 3 mầu nhưng phải có 3 tiền tố đã nêu cho 3 mã "Tên", "Số" và "ngày tháng". 3 tiền tố này sẽ giúp xác định vị trí của 3 mã ở cột Data!B. Từ đó chỉ việc dịch sang phải tới cột tương ứng với Trang Chu!B2 được chọn để đọc ra dữ liệu.
 
Upvote 0
Bạn giải thích vẫn còn rối rắm. Nhưng thôi, tôi hình như đã đoán được ý. Tóm lại là bạn có tập tin Word chứa nhiều tài liệu khác nhau. Như trong tập tin Word đính kèm thì có 2 văn bản là "Biên bản hiện trường" (trang 1 và 2) và "Biên bản xử phạt" (trang 3). Nội dung cho 3 cột B, C và D của sheet trong tập tin "Danh mục" là lấy từ 1 cột duy nhất - cột Data!B của tập tin Excel gốc - tương ứng với "Tên", "Số" và "ngày tháng".
Tôi đề nghị:
1. Không có chuyện mỗi lần chạy code là tạo tập tin "Danh muc.xlsx". Tập tin này chỉ có 1 và bạn tự tạo. Khi chạy code thì code sẽ xóa trong "Danh muc.xlsx" sheet có tên là Trang Chu!B2 nếu đã có, và tạo mới sheet có tên như thế.

2. Không "đánh dấu" 3 mã "Tên", "Số" và "ngày tháng" bằng mầu. Trong tập tin File_Mau riêng 3 trường "Tên", "Số" và "ngày tháng" sẽ có các tiền tố "tenvb_", "sovb_" và "ngayvb_". Tức trong tập tin ví dụ sẽ phải là: [tenvb_TÊN BIÊN BẢN], [sovb_số bb], [ngayvb_ngày, tháng, năm] và ... [tenvb_BIÊN BẢN XỬ PHẠT], [sovb_bbxp], [ngayvb_ngày…tháng…. Năm xp]. Các mã khác không được phép có 3 tền tố "tenvb_", "sovb_" và "ngayvb_"

Để giải quyết yêu cầu thứ 3 này thì tốt nhất trong Data!B cần liệt kê các mã theo thứ tự. Trước đó trong khi chờ bổ sung yêu cầu thì tôi đã làm cho yêu cầu thêm bớt mã và tôi đặt các mã mới ở cuối. Do lười sửa lại nên tôi nói thứ tự không cần thiết. Nhưng bây giờ để dễ cho yêu cầu Danh mục thì tôi sẽ liệt kê mã theo thứ tự.

Tôi sẽ thử làm khi bạn khẳng định có chấp nhận các yêu cầu trên của tôi không. Nếu bạn chấp nhận thì gửi lại tập tin File_mau không cần có 3 mầu nhưng phải có 3 tiền tố đã nêu cho 3 mã "Tên", "Số" và "ngày tháng". 3 tiền tố này sẽ giúp xác định vị trí của 3 mã ở cột Data!B. Từ đó chỉ việc dịch sang phải tới cột tương ứng với Trang Chu!B2 được chọn để đọc ra dữ liệu.
Vâng em cám ơn Thầy!
Thầy diễn giải rất dễ hiểu và đúng ý của em.
Bạn giải thích vẫn còn rối rắm. Nhưng thôi, tôi hình như đã đoán được ý. Tóm lại là bạn có tập tin Word chứa nhiều tài liệu khác nhau. Như trong tập tin Word đính kèm thì có 2 văn bản là "Biên bản hiện trường" (trang 1 và 2) và "Biên bản xử phạt" (trang 3). Nội dung cho 3 cột B, C và D của sheet trong tập tin "Danh mục" là lấy từ 1 cột duy nhất - cột Data!B của tập tin Excel gốc - tương ứng với "Tên", "Số" và "ngày tháng".
Tôi đề nghị:
1. Không có chuyện mỗi lần chạy code là tạo tập tin "Danh muc.xlsx". Tập tin này chỉ có 1 và bạn tự tạo. Khi chạy code thì code sẽ xóa trong "Danh muc.xlsx" sheet có tên là Trang Chu!B2 nếu đã có, và tạo mới sheet có tên như thế.

2. Không "đánh dấu" 3 mã "Tên", "Số" và "ngày tháng" bằng mầu. Trong tập tin File_Mau riêng 3 trường "Tên", "Số" và "ngày tháng" sẽ có các tiền tố "tenvb_", "sovb_" và "ngayvb_". Tức trong tập tin ví dụ sẽ phải là: [tenvb_TÊN BIÊN BẢN], [sovb_số bb], [ngayvb_ngày, tháng, năm] và ... [tenvb_BIÊN BẢN XỬ PHẠT], [sovb_bbxp], [ngayvb_ngày…tháng…. Năm xp]. Các mã khác không được phép có 3 tền tố "tenvb_", "sovb_" và "ngayvb_"

Để giải quyết yêu cầu thứ 3 này thì tốt nhất trong Data!B cần liệt kê các mã theo thứ tự. Trước đó trong khi chờ bổ sung yêu cầu thì tôi đã làm cho yêu cầu thêm bớt mã và tôi đặt các mã mới ở cuối. Do lười sửa lại nên tôi nói thứ tự không cần thiết. Nhưng bây giờ để dễ cho yêu cầu Danh mục thì tôi sẽ liệt kê mã theo thứ tự.

Tôi sẽ thử làm khi bạn khẳng định có chấp nhận các yêu cầu trên của tôi không. Nếu bạn chấp nhận thì gửi lại tập tin File_mau không cần có 3 mầu nhưng phải có 3 tiền tố đã nêu cho 3 mã "Tên", "Số" và "ngày tháng". 3 tiền tố này sẽ giúp xác định vị trí của 3 mã ở cột Data!B. Từ đó chỉ việc dịch sang phải tới cột tương ứng với Trang Chu!B2 được chọn để đọc ra dữ liệu.
Vâng thầy diễn giải rất dễ hiểu và đúng ý em.
Em rất đồng ý với yêu cầu mà thầy đã nêu trên
Em xin gửi lại file thầy giúp em mới nhé!
 

File đính kèm

Upvote 0
Vâng thầy diễn giải rất dễ hiểu và đúng ý em.
Em rất đồng ý với yêu cầu mà thầy đã nêu trên
Em xin gửi lại file thầy giúp em mới nhé!
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.
 

File đính kèm

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.
Vâng! em cám ơn Thầy.
Em làm như sau:
Em đặt tên các từ khóa có lấy [Key] để xuất ra file Excel có tên "Danh Muc" lần lượt là:
Ở văn bản thứ nhất:
[vanban_TÊN BIÊN BẢN]
[vanban_sovb]
[vanban_ngaythangnam1]

Sang văn bản thứ 2:
[vanban_Xuphat]
[vanban_Sovbxp]
[vanban_ngaythangnam2]

Và chạy Sub Sub ReadKeysFromWord để lấy [key]
Tiếp theo chọn 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
Khi tạo file word mới thì hoàn thành, nhưng khi tạo sheet trong tập tin "Danh Muc.xlsx" thì báo lỗi
Chả hạn chọn tên ô B2 trong sheet TrangChu là "Biên bản hiện trường" thì chỉ xuất hiện sheet "Biên bản hiện trường" trống không có dữ liệu.

Vấn đề thêm từ khóa vào File_Mau và lấy [key] mới thì các nội dung tương ứng với [key] cũ lại bị mất thầy ạ! (như vậy phải điền lại sau mỗi lần chèn thêm từ khóa vào File_Mau) , vấn đề mà thầy đã trả lời ở bài #30: "/ Thêm từ khóa trong File_Mau: trường hợp thêm từ khóa trong File_Mau thì ở sheet Data những từ khóa và các nội dung tương ứng đã được điền trước đó vẫn được giữ nguyên, từ khóa mới thêm vào ở vị trí nào trong File_Mau thì khi lấy [key] sang file excel theo đúng thứ tự từ trên xuống dưới trong trang File_Mau." (em vô ý lại k nhắc lại khi thầy sửa lại dùm em)
Thầy xem giúp em chút ạ!

truoc.png
 

File đính kèm

Lần chỉnh sửa cuối:
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.
 
Lần chỉnh sửa cuối:
Upvote 0
Vâng! em cám ơn Thầy.
Em làm như sau:
Em đặt tên các từ khóa có lấy [Key] để xuất ra file Excel có tên "Danh Muc" lần lượt là:
Ở văn bản thứ nhất:
[vanban_TÊN BIÊN BẢN]
[vanban_sovb]
[vanban_ngaythangnam1]

Sang văn bản thứ 2:
[vanban_Xuphat]
[vanban_Sovbxp]
[vanban_ngaythangnam2]
Bạn không làm đúng như tôi viết.
3 mã kia vẫn là [tenvb_***], [sovb_***] và [ngayvb_***].
Yêu cầu: Ở đầu mỗi văn bản phải có mã [vanban_***]
...
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.

Cái [Vanban_***] là cái mã THÊM vào ở TRƯỚC tất cả các mã hiện có. Mục đích là để đánh dấu điểm đầu của mỗi văn bản. Vì có những văn bản có 2 trang, cái khác 1 trang, cái nữa có thể có 5 trang nên mới phải đánh dấu để code tìm dễ dàng. 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ắc lại: [VANBAN_***] là mã THÊM vào ngoài các mã hiện hành. Tôi không viết là phải đổi tên [tenvb_***], [sovb_***] và [ngayvb_***]. thành [VANBAN_]
Vd.
[VANBAN_hichic]
[tenvb_TÊN BIÊN BẢN]
[sovb_HEHE]
[ngayvb_ngaythangnam1]

Sang văn bản thứ 2:
[vanban_123Blala]
[tenvb_Xuphat]
[sovb_Sovbxp]
[ngayvb_ngaythangnam2]
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn không làm đúng như tôi viết.
3 mã kia vẫn là [tenvb_***], [sovb_***] và [ngayvb_***].


Cái [Vanban_***] là cái mã THÊM vào ở TRƯỚC tất cả các mã hiện có. Mục đích là để đánh dấu điểm đầu của mỗi văn bản. Vì có những văn bản có 2 trang, cái khác 1 trang, cái nữa có thể có 5 trang nên mới phải đánh dấu để code tìm dễ dàng. 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ắc lại: [VANBAN_***] là mã THÊM vào ngoài các mã hiện hành. Tôi không viết là phải đổi tên [tenvb_***], [sovb_***] và [ngayvb_***]. thành [VANBAN_]
Vd.
[VANBAN_hichic]
[tenvb_TÊN BIÊN BẢN]
[sovb_HEHE]
[ngayvb_ngaythangnam1]

Sang văn bản thứ 2:
[vanban_123Blala]
[tenvb_Xuphat]
[sovb_Sovbxp]
[ngayvb_ngaythangnam2]
Dạ! thầy có hướng dẫn : "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. "
Tức là trong File_Mau thì phải thêm [Vanban_***] vào tất cả các mã hay là chỉ các mã để xuất được : "Nội dung văn bản, số văn bản, ngày tháng ban hành" vậy thầy?
Giả sử có 02 biên bản, Nếu chỉ thêm mã vào các mã để xuất được : "Nội dung văn bản, số văn bản, ngày tháng ban hành" vị trí em thêm như vậy đúng không ạ?

12.png13.png
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ! thầy có hướng dẫn : "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. "
Tức là trong File_Mau thì phải thêm [Vanban_***] vào tất cả các mã hay là chỉ các mã để xuất được : "Nội dung văn bản, số văn bản, ngày tháng ban hành" vậy thầy?
Giả sử có 02 biên bản, Nếu chỉ thêm mã vào các mã để xuất được : "Nội dung văn bản, số văn bản, ngày tháng ban hành" vị trí em thêm như vậy đúng không ạ?
Tôi đã viết rõ
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.
Và tôi còn cho vd.
[VANBAN_hichic]
[tenvb_TÊN BIÊN BẢN]
[sovb_HEHE]
[ngayvb_ngaythangnam1]
Sang văn bản thứ 2:
[vanban_123Blala]
[tenvb_Xuphat]
[sovb_Sovbxp]
[ngayvb_ngaythangnam2]

Bạn thấy [VANBAN_hichic] và [vanban_123Blala] xuất hiện mấy lần trong mỗi văn bản?

Và bạn nhìn vào các mã của bạn thì [vanban_1] xuất hiện mấy lần trong văn bản 1, và [vanban_2] xuất hiện mấy lần trong văn bản 2?

Ngoài ra bạn có
[Ten_hientruong]
[so_vbht]
[thoigian_vbht]
[Ten_Xuphat]
[So_vbxp]
[thoigian_xp]
Tôi đã nói rồi. 3 mã "kia" phải có tiền tố lần lượt là "tenvb_", "sovb_" và "ngayvb_".
Bạn nhìn lại ảnh đính kèm có thấy 3 tiền tố kia không?

Nhìn lên đoạn tôi hướng dẫn ở trên là biết phải thế nào.

Tóm lại hãy viết y như trước kia ở bài #35 rồi sau đó THÊM vào đầu mỗi văn bản một mã duy nhất [VANBAN_***]. Thế thôi.

Tôi hướng dẫn lần cuối.

Mã:
[vanban_1][tenvb_hientruong]
[sovb_vbht]
[ngayvb_vbht]
...
[vanban_2][tenvb_Xuphat]
[Sovb_vbxp]
[ngayvb_xp]

Dâng tới tận nơi mà không biết xơi. Bó tay.
 
Upvote 0
Tôi đã viết rõ

Và tôi còn cho vd.


Bạn thấy [VANBAN_hichic] và [vanban_123Blala] xuất hiện mấy lần trong mỗi văn bản?

Và bạn nhìn vào các mã của bạn thì [vanban_1] xuất hiện mấy lần trong văn bản 1, và [vanban_2] xuất hiện mấy lần trong văn bản 2?

Ngoài ra bạn có

Tôi đã nói rồi. 3 mã "kia" phải có tiền tố lần lượt là "tenvb_", "sovb_" và "ngayvb_".
Bạn nhìn lại ảnh đính kèm có thấy 3 tiền tố kia không?

Nhìn lên đoạn tôi hướng dẫn ở trên là biết phải thế nào.

Tóm lại hãy viết y như trước kia ở bài #35 rồi sau đó THÊM vào đầu mỗi văn bản một mã duy nhất [VANBAN_***]. Thế thôi.

Tôi hướng dẫn lần cuối.

Mã:
[vanban_1][tenvb_hientruong]
[sovb_vbht]
[ngayvb_vbht]
...
[vanban_2][tenvb_Xuphat]
[Sovb_vbxp]
[ngayvb_xp]

Dâng tới tận nơi mà không biết xơi. Bó tay.
Dạ! em làm được rồi, rất cám ơn thầy đã hướng dẫn chi tiết.
Chúc thầy sức khỏe và nhiều may mắn!
 
Upvote 0
Tôi đã viết rõ

Và tôi còn cho vd.


Bạn thấy [VANBAN_hichic] và [vanban_123Blala] xuất hiện mấy lần trong mỗi văn bản?

Và bạn nhìn vào các mã của bạn thì [vanban_1] xuất hiện mấy lần trong văn bản 1, và [vanban_2] xuất hiện mấy lần trong văn bản 2?

Ngoài ra bạn có

Tôi đã nói rồi. 3 mã "kia" phải có tiền tố lần lượt là "tenvb_", "sovb_" và "ngayvb_".
Bạn nhìn lại ảnh đính kèm có thấy 3 tiền tố kia không?

Nhìn lên đoạn tôi hướng dẫn ở trên là biết phải thế nào.

Tóm lại hãy viết y như trước kia ở bài #35 rồi sau đó THÊM vào đầu mỗi văn bản một mã duy nhất [VANBAN_***]. Thế thôi.

Tôi hướng dẫn lần cuối.

Mã:
[vanban_1][tenvb_hientruong]
[sovb_vbht]
[ngayvb_vbht]
...
[vanban_2][tenvb_Xuphat]
[Sovb_vbxp]
[ngayvb_xp]

Dâng tới tận nơi mà không biết xơi. Bó tay.
[/QUOTE} Trường hợp [key word] dữ liệu trong excel dài hơn 255 ký tự thì vẫn bị lỗi. A Batman xem dùm khác phục
 
Upvote 0
Tôi đã viết rõ

Và tôi còn cho vd.


Bạn thấy [VANBAN_hichic] và [vanban_123Blala] xuất hiện mấy lần trong mỗi văn bản?

Và bạn nhìn vào các mã của bạn thì [vanban_1] xuất hiện mấy lần trong văn bản 1, và [vanban_2] xuất hiện mấy lần trong văn bản 2?

Ngoài ra bạn có

Tôi đã nói rồi. 3 mã "kia" phải có tiền tố lần lượt là "tenvb_", "sovb_" và "ngayvb_".
Bạn nhìn lại ảnh đính kèm có thấy 3 tiền tố kia không?

Nhìn lên đoạn tôi hướng dẫn ở trên là biết phải thế nào.

Tóm lại hãy viết y như trước kia ở bài #35 rồi sau đó THÊM vào đầu mỗi văn bản một mã duy nhất [VANBAN_***]. Thế thôi.

Tôi hướng dẫn lần cuối.

Mã:
[vanban_1][tenvb_hientruong]
[sovb_vbht]
[ngayvb_vbht]
...
[vanban_2][tenvb_Xuphat]
[Sovb_vbxp]
[ngayvb_xp]

Dâng tới tận nơi mà không biết xơi. Bó tay.
Trường hợp [key word] dữ liệu trong excel dài hơn 255 ký tự thì vẫn bị lỗi. A Batman xem dùm khác phục
 
Upvote 0
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

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

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

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
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:


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?
Mấy cái kia dài dài. ừ đúng rùi, theo bài 6 và 24 từ khóa lấy sang exel bị lộn và không theo thứ tự, còn mọi cái thì ok hơn ấy đồng chí ạ.
 
Upvote 0
Mấy cái kia dài dài. ừ đúng rùi, theo bài 6 và 24 từ khóa lấy sang exel bị lộn và không theo thứ tự, còn mọi cái thì ok hơn ấy đồng chí ạ.
Em vừa chuyển sang excel để soạn văn bản nhưng cũng có nhiều vấn đề bất tiện
Không thể như word được
 
Upvote 0
Em vừa chuyển sang excel để soạn văn bản nhưng cũng có nhiều vấn đề bất tiện
Không thể như word được
Đương nhiên là thế rồi, tui vừa thử cứ theo bài 6 với bài 24 cũng tạm ổn, dễ hiểu. Để ý đến cái từ khóa được lấy sang excel, nếu ít thì không sao nhưng nhiều sẽ lộn xộn, vì nó không theo thứ tự : không biết sắp xếp theo kiểu gì hay quy luật ngẫu nghiên?
 
Upvote 0
Đương nhiên là thế rồi, tui vừa thử cứ theo bài 6 với bài 24 cũng tạm ổn, dễ hiểu. Để ý đến cái từ khóa được lấy sang excel, nếu ít thì không sao nhưng nhiều sẽ lộn xộn, vì nó không theo thứ tự : không biết sắp xếp theo kiểu gì hay quy luật ngẫu nghiên?
Em chịu hehe chả hiểu theo quy luật môt tê hay theo a b c d... y z
 
Upvote 0
Chào anh batman1!
Làm phiền anh một chút, anh cho em hỏi từ khóa ở bài # 6 và bài # 24 được lấy từ word sang excel và sắp xếp theo quy luật ngẫu nhiên hay thế nào đó?
Chỉ nên hỏi những cái mình không thể tự làm được. Hỏi cả những cái mình tự làm được là ỷ lại.

Hãy xóa dữ liệu trong cột B (các từ khóa) -> chạy code -> chép kết quả từ cột B sang notepad -> mở Word -> so sánh từng từ khóa trong Word và trong notepad thì sẽ có câu trả lời.
 
Upvote 0
Chỉ nên hỏi những cái mình không thể tự làm được. Hỏi cả những cái mình tự làm được là ỷ lại.

Hãy xóa dữ liệu trong cột B (các từ khóa) -> chạy code -> chép kết quả từ cột B sang notepad -> mở Word -> so sánh từng từ khóa trong Word và trong notepad thì sẽ có câu trả lời.
Vâng, xin anh bớt ít thì giờ, em có vấn đề sau xin được trình bày:
Nếu có thể Xin được anh giúp đỡ một vấn đề duy nhất mà em cần: em đã gộp lại code của #6 và #24 .Mong anh batman1 chỉnh lại code để có thể lấy được từ khóa từ word (File_Mau) sang file Excel khi chạy -> Sub ChuongTrinh mà:
1*) Thứ nhất: từ khóa được sắp xếp theo trình tự trang word từ đầu đến cuối trang, trên cùng một dòng thì theo chiều từ trái qua phải.
2*). Thứ hai: Cái này đã đang có sẵn rồi (khi chèn thêm từ khóa vào word và chạy -> Sub ChuongTrinh để lấy thêm [key] mới vừa được chèn trong word) thì nội trong cột C ứng với từ khóa trong cột B thuộc sheet(Data) sẽ không bị thay đổi .
Một lần nữa, Mong anh giúp đỡ vấn đề duy nhất này.
 

File đính kèm

Upvote 0
Vâng, xin anh bớt ít thì giờ, em có vấn đề sau xin được trình bày:
Nếu có thể Xin được anh giúp đỡ một vấn đề duy nhất mà em cần: em đã gộp lại code của #6 và #24 .Mong anh batman1 chỉnh lại code để có thể lấy được từ khóa từ word (File_Mau) sang file Excel khi chạy -> Sub ChuongTrinh mà:
1*) Thứ nhất: từ khóa được sắp xếp theo trình tự trang word từ đầu đến cuối trang, trên cùng một dòng thì theo chiều từ trái qua phải.
2*). Thứ hai: Cái này đã đang có sẵn rồi (khi chèn thêm từ khóa vào word và chạy -> Sub ChuongTrinh để lấy thêm [key] mới vừa được chèn trong word) thì nội trong cột C ứng với từ khóa trong cột B thuộc sheet(Data) sẽ không bị thay đổi .
Một lần nữa, Mong anh giúp đỡ vấn đề duy nhất này.
Nếu tôi nhớ không nhầm thì cả 2 điều kiện đã được code ở những bài trước thỏa mãn.
 
Upvote 0
Nếu tôi nhớ không nhầm thì cả 2 điều kiện đã được code ở những bài trước thỏa mãn.
Dạ! hiện tại điều kiện thứ hai đã thoả mãn ở bài file em gửi trên, còn điều kiện thứ nhất ở file này chưa được, các key vẫn bị thêm vào không theo thứ tự mong muốn.
Còn ở file mới anh giúp Cat Luong thì code thoả mãn điều kiện thứ hai, và điều kiện thứ nhất, em thấy tên nội dung cần điền chỉ là một tên nhưng cần đến nhiều key khi có nhiều biên bản, với lại trật tự biên bản thay đổi ( em thấy không phù hợp bằng file cũ anh đã giúp ở bài 6 và 24).
Ở file em đăng lên nhờ anh chỉnh sửa giúp để key lấy sang file excel thoả điều kiện một nữa là tốt quá anh ạ!
Em tương tác trên điện thoại nên có thể diễn giải dài dòng.
Mong anh giúp em!
 
Upvote 0
Dạ! hiện tại điều kiện thứ hai đã thoả mãn ở bài file em gửi trên, còn điều kiện thứ nhất ở file này chưa được, các key vẫn bị thêm vào không theo thứ tự mong muốn.
Còn ở file mới anh giúp Cat Luong thì code thoả mãn điều kiện thứ hai, và điều kiện thứ nhất, em thấy tên nội dung cần điền chỉ là một tên nhưng cần đến nhiều key khi có nhiều biên bản, với lại trật tự biên bản thay đổi ( em thấy không phù hợp bằng file cũ anh đã giúp ở bài 6 và 24).
Ở file em đăng lên nhờ anh chỉnh sửa giúp để key lấy sang file excel thoả điều kiện một nữa là tốt quá anh ạ!
Em tương tác trên điện thoại nên có thể diễn giải dài dòng.
Mong anh giúp em!
Tôi chỉ làm thế thôi. Với mỗi người tôi đã cho nhiều cơ hội phát biểu yêu cầu, thỏa thuận cụ thể rồi tôi mới viết code. Bây giờ lại nghĩ lại muốn chỉnh sửa, thêm yêu cầu, hoặc người mới tham gia muốn theo ý mình thì suốt đời tôi chỉ ngồi viết code theo yêu cầu của từng người, theo từng thời điểm.

Cứ mở chủ đề mới, ai thích trả lời thì trả lời. Nếu lúc đó tôi tham gia thì là do tôi muốn chứ không phải là do ai đó muốn tôi phải tham gia.
 
Upvote 0
Tôi chỉ làm thế thôi. Với mỗi người tôi đã cho nhiều cơ hội phát biểu yêu cầu, thỏa thuận cụ thể rồi tôi mới viết code. Bây giờ lại nghĩ lại muốn chỉnh sửa, thêm yêu cầu, hoặc người mới tham gia muốn theo ý mình thì suốt đời tôi chỉ ngồi viết code theo yêu cầu của từng người, theo từng thời điểm.

Cứ mở chủ đề mới, ai thích trả lời thì trả lời. Nếu lúc đó tôi tham gia thì là do tôi muốn chứ không phải là do ai đó muốn tôi phải tham gia.
Dạ! Anh nói vậy là rất đúng. Bởi mỗi người một ý thì cũng khó, không biết làm thế nào.
Nói thật em chả biết gì về lập trình VBA nên nhìn không hiểu gì.
Em thấy cái liên kết giữa Worf và Excel này chắc còn khó hơn khi chỉ đơn thuần là mỗi VBA trong excel do nó có liên quan đến Word.
Cả chủ đề này thấy có anh là tương tác trợ giúp nên em cũng không biết nhờ ai.
Thực ra Em cần và thấy nó hợp lý và cũng dễ quản lý và sử dụng hơn nên nhờ anh duy nhất một lần trong chủ đề này.
Anh giúp em nốt vấn đề này mới nhé! Duy nhất lần này thôi ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ! Anh nói vậy là rất đúng. Bởi mỗi người một ý thì cũng khó, không biết làm thế nào.
Nói thật em chả biết gì về lập trình VBA nên nhìn không hiểu gì.
Em thấy cái liên kết giữa Worf và Excel này chắc còn khó hơn khi chỉ đơn thuần là mỗi VBA trong excel do nó có liên quan đến Word.
Cả chủ đề này thấy có anh là tương tác trợ giúp nên em cũng không biết nhờ ai.
Thực ra Em cần và thấy nó hợp lý và cũng dễ quản lý và sử dụng hơn nên nhờ anh duy nhất một lần trong chủ đề này.
Anh giúp em nốt vấn đề này mới nhé! Duy nhất lần này thôi ạ!
Tôi chỉ làm thế thôi. Với mỗi người tôi đã cho nhiều cơ hội phát biểu yêu cầu, thỏa thuận cụ thể rồi tôi mới viết code. Bây giờ lại nghĩ lại muốn chỉnh sửa, thêm yêu cầu, hoặc người mới tham gia muốn theo ý mình thì suốt đời tôi chỉ ngồi viết code theo yêu cầu của từng người, theo từng thời điểm.

Cứ mở chủ đề mới, ai thích trả lời thì trả lời. Nếu lúc đó tôi tham gia thì là do tôi muốn chứ không phải là do ai đó muốn tôi phải tham gia.
Xin phép anh batman1 và bạn Cát Lượng em lập thêm chủ đề mới.
Nhờ ý tưởng của bạn Cát Lượng, nếu có thời gian mong anh batman1 giúp em. Em vẫn hy vọng em anh sẽ giúp em.
 
Upvote 0
Xin phép anh batman1 và bạn Cát Lượng em lập thêm chủ đề mới.
Nhờ ý tưởng của bạn Cát Lượng, nếu có thời gian mong anh batman1 giúp em. Em vẫn hy vọng em anh sẽ giúp em.
He he vác cẳng đi chơi đi anh
Để đó em ngâm cứu cho thời gian tới trong tương lai khi nào đủ trình đây sẽ giúp ha ha:wheelchair:
 
Upvote 0

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

Back
Top Bottom