2013-06-07 35 views
5

Sử dụng VBA, tôi đang sao chép các giá trị của một tế bào khác:Làm cách nào để sao chép các ô Excel có định dạng văn bản đa dạng thức nhưng không phải định dạng ô chung?

Dim s As Range 
Dim d As Range 
Set s = Range("A1") 
Set d = Range("B2") 
d.Value = s.Value 

này hoạt động tốt, nhưng nếu nguồn chứa định dạng văn bản phong phú, định dạng bị mất.

tôi có thể sao chép toàn bộ tế bào, định dạng và tất cả:

s.Copy d 

Nhưng điều này mang theo không chỉ là định dạng văn bản phong phú, nhưng cũng toàn cầu định dạng trên di động - màu nền, biên giới, vv Tôi chỉ quan tâm đến việc sao chép các định dạng áp dụng cho các phần của văn bản (ví dụ: một từ trong câu được in đậm).

Tôi cũng đã cố gắng sao chép định dạng của từng nhân vật:

For ci = 1 to Len(sourcevalue) 
    d.Characters(ci, 1).Font.Bold = s.Characters(ci, 1).Font.Bold 
Next 

Mã thực tế cho trên đã bao gồm chữ in nghiêng, gạch chân, vv, và lưu trữ ký tự() như một đối tượng cho tốc độ, nhưng vẫn , hiệu suất là cách quá chậm để sử dụng sản xuất.

Tùy chọn cuối cùng tôi có thể nghĩ là để sao chép các tế bào với định dạng, sau đó undo bất kỳ thay đổi màu nền hoặc mẫu, biên giới, tên font/size, v.v .:

bg = d.Interior.ColorIndex 
s.Copy d 
d.Interior.ColorIndex = bg 

này vẫn có vẻ kludgy, rất khó để lưu tất cả các định dạng được áp dụng lại và tôi không thể "hoàn tác" định dạng như in đậm, in nghiêng, v.v. có thể được áp dụng ở cấp ô hoặc ký tự mà không xóa ký tự- cài đặt mức độ.

Có tùy chọn nào khác không? Định dạng trong tệp Excel OpenOfficeXML được lưu trữ với phạm vi ký tự, nhưng nó không xuất hiện các phạm vi được định dạng này có sẵn thông qua API, ít nhất là theo tôi có thể tìm thấy.

Edit: Sử dụng phương pháp KazJaw của dưới đây, tôi đã có thể có được những gì tôi cần thiết với đoạn mã sau:

Dim TmpFormat As Range 
Set TmpFormat = Range("$XFD$1") 
Dest.Copy 
TmpFormat.PasteSpecial xlPasteFormats 
Source.Copy 
Dest.PasteSpecial xlPasteAll 
TmpFormat.Copy 
Dest.PasteSpecial xlPasteFormats 
Dest.Font.Name = TmpFormat.Font.Name 
Dest.Font.Size = TmpFormat.Font.Size 
TmpFormat.ClearFormats 

này tạm thời giữ gìn dạng tế bào của tế bào đích đến của tôi trong ô cuối cùng của người đầu tiên hàng, sao chép nguồn với tất cả định dạng, bột nhão trở lại định dạng trong ô tạm thời và cuối cùng cũng sao chép lại phông chữ và kích thước được giữ nguyên (trong trường hợp này tôi không muốn sao chép từ nguồn). Cuối cùng, ô tạm thời được xóa để nó không ảnh hưởng đến kích thước trang tính.

Đó là một giải pháp không hoàn hảo, đặc biệt là vì nó dựa vào clipboard, nhưng hiệu suất là tốt và nó làm những gì nó cần phải làm.

+1

Nó có thể là nhanh hơn để sử dụng phương pháp "lặp qua các ký tự" nếu bạn chỉ định dạng các phần * theo kiểu * (ví dụ: không sao chép đậm = false nhưng chỉ áp dụng trong đó bold = true) và áp dụng định dạng cho các nhóm ký tự (ví dụ: in đậm toàn bộ từ trong một bước thay vì thư từng chữ cái –

+0

Điểm tốt @Tim, và tôi đã đi xuống con đường đó. Thật không may, vấn đề hiệu suất trong Excel là trong * đọc * các ký tự(). Đối tượng phông chữ, không chỉ thiết lập các định dạng. – richardtallent

Trả lời

4

Tôi vừa thực hiện một số thử nghiệm và tôi hơi ngạc nhiên với kết quả có thể là giải pháp cho bạn hoặc chỉ là mẹo để khám phá thêm.

Hãy tưởng tượng chúng ta có tình trạng này ngay từ đầu:

enter image description here

Nếu bạn chạy mã đơn giản này: ...

Sub PossibleSolution() 

    Range("A1").Copy  'full formatted cell 
    Range("A3").PasteSpecial xlPasteAll 
    Range("A2").Copy  'clear format cell 
    Range("A3").PasteSpecial xlPasteFormats 

End Sub 

... bạn sẽ nhận được kết quả sau:

enter image description here

+0

Cảm ơn, điều đó đã xảy ra! Tôi đã phải thực hiện một số điều chỉnh, tôi đặt chúng trong câu hỏi ban đầu. – richardtallent

2

Range.Value có một tùy chọn RangeValueDataType tham số (11 là xlRangeValueXMLSpreadsheet):

Range("B2").Value(11) = Range("A1").Value(11) 
+0

Tôi không biết điều này đã tồn tại. Cảm ơn! –

Các vấn đề liên quan