대량의 데이터를 변환하는 매크로
워낙 내용이 많아서 웬만한 코드로는 실행 중 멈춰버린다.
바꿀 데이터를 배열 하나에 넣고 코드를 순환하며 바꿔주는 매크로.
핵심은, 모든 데이터를 하나의 배열에 넣는 것이다.
그리고 중요한 한가지.
코드 실행 시간이 길어질 땐 시간 체크를 해가며 이벤트를 실행해야 응답없음이 뜨지 않는다.
Option Explicit Sub withArray() Dim c As Integer Dim r As Long Dim sT As Date: sT = Time '시작시간 Dim nT As Date Dim oT As Date Dim varCode As Variant: varCode = Sheets("codepyo").UsedRange '코드표를 배열로 Dim intV As Long: intV = UBound(varCode) Dim cntC As Variant Dim jnCode As Variant Application.ScreenUpdating = 0 With Sheets("data").UsedRange '노란셀일 때 행 값과 해당 행의 데이터를 배열에 삽입 For c = 1 To .Columns.Count If .Cells(1, c).Interior.Color = vbYellow Then cntC = cntC & vbLf & c jnCode = jnCode & vbLf & Join(WorksheetFunction.Transpose(.Columns(c)), ",") End If Next c cntC = Mid$(cntC, 2) jnCode = Mid$(jnCode, 2) For r = 2 To intV '응답없음 방지를 위해 시간 체크 해가며 이벤트 실행 nT = Time - sT If nT <> oT Then DoEvents Application.StatusBar = "Progress : " & Format(r / intV, "0.00%") & ", " & Format(nT, "hh:mm:ss") oT = nT End If jnCode = Replace$(jnCode, varCode(r, 1), varCode(r, 2)) Next r cntC = Split(cntC, vbLf) jnCode = Split(jnCode, vbLf) For r = 0 To UBound(cntC) .Columns(Val(cntC(r))) = WorksheetFunction.Transpose(Split(jnCode(r), ",")) Next r End With With Application .ScreenUpdating = 1 .StatusBar = "Progress : 100%" & ", " & Format(Time - sT, "hh:mm:ss") End With End Sub | cs |
'VB(A)' 카테고리의 다른 글
배열의 합, 최대치 구하기 (0) | 2015.07.28 |
---|---|
A시트와 B시트의 필터링 값을 각각의 파일로 저장 (0) | 2015.07.27 |
대괄호 이동 (0) | 2015.07.27 |
합계가 될 때까지 숫자를 랜덤하게 뿌리기 (0) | 2015.07.27 |
동일한 양식의 여러 엑셀파일 취합 (0) | 2015.07.27 |