代码要么使内存过载,要么无法编译 VBA
Code either overloads memory or wont compile VBA
尝试编写一个宏以根据字符串的长度在文本字符串的特定点插入连字符,或者删除该点之后的所有文本。
即
- 如果是 6 个字符,在字符 4+5 之间插入一个连字符或删除字符 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
但这只是在编译时抛出错误。我觉得我错过了一些非常简单的东西。
有什么建议吗?
看起来你想截断到比现有字符数少两个,如果这个数字是 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
尝试编写一个宏以根据字符串的长度在文本字符串的特定点插入连字符,或者删除该点之后的所有文本。
即 - 如果是 6 个字符,在字符 4+5 之间插入一个连字符或删除字符 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
但这只是在编译时抛出错误。我觉得我错过了一些非常简单的东西。
有什么建议吗?
看起来你想截断到比现有字符数少两个,如果这个数字是 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