Cuối cùng tôi đã quyết định sao chép từng chữ một. FormattedText dường như hoạt động khá tốt, cho đến khi từ cuối cùng (một số ký tự đặc biệt (rõ ràng), nơi đột nhiên ô mà tôi vừa điền với nội dung đã sao chép sẽ bị trống. Khi tôi tăng số lượng ô, các lỗi thời gian chạy khác sẽ xuất hiện, như bảng của bạn bị hỏng và các lỗi khác không rõ ràng. Bằng cách nào đó, các tế bào nguồn mà tôi đã sao chép từ luôn luôn dường như có những ký tự đặc biệt cuối cùng với mã ASCII 13 và 7. Tôi biết những gì 13 có nghĩa là, nhưng 7? Dù sao, tôi quyết định sao chép tất cả mọi thứ ngoài ký tự cuối cùng này với mã 7. Có vẻ như nó hoạt động tốt. Cả định dạng và trường đều được sao chép. Trong mọi trường hợp, toàn bộ câu chuyện đã chứng minh cho tôi một lần nữa rằng lập trình trong VBA chủ yếu là thử nghiệm và lỗi nghề nghiệp. Bạn không bao giờ chắc chắn khi có điều gì đó có thể phá vỡ .. trừ khi tôi thiếu thông tin cập nhật về một số khái niệm quan trọng ..
Đây là các đoạn mã tôi đã sử dụng. Ý tưởng là đầu tiên chúng tôi có một tài liệu với một bảng ô 1x1 duy nhất, với một số nội dung văn bản phong phú. Trong phần đầu tiên của mã (bên trong macro) Tôi nhân tế bào:
(Chú ý rằng tôi đặt // vào trước mỗi apostrophe loại VB comment để các bình luận sẽ được tô màu một cách chính xác)
Dim cur_width As Integer, i As Integer, max_cells As Integer, cur_row As Integer
Dim origin_width As Integer
If ActiveDocument.Tables.Count = 1 _
And ActiveDocument.Tables(1).Rows.Count = 1 _
And ActiveDocument.Tables(1).Columns.Count = 1 _
Then
max_cells = 7 //' how many times we are going to "clone" the original content
i = 2 //' current cell count - starting from 2 since the cell with the original content is cell number 1
cur_width = -1 //' current width
cur_row = 1 //' current row count
origin_width = ActiveDocument.Tables(1).Rows(1).Cells(1).Width
//' loop for each row
While i <= max_cells
//' adjust current width
If cur_row = 1 Then
cur_width = origin_width
Else
cur_width = 0
End If
//' loop for each cell - as long as we have space, add cells horizontally
While i <= max_cells And cur_width + origin_width < ActiveDocument.PageSetup.PageWidth
Dim col As Integer
//' \ returns floor() of the result
col = i \ ActiveDocument.Tables(1).Rows.Count
// 'add cell, if it is not already created (which happens when we add rows)
If ActiveDocument.Tables(1).Rows(cur_row).Cells.Count < col Then
ActiveDocument.Tables(1).Rows(cur_row).Cells.Add
End If
// 'adjust new cell width (probably unnecessary
With ActiveDocument.Tables(1).Rows(cur_row).Cells(col)
.Width = origin_width
End With
// 'keep track of the current width
cur_width = cur_width + origin_width
i = i + 1
Wend
//' when we don't have any horizontal space left, add row
If i <= max_cells Then
ActiveDocument.Tables(1).Rows.Add
cur_row = cur_row + 1
End If
Wend
End If
trong phần thứ hai của vĩ mô tôi cư mỗi ô trống với các nội dung của ô đầu tiên:
//' duplicate the contents of the first cell to other cells
Dim r As Row
Dim c As Cell
Dim b As Boolean
Dim w As Range
Dim rn As Range
b = False
i = 1
For Each r In ActiveDocument.Tables(1).Rows
For Each c In r.Cells
If i <= max_cells Then
// ' don't copy first cell to itself
If b = True Then
//' copy everything word by word
For Each w In ActiveDocument.Tables(1).Rows(1).Cells(1).Range.Words
//' get the last bit of formatted text in the destination cell, as range
//' do it first by getting the whole range of the cell, then collapsing it
//' so that it is now the very end of the cell, and moving it one character
//' before (because collapsing moves the range actually beyond the last character of the range)
Set rn = c.Range
rn.Collapse Direction:=wdCollapseEnd
rn.MoveEnd Unit:=wdCharacter, Count:=-1
//' somehow the last word of the contents of the cell is always Chr(13) & Chr(7)
//' and especially Chr(7) causes some very strange and murky problems
//' I end up avoiding them by not copying the last character, and by setting as a rule
//' that the contents of the first cell should always contain an empty line in the end
If c.Range.Words.Count <> ActiveDocument.Tables(1).Rows(1).Cells(1).Range.Words.Count Then
rn.FormattedText = w
Else
//'MsgBox "The strange text is: " & w.Text
//'the two byte values of this text (which obviously contains special characters with special
//'meaning to Word can be found (and watched) with
//'AscB(Mid(w.Text, 1, 1)) and AscB(Mid(w.Text, 2, 1))
w.MoveEnd Unit:=WdUnits.wdCharacter, Count:=-1
rn.FormattedText = w
End If
Next w
End If
b = True
End If
i = i + 1
Next c
Next r
Dưới đây là những hình ảnh của các tài liệu Word trong câu hỏi. Hình ảnh đầu tiên là trước khi chạy macro, thứ hai là giữa đoạn mã đầu tiên và đoạn cuối cùng, trong khi hình ảnh thứ ba là tài liệu kết quả.
Image 1 Image 2 Image 3
Vậy là xong.
tốt để làm, nhưng hãy để rõ ràng, nó không "chính thức cau mày" của nó hoàn toàn không được hỗ trợ và sẽ sớm hay muộn gây ra thành phần của bạn thất bại ... có lẽ khi bạn không muốn nó. –
tôi đồng ý :) và có, nó gây ra cho chúng tôi rất nhiều vấn đề. nhưng bạn biết nó như thế nào - chúng tôi bị mắc kẹt với nó năm trước - và vẫn phải hỗ trợ nó ngay bây giờ - tất nhiên chúng tôi sẽ không thực hành cách tiếp cận tương tự trong tương lai –