2015-02-06 4 views
0

문자열 길이에 따라 텍스트 문자열의 특정 지점에 하이픈을 삽입하거나 해당 지점 다음의 모든 텍스트를 삭제하는 매크로를 작성하려고합니다.코드가 메모리를 오버로드하거나 VBA를 컴파일하지 않습니다.

즉 - 6 개 문자는 문자 사이에 4 + 5 하이픈을 삽입하거나 문자 4 후 모든 텍스트를 삭제하는 경우 - 7 개 문자, 문자 사이에 5 + 6 하이픈을 삽입하거나 문자 후 모든 텍스트를 삭제하면 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

어떤 오류가 반환됩니까? – Taemyr

+0

'끝이 없으면 차단'. 'End If'를 입력하면 동일한 오류가 발생합니다. 2를 입력하면 오류는 발생하지 않지만 코드를 실행하면 결과가 생성되지 않습니다. 만약 내가 3을 입력하면 'If Without Block If' –

답변

1

숫자가 6-8 인 경우 기존 문자 수보다 2 자 이하로 자르는 것처럼 보이나요? 그렇다면 다음과 같이하십시오 :

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  
+0

어레이의 좋은 사용법 (+1) –

+0

이렇게하면 모든 코드를 넣지 않고 동일한 코드를 실행하여 각 문자열의 인스턴스를 계산할 수 있습니까? 피벗 테이블에 넣으시겠습니까? 목표는 기존 문자의 수보다 2 작은 숫자까지 우편 번호를 잘라내어 데이터에 각 우편 번호가 몇 개인 지 계산하는 것입니다. 예를 들어 AB2 3CD는 AB2 3가되고 매크로는 데이터에서 AB2 3이 몇 개 발생했는지 계산합니다. 12x AB2 3, 6x AB2 4, 1x AB3 7 등 –