Excel & VBA---Brain Training


  • 01

배열로 정보를 뿌리면 숫자셀에 에러표시가 난다...

범위를 순환하면서 값을 넣으면 좋겠으나..
정보가 많으면 속도가 배열을 사용하는 것과 차이가 난다
그래서 배운대로..
아래와 같은 코드를 실행하여 시트의 범위에 쏟아 넣었다

Sub makeDummyDatas()
Dim sDatas(1 To 30000, 1 To 2) As String
Dim iX As Integer, iY As Integer
For iX = 1 To 30000
    For iY = 1 To 2
        If iY = 1 Then
            sDatas(iX, iY) = Chr(Int(Rnd() * 26) + 65)
        Else
            sDatas(iX, iY) = Int(Rnd() * 1000) + 1000
        End If
    Next
Next
With Worksheets.Add
    .Range("A1").Resize(10000, 2).Value = sDatas
End With
End Sub

그랬더니..
숫자부분도 문자열로 표현되어 기분나쁜 에러표시가 난다
당연하다, 배열의 타입을 String으로 하였으니 숫자이지만 문자로
보관하고 있는 것을 뿌렸으니, 당연히 문자로 나타나는 것이고..
엑셀이 알아서 계산하는데는 지장이 없어
별 문제는 없지만, 보기가 좋지 않아서 기분이 찝찝하다..



속도 빠른 배열을 사용했으면 좋겠고,,
이런 부작용은 없애고 싶고
뭐 간단한 조치방법이 없을까??
물론 이것은 배열이라는 것에서는 처리할수 없다
엑셀이 제공하는 개체의 속성이나 메소드를 기억해 보시면 된다

***[LOG-IN]***

숫자만 깔끔하게 만들어진 내용을
각각의 행을 순환하면서 왼쪽열의 것과 오른쪽의 열을 바꾼다고 하면
배열에 숙달되지 않는다면 아래와 같은 짓을 해야 할 것이다


Sub swapDatas()
Dim shtX As Worksheet
Dim arrX As Variant
Dim rTable As Range
Dim rRow As Range
Dim sTemp As Variant
Dim lStart As Long

On Error Resume Next
Set shtX = ActiveSheet

Set rTable = shtX.Range("A1").CurrentRegion
If Application.CountA(rTable) = 0 Then MsgBox "위의 프로시져로 실행한 내용의 시트를 선택하고 하세요": Exit Sub
lStart = Timer
For Each rRow In rTable.Rows
    sTemp = rRow.Cells(1)
    rRow.Cells(1) = rRow.Cells(2)
    rRow.Cells(2) = sTemp
    ActiveWindow.ScrollRow = rRow.Row
    DoEvents
Next
MsgBox Timer - lStart
End Sub

위의 내용을 배열로 처리해보시기 바란다
그러면 또 하나 새로운 것을 발견할 것이다
발견하는 것이 아니고,이미 알고 있었지만 숙달되지 않아 모르는 것과 같은 것을
알게 될 것이다
속도도 빠름과 동시에..어라..이렇게 하면 맨위에서 거론된 문제도
같이 풀리는것 아닌가????
맨위의 빨강색으로 표현한 설명이 틀리다는 것도 알게 된다..
엑셀의 개체의 속성이나 메소드지원없이..처리가 되네..?!
실은 엑셀의 개체(Range)가 알아서 처리해주는 것이지만..
알아서 처리하게 배열에서 어떤 조치를 취한다???!!!
화일을 올리기전에 잘 이해하시고 답을 얻으시기를...

***[LOG-IN]***

배열의 효율성과 정보의 타입을 충분히 이해함이
좋은 프로그래밍을 할수 있는 기본이 되니, 화일의 내용을 충분히 이해하시기를..

  • 01