代码重载内存或不编译VBA

时间:2015-02-06 15:26:50

标签: excel vba excel-vba large-data

尝试编写宏以在文本字符串中的特定点插入连字符,具体取决于字符串的长度或删除所述字符后的所有文本。

即 - 如果是6个字符,请在char 4 + 5之间插入连字符或删除char 4之后的所有文本 - 如果是7个字符,请在char 5 + 6之间插入连字符或删除char 5之后的所有文本

理想情况下,我希望能够在那一点截断字符串而不是连字符,但是我无法理解如何使其工作所以我决定连字符然后只是运行一个查找和替换' - *'删除不需要的字符。可以在小样本集100-300单元上工作,但我需要代码能够通过70,000+单元的工作簿。我已经尝试调整代码以停止内存问题,但现在我似乎无法让它工作。

Sub Postcodesplitter()
Dim b As Range, w As Long, c As Range, x As Long, d As Range, y As Long

For Each b In Selection
w = Len(b)
If w = 8 And InStr(b, "-") = 0 Then b = Application.WorksheetFunction.Replace(b, 15 - w, 0, "-")

For Each c In Selection
x = Len(c)
If x = 7 And InStr(c, "-") = 0 Then c = Application.WorksheetFunction.Replace(c, 13 - x, 0, "-")

For Each d In Selection
y = Len(d)
If y = 6 And InStr(d, "-") = 0 Then d = Application.WorksheetFunction.Replace(d, 11 - y, 0, "-")

Next
Next
Next
End Sub    

这是我放在一起的原始代码,但它导致内存问题超过300个目标单元格。即使在最好的时候,我也是一个非常糟糕的程序员,但是在朋友的一些建议下我尝试了这个。

Sub Postcodesplitter()
Dim b As Range, x As Long

If (Len(x) = 6) Then
b = Application.WorksheetFunction.Replace(b, 11 - x, 0, "-")
Else
If (Len(x) = 7) Then
b = Application.WorksheetFunction.Replace(b, 13 - x, 0, "-")
Else
If (Len(x) = 8) Then b = Application.WorksheetFunction.Replace(b, 15 - x, 0, "-")

End Sub

但这只是在编译时抛出错误。我觉得我错过了一些非常简单的东西。

任何提示?

1 个答案:

答案 0 :(得分:1)

如果这个数字是6-8,你好像要截断到比现有字符数少两个?如果是这样的话,那就是:

Sub Postcodesplitter()
Dim data
Dim x as Long
Dim y as Long

data = Selection.Value
For x = 1 to ubound(data,1)
for y = 1 to ubound(data, 2)
Select Case Len(data(x, y))
Case 6 to 8
data(x, y) = left(data(x, y), len(data(x, y)) - 2)
end select
next y
next x
selection.value = data

End Sub