2014-12-24 15 views
8

Bounty Câu hỏi:Tại sao Application.Clean() xóa các ký tự có thể in?

Trong khi có một câu trả lời mà cung cấp một lời giải thích hợp lý, tôi muốn để xác định xem phần cụt của chuỗi xảy ra vì Clean() là một WorksheetFunction và lý do đằng sau vấn đề đó. Làm WorksheetFunctions khi được gọi bằng cách VBA chuyển chuỗi vào một "ô" để nói cắt cụ nào tại số null Chr(0)?

Câu hỏi gốc:

Tại sao Application.Clean phương pháp TestIt 's loại bỏ tất cả các ký tự sau Chr(0) mặc dù họ có thể in được? TestIt2 trả về đúng 8 ký tự sau khi thực hiện thay thế trên null Chr(0).

Edit:
Cần lưu ý là một số phiên bản của Excel sẽ yêu cầu bạn phải viết Application.WorksheetFunction.Clean()
để kiểm tra lỗi này.

Sub TestIt() 
    Dim TryIt As String 

    TryIt = "Test" & Chr(0) & "asdf" 
    MsgBox Len(TryIt) 'Prints 9 
    TryIt = Application.Clean(TryIt) 
    MsgBox Len(TryIt) 'Prints 4 

End Sub 

Sub TestIt2() 
    Dim TryIt As String 

    TryIt = "Test" & Chr(0) & "asdf" 
    MsgBox Len(TryIt) 'Prints 9 
    TryIt = Replace(TryIt, Chr(0), "") 
    MsgBox Len(TryIt) 'Prints 8 

End Sub 
+1

tôi chỉ có thể suy đoán rằng nó hiểu 'vbNullChar' là terminator chuỗi, mà nó thường là trong thế giới không được quản lý. Nếu bạn sử dụng 'Char (1)' thay vào đó, nó chỉ loại bỏ một ký tự đó. Không phải là một hành vi được ghi nhận. – GSerg

+1

Chỉnh sửa tốt. Tôi sắp nổ tung bạn bởi vì [Ứng dụng không có một phương pháp sạch] (http://msdn.microsoft.com/en-us/library/office/ff198091 (v = office.15) .aspx). – RubberDuck

+0

@RubberDuck. Nó có phương thức 'Clean'. Nó chỉ là nó không phải là tài liệu. Các ví dụ khác là 'Debug.Print Application.Pi' –

Trả lời

2

Câu trả lời cho câu hỏi này có vẻ rất đơn giản: xóa tất cả các ký tự sau chr(0) là lỗi.

Clean được thiết kế để JUST loại bỏ chr(0) cũng như ký tự không in khác, như đã nêu trong tài liệu tham khảo ngôn ngữ VBA:

Chức năng sạch được thiết kế để loại bỏ các 32 ký tự không in đầu tiên trong ASCII 7-bit mã (giá trị 0 đến 31) từ văn bản.

Clean công trình như mong đợi cho tất cả các đề cập chr() giá trị khác TRỪ chr(0) sau đó nó loại bỏ rõ ràng tất cả các ký tự sau.

Nếu bạn phải làm việc với giá trị null, một số loại chuyển đổi sẽ là cần thiết. Bạn có thể nhận được kết quả mong đợi bằng cách làm một cái gì đó giống như TryIt = Replace(TryIt, Chr(0), Chr(1)) sau đó kết quả làm việc như mong đợi (và vì nó làm cho tất cả các 31 chr() mã khác mà Clean được thiết kế để loại bỏ):

Sub TestIt3() 

Dim TryIt As String 
Dim iCounter As Integer 

For iCounter = 0 To 31 
    TryIt = "Test" & Chr(iCounter) & "asdf" 
    TryIt = Replace(TryIt, Chr(0), Chr(1)) 
    Debug.Print "chr(" & iCounter & ")" & " " & Len(TryIt) 
    TryIt = Application.Clean(TryIt) 
    Debug.Print "cleaned - chr(" & iCounter & ")" & " " & Len(TryIt) 
Next iCounter 

End Sub 
3

@Gserg là đúng trong các ý kiến ​​trên

Visual Basic không thể xử lý chuỗi chấm dứt bởi một nhân vật NULL. Trong thực tế tất cả các DLL chấm dứt chuỗi theo cách đó. Chr(0) được coi là ký tự kết thúc cho chuỗi.

Đây là cách tốt nhất để kiểm tra.

Sub TestIt() 
    Dim TryIt As String 

    TryIt = "Test" & Chr(0) & "asdf" 

    Debug.Print Len(TryIt) 
    Debug.Print TryIt 

    ThisWorkbook.Sheets(1).Range("A1").Value = TryIt 
End Sub 

này sẽ viết chỉ là "thử nghiệm" trong phòng giam A1

Cách tốt nhất là để xử lý nó như bạn đang làm việc đó. Sử dụng .Replace. Cách thay thế khác (dài hơn) là sử dụng INSTR.

+0

Tại sao 'Clean()' không tìm ký tự theo ký tự nhưng 'Replace()' làm gì? – Chrismas007

+0

Nó không phải là lỗi của 'Clean'. Giống như tôi đã đề cập 'Visual Basic không thể xử lý chuỗi chấm dứt bởi một nhân vật NULL' Và đó là nơi mà vấn đề phát sinh ... –

+2

Visual Basic có thể và sẽ xử lý các chuỗi với một terminator null. Với mục đích này, Visual Basic sử dụng kiểu chuỗi BSTR lưu trữ độ dài của chuỗi cùng với dữ liệu chuỗi. Tất cả các dll hỗ trợ BSTR cũng sẽ đối phó - điều này bao gồm tất cả các thư viện Tự động hóa OLE. Nếu một truncation xảy ra trên null terminator, điều đó xảy ra bên ngoài VB. Ví dụ. Excel không thể có null terminator bên trong ô của nó, nhưng đó là một câu chuyện khác và là một hạn chế bổ sung mà Excel áp đặt vì nó cảm thấy như nó - mặc dù cả VB và OLE đều có thể xử lý ký tự null. – GSerg

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