Lỗi với Excel VBA ActiveSheet.Range("A1").PasteSpecial xlPasteValues: Dán nhiều hơn chỉ giá trị.
Báo cáo về một lỗi nghi ngờ xảy ra với phiên bản Excel 2005 mới nhất (Build 12827.20268 Click-to-Run).
>Sử dụng Excel VBA...>
>Lệnh này dán cả giá trị *và* định dạng, mà *chỉ nên* dán giá trị: >ActiveSheet.Range("A1").PasteSpecial xlPasteValues >
>Lệnh này CHỈ dán giá trị, *đáng lẽ* phải dán cả giá trị và định dạng số: >ActiveSheet.Range("A1").PasteSpecial xlPasteValuesAndNumberFormats >
>
Tôi cũng phát hiện ra một vấn đề khi sử dụng xlPasteFormulas, hàm này dán dữ liệu dưới dạng hình ảnh. Tôi chưa thử các tùy chọn khác, nhưng đề nghị thực hiện kiểm thử hồi quy.
Nếu đây không phải là nơi thích hợp để báo cáo lỗi nghi ngờ, vui lòng cho chúng tôi biết.
Cảm ơn!
Trả lời:
Tôi không thể tái hiện hành vi bất thường mà bạn đã báo cáo, nhưng tôi có thể đề xuất một giải pháp thay thế giúp tránh hành vi đó đồng thời làm cho mã của bạn hiệu quả hơn bằng cách loại bỏ clipboard. Hãy sử dụng truyền giá trị trực tiếp với thuộc tính Range.Value hoặc Range.Value2 .
Việc sử dụng .Value sẽ giữ lại một số thông tin nhỏ trong ô, chẳng hạn như giữ nguyên ngày tháng hoặc đơn vị tiền tệ. Thuộc tính .Value2 sẽ loại bỏ tất cả thông tin ngoài giá trị thô ban đầu của ô.
Range("A1") = Range("B1").Value 'để lại một ngày tháng
Range("A1") = Range("B1").Value2 'chuyển đổi ngày tháng thành số nguyên
Cả hai phương pháp đều hiệu quả hơn đáng kể so với bất kỳ thao tác Sao chép & Dán/Dán Đặc biệt nào vì chúng không liên quan đến clipboard. .Value2 hiệu quả hơn một chút so với .Value nhưng bạn phải xử lý hàng chục nghìn ô thì lợi thế của nó mới trở nên rõ rệt.
Có những kênh để báo cáo hành vi sai trái trực tiếp cho Microsoft nhưng tôi sẽ không đề cập đến chúng ở đây vì tôi cảm thấy chúng chỉ là lãng phí thời gian của bạn; chỉ là những việc làm vô bổ đối với những người không có quyền.
Nhân tiện, hành vi giữ nguyên định dạng số ô có thể được tái hiện bằng cách sử dụng một liên kết đơn giản (ví dụ: =B1) nhưng hành vi đó là do thiết kế. Có lẽ điều đó có liên quan đến vấn đề này. Thành thật mà nói, tôi hoàn toàn không hiểu làm thế nào việc dán công thức lại biến thành dán hình ảnh vì dán hình ảnh của nguồn thậm chí không phải là lệnh PasteSpecial.
Phụ lục:
>Không có gì nhanh hơn việc chuyển giao giá trị trực tiếp với .Value2.
Với phạm vi ("B2:B30000")
Range("A2").Resize(.Rows.count, .Columns.Count) = .Value2
Kết thúc bằng
>Đoạn mã trên điều chỉnh kích thước mục tiêu sao cho phù hợp với nguồn.
Comments
Post a Comment