VB(A)

대량의 데이터 변환

당근쨈 2015. 7. 27. 10:08
대량의 데이터를 변환하는 매크로
워낙 내용이 많아서 웬만한 코드로는 실행 중 멈춰버린다.

바꿀 데이터를 배열 하나에 넣고 코드를 순환하며 바꿔주는 매크로.
핵심은, 모든 데이터를 하나의 배열에 넣는 것이다.

그리고 중요한 한가지.
코드 실행 시간이 길어질 땐 시간 체크를 해가며 이벤트를 실행해야 응답없음이 뜨지 않는다.

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




대량 문자 바꾸기.xlsm