2011-04-27 114 views
0

我想將< = 1000個字符的結果拆分爲大小爲255的數組,然後使用該字段更新數據庫中的字段。VBA +字符串拆分

VBA中的字符串最多支持255個字符,那麼我該怎麼做呢?

我正在使用MS-Access 2007作爲我的數據庫,要更新的字段類型是備忘錄,所以它可以存儲超過255個字符,我已經檢查了這一點。

這是我的查詢是什麼樣子

Coalsce(""SELECT (parentdesc & '/' & keyword) FROM All_Keywords_Mapping where item_id=" & rs1![item_id] & """, ""\;"") 

Coalsce的是,我寫了一個函數,它,我得到這樣一個結果:

「ABC/123 \; BCD/123 \; Bcs/sdasdas \; Casad/sdads \; Fea/dasd adsad \; Fea/Zero \; Lo/somer-tet \;「

現在我正在將此結果更新到另一個表中的字段以及字段數據類型備註。當結果超過255個字符時,我得到一個更新查詢錯誤,所以我調試了它,現在檢查結果的長度是否只是更新,它工作得很好,但是當它超過時,我無法做任何事情。

我coalsce功能

Function Coalsce(strSql As String, strDelim As String, ParamArray NameList() As Variant) 
Dim db As Database 
Dim rs As DAO.Recordset 
Dim strList As String 

    Set db = CurrentDb 

    If strSql <> "" Then 
     Set rs = db.OpenRecordset(strSql) 

     Do While Not rs.EOF 
      strList = strList & rs.Fields(0) & strDelim 
      rs.MoveNext 
     Loop 

     strList = Mid(strList, Len(strDelim)) 
    Else 

     strList = Join(NameList, strDelim) 
    End If 

    Coalsce = strList 

End Function 

我查詢

strSql = Select DISTINCT " & rs1![item_id] & " as item_id, FindReplace(Coalsce(""SELECT (desc & '/' & kw) FROM AKM where item_id=" & rs1![item_id] & """, ""\;""), ""/"", ""\/"") as res 
Set rs2 = db.OpenRecordset(strSql, dbOpenDynaset) 
DoCmd.RunSQL ("Update data_Query set res=" & rs2.Fields("res").Value) 
+1

你想把字符串放在文本字段中嗎?字符串變量不應該是問題,除非您將其聲明爲另一種類型。 – JeffO 2011-04-27 13:22:38

+0

請發佈提供錯誤的代碼段以及任何聲明('Dim'語句)。正如已經指出的那樣,'String'變量不限於255個字符。 – 2011-04-27 15:42:28

+0

這不是「發佈你的代碼」,因爲你沒有向任何Coalsce(?Coalesce?)顯示任何變量聲明或代碼。當你不會告訴我們你在做什麼時,我們怎麼能說出你做錯了什麼? (你還沒有顯示你正在嘗試使用的更新聲明。) – 2011-04-27 15:53:10

回答

2

這有兩個可能的原因發生。最常見的情況是,您在具有ORDER BY的SQL語句中執行此操作,在這種情況下,備註字段會被截斷爲255個字符。然而,這看起來不太可能,因爲你的函數返回的字符串長度超過255個字符,所以這不應該成爲問題。事實上,當有ORDER BY時,避開255個字符截斷的方法之一是將備忘錄字段包含在Left([MyMemoField], 4096)之類的函數中。

另一個原因與備註字段串聯有關,在這種情況下MemoField1 & MemoField2將被截斷爲255個字符(並且通常以廢話結束)。你不會說源字段的數據類型,所以這看起來不太可能。

所以,我基本上懷疑你的Coalsce()功能。我的第一個猜測是,你已經定義了一個返回類型:

Public Function Coalsce() 

...這將返回一個變體類型,因爲你沒有明確設置返回類型。所以,你應該把它改成這樣:

Public Function Coalsce() As String 

然而,這可能是因爲你已經決定要返回空當所有的字段爲空,在這種情況下,你必須聲明回報類型爲Variant:

Public Function Coalsce() As Variant 

這似乎是不好的做法對我來說,它們的變體是複雜的處理。

它也可能是ByRef/ByVal問題。在這種情況下,你真的希望事情得到ByVal的處理,因爲這是ByRef情況導致問題連接備註字段(並且ByVal避免它)。

所有這一切說,我不知道爲什麼在世界上你不能只是串連在SQL語句中的字段,而不是需要一個函數來做到這一點。

此外,返回的存儲在備忘錄字段中的數據會提示來自我的WTF反應 - 看起來您正在存儲重複數據,並且格式幾乎不可用。

所以,基本上,沒有你在做什麼,你是如何做的,爲什麼你要這麼做更多的細節,這對任何人真正回答你的問題是不可能的。