2014-03-29 24 views
0

我在構建的基於excel的應用程序中廣泛使用以下子代。它要麼打印出傳遞給它的值,要麼將值傳遞給另一個函數,如果它太長而不適合單元格。在VBA中打印可疑字符串時出現應用程序定義或對象定義的錯誤

Sub printValue(ws As Worksheet, row As Long, column As Long, value As String) 
    If Len(value) > 32767 Then 
     printOverflowString ws, row, column, value 
    Else 
     ws.Cells(row, column).value = value 
    End If 
End Sub 

的問題是,有時,沒有圖案,無韻,而且沒有理由,就行了

ws.Cells(row, column).value = value 

這種情況經常處理時引發一個應用程序定義或對象定義的錯誤Twitter的帖子,以及傾向於打破它的字符串的類型看起來像注入攻擊可疑。這裏有一個例子:

Watch : :   Value : "=Lady Gaga vs Demi Lovato, Whos Right In the Vomit War? http://t.co/lx9FbKhUYv" : String : Tools.printValue 

所以很明顯,我需要消毒串有點多,但我真的不知道如何去這樣做。刪除所有標點符號不是一個選項,我需要打印功能仍然儘可能快。

任何指向正確的方向都會有很大的幫助!

回答

0

使用你的代碼,我無法用你的例子重新創建問題(我讓它執行1,000次子程序)。爲了澄清,你不是'打印'一個值,你只是放在一個單元格中。如果在您嘗試打印時出現問題,那麼這是一個完全不同的故事/解決方案。你有幾個選擇:(1)如果真的是隨機的,那麼再次嘗試子程序; (2)或嘗試找出造成問題的字符或組合。以下代碼在您的子例程中放置了一個錯誤陷阱,然後重試該命令五次。如果你發現'隱藏'你的問題,那麼很好。如果你得到消息框,那麼你可以添加代碼去除一些字符並重試。

P.S.使用保留字命名變量是一個非常糟糕的主意。你使用行,列,值;我會使用lRow,lCol,strValue。

Sub printValue(ws As Worksheet, row As Long, column As Long, value As String) 
    Dim iRetryCount  As Integer 
    On Error GoTo Error_Trap 
    iRetryCount = 5 
    If Len(value) > 32767 Then 
     printOverflowString ws, row, column, value 
    Else 
     ws.Cells(row, column).value = value 
    End If 
    Exit Sub 
Error_Trap: 
    Debug.Print Err.Number & vbTab & Err.Description 
    iRetryCount = iRetryCount - 1 
    If iRetryCount = 0 Then 
     MsgBox "Add some code to figure out what the cause is", vbOKOnly, "Still Getting Error" 
     Exit Sub 
    Else 
     DoEvents 
     Resume 
    End If 
End Sub 
+0

偉大的建議。出於好奇,使用這些保留字可能會發生什麼?我一直沒有任何問題,但現在你讓我擔心... – ebrts

+1

你可以得到'奇怪的結果'...有點像目前的情況。在開發代碼時遵循一些簡單的標準是一種很好的習慣 - 你永遠不知道什麼時候可能有其他人試圖找出某些東西。我的'熱門'列表是:(1)總是使用'​​Option Explicit',因此不存在如何定義變量的假設; (2)切勿使用保留字; (3)定義變量時,在名字上加一個標準的前綴(比如lng代表Long,int代表Integer,str代表String等)(你可以懶惰,只用l,i,s);等等。生活更輕鬆哦,沒有'Dim sname,ddate,iCtr as Integer'! –

相關問題