2014-12-24 24 views
8

Bounty Soru:Neden Application.Clean() yazdırılabilir karakterleri kaldırır?

makul bir açıklama sağlayan bir cevap olsa da, ben Clean() bir WorksheetFunction ve bu konuda arkasındaki mantık, çünkü dize kısaltma meydana olmadığını belirlemek istiyorum. VBA tarafından çağrıldığında WorksheetFunctions Do null Chr(0) de hangi kesilir konuşmak için bir "hücre" içine dizesi geçmek?

Orijinal Soru:

Neden TestIt 'ın Application.Clean yöntemi, yazdırılabilir olsa Chr(0) sonra tüm karakterleri kaldırır? TestIt2, null Chr(0)'da bir değiştirdikten sonra doğru 8 karakter döndürür.

Düzenleme: Dikkate değer özellikleri
Excel bazı sürümleri Application.WorksheetFunction.Clean()
bu hatayı test etmek yazmanızı gerektirir olmasıdır.

Kod

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 

ve

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

Ben sadece spekülasyon olabilir Bu genellikle yönetilmeyen dünyada olduğu dize terminatör olarak, 'nNullChar' anlıyor. Bunun yerine 'Char (1)' kullanırsanız, yalnızca bir karakteri kaldırır. Belgelenen bir davranış olsa da. – GSerg

+1

İyi düzenleme. [Uygulama, Temiz bir yönteme sahip değil] çünkü patlama yapmak üzereydim (http://msdn.microsoft.com/en-us/library/office/ff198091 (v = office.15) .aspx). – RubberDuck

+0

@RubberDuck. Bir 'Temiz 'yöntemine sahiptir. Sadece belgelenmemiş. Diğer örnekler 'Debug.Print Application.Pi' –

cevap

2

Bunun cevabı çok basit görünüyor: chr(0)'u izleyen tüm karakterleri kaldırmak bir hatadır. VBA dil referans gösterildiği gibi

Clean, SADECE chr(0) yanı sıra diğer basılmayan karakterleri kaldırmak için tasarlanmıştır:

Temiz fonksiyonu 7 bit ASCII ilk 32 Basılamayan karakterleri kaldırmak için dizayn edilmiştir

metinden kod (0'dan 31'e kadar olan değerler). Açıkça aşağıdaki tüm karakterleri kaldırır bundan sonra chr(0) HARİÇ diğer sözü chr() tüm değerleri için beklendiği gibi

Clean çalışır.

Boş değerle çalışmanız gerekiyorsa, bir tür dönüştürme gerekli olacaktır. (Bu kaldırmak için dizayn edilmiştir Clean diğer 31 chr() kodlarının tümü için olduğu gibi ve) beklendiği gibi sonuç çalışır, bundan sonra TryIt = Replace(TryIt, Chr(0), Chr(1)) gibi bir şey yaparak beklenen sonucu alabilirsiniz:

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 hakkı BOŞ karakteriyle sonlandırılır

Visual Basic olamaz sap dizeleri yukarıdaki açıklamalar yer almaktadır. Aslında tüm DLL'ler dizeleri bu şekilde sonlandırır. Chr(0), dizeler için sonlandırma karakteri olarak kabul edilir.

İşte bunu kontrol etmenin en iyi yolu.

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 

Bu

hücrenin en iyi yolu bunu yapıyor gibi ele etmektir A1

sadece "Test" yazacak. .Replace kullanın. Diğer alternatif (daha uzun) yol INSTR kullanmaktır.

+0

Neden '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – Chrismas007

+0

Bu 'Clean'in hatası değil. Ben 'Visual Basic bir NULL karakter tarafından sonlandırıldı dizeleri işlemek olamaz' gibi Ve sorun nerede ortaya çıkar ... –

+2

Visual Basic dizeleri bir null terminator ile işlemek ve işlemek. Bu amaçla, Visual Basic, dizenin uzunluğunu dize verileriyle birlikte saklayan BSTR dize türünü kullanır. BSTR'yi destekleyen tüm donanımlar da başa çıkacaktır - bu tüm OLE Otomasyon kütüphanelerini içerir. Boş sonlandırıcıda bir kesinti olursa, bu VB dışında olur. Örneğin. Excel, hücresinde boş sonlandırıcıya sahip olamaz, ancak bu farklı bir öyküdür ve Excel'in uyguladığı ek bir kısıtlamadır çünkü VB ve OLE, boş karakterle başa çıkabilir. – GSerg

İlgili konular