2016-10-17 7 views
0

나는 이니셜로 대체하고자하는 전체 이름의 열을 가지고 있습니다. 나는 현재이 일을하고배열을 통한 효율적인 루핑

:

Dim n As Long 
Dim varray As Variant 
Dim FullNameRange As Range 
Dim FullName As String 

varray = Range(NDLstaffCol & FirstLineItemRow & ":" & staffCol & LastRow + 1) 

For n = FirstLineItemRow To UBound(varray, 1) 
    Set FullNameRange = ActiveSheet.Range(staffCol & n) 
    FullName = FullNameRange.Value 
    FullNameRange = Left(FullName, 1) & Mid$(FullName, InStr(FullName, " ") + 1, 1) 
Next 

LastRow가 글로벌 변수로 마지막 레코드를 의미합니다.

동일한 모듈의 다른 서브 루틴과 비교할 때 처리하는 데 시간이 오래 걸립니다.

더 좋은 방법이 있나요?

하드 코딩 된 찾기/바꾸기가 작동하지 않으므로 전체 이름을 알 수는 없습니다. < 500 개의 레코드가 있습니다.

+0

나에게 잘 보이지만 (적어도이 우주에서는) 개선 할 수없는 런타임 복잡성이 'O (n)'입니다. 디버거 외부에서 실행 해 보셨습니까? 디버그 모드에서 정상적으로 느리게 실행됩니까? .NET Office SDK를 사용하여 C#/.NET에서 다시 작성해 보았습니까? Excel 실행을 최소화하면 실행 속도가 더 빠릅니까? 어떤 버전의 Excel을 사용하고 있습니까? – Dai

+0

@Dai '라이브'일 때 천천히 정상적으로 실행됩니다. 진행 막대 (userform)를 사용하여 사용자가 서브 루틴에있는 위치를 표시합니다.이 섹션에 도달하면 오랜 시간이 걸립니다. SDK 재 작성 및 사용에 대해 들어 본 적이 없습니다. 최소화는 시간에 영향을주지 않습니다. 엑셀 2016. 이것이 정말로 가장 좋은 방법이라면, 나는 단지 500 레코드 밖에 가질 수 없다. – redditor

답변

3
Dim n As Long, rng As Range 
Dim varray As Variant 
Dim FullNameRange As Range 
Dim FullName As String, v 

Set rng = Range(staffCol & FirstLineItemRow & ":" & staffCol & LastRow + 1) 
varray = rng.Value 

For n = 1 To UBound(varray, 1) 
    v = varray(n, 1) 
    varray(n, 1) = Left(v, 1) & Mid$(v, InStr(v, " ") + 1, 1) 
Next 

rng.Value = varray 
+0

와우. 그냥 이것을 테스트하고 내 총에서 2 분 정도 면도 면도 ... 감사합니다! 왜 이것이 효과가 있었는지 그리고 내가 잘못 가고있는 곳을 설명 할 수 있습니까? – redditor

+2

데이터를 배열로 가져 왔지만 워크 시트에서 셀 단위로 반복했습니다. 배열의 데이터를 변경 한 다음 한 번에 시트에 다시 쓰는 것이 훨씬 빠릅니다. –

+0

하하, 정확히 배열에 넣으려는 이유입니다. 정말 고마워요! – redditor