나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내
작성자:  

 조삿갓 (choga21)

추천:  2
파일:     조회:  3055
제목:   [RE]불특정 형태의 테이블내 모든셀을 한번씩 재입력하는 VBA
     
  * 질문 >>

특정 서버로부터 다운 받은 엑셀내의 불특정 구간의 숫자가 항상 "텍스트 형태로 저장된 숫자" 라는 오류가 발생합니다. 
그래서 일일이 숫자로 변경을 하기 위해 VBA를 작성 했는데 어느 정도에 셀까지만 작동을 하고 이 이후것은 작동을 하지 않습니다.

어느 부분이 잘못인지 파악 부탁드립니다.


Sub 텍스트형_숫자_오류_정리()
'
' 매크로1 매크로
' 부정형 테이블을 읽어 들여서 각 셀들마다 읽어들이기/다시 셀에 쓰기 등을 반복
' 셀의 끝까지 진행하여 오류 나오는 텍스트형 숫자를 오류 없게 만들기

'
    Dim a As String    '(a 라는 변수를 지정)
    Dim b As String    '(b 라는 변수를 지정)
    Dim x As Integer   '(x 라는 변수를 지정)
    Dim y As Integer   '(y 라는 변수를 지정)
    Dim i As Integer   '(i 라는 변수를 지정)
    Dim j As Integer   '(j 라는 변수를 지정)



ActiveCell.SpecialCells(xlLastCell).Select


x = ActiveCell.Row - 3
y = ActiveCell.Column

'MsgBox x
'MsgBox y

Range("A4").Activate

i = 0
j = 0

    Do While j < y
            
            Do While i < x
                a = ActiveCell                    '‘(현재 셀의 값을 a변수에 입력)
                ActiveCell = a                    '‘(a변수의 값을 현재 셀에 다시 입력)
                ActiveCell.Offset(1, 0).Select    '‘(현재 셀에서 우측으로 한칸 이동)
                i = i + 1
                ' MsgBox "i=" & i
            Loop
                    
        i = 4 ' 실제 자료가 있는 셀 위치부터 시작함, 각 컬럼의 4번째 행부터 자료 검색
        j = j + 1
        ' MsgBox "j=" & j
        Cells(4, j).Select
        a = ActiveCell                    '‘(현재 셀의 값을 a변수에 입력)
        ActiveCell = a                    '‘(a변수의 값을 현재 셀에 다시 입력)
        ActiveCell.Offset(0, 1).Select    '‘(현재 셀에서 아래로 한칸 이동)

        
    Loop   '‘(반복)



End Sub

==============[김인현님 글에 대한 답변입니다]==============

테이블 크기를 계산하는 x, y, i, j 중 특히 행을 담당하는 x와 i는
Long 형으로 선언하는 것이 안전합니다.
엑셀 2007 이후 버전(xlsx 형식)의 경우 최대 행 수가
65535까지 가능하기 때문에 Integer로는 32768행부터 오류가 발생합니다.

Offset 함수가 오른쪽, 아래쪽 이동 방법이 반대로 되어 있습니다.
Offset(행, 열)로 써야 하므로, Offset(0,1)이 오른쪽 이동입니다.

차라리 activecell이나 Offset으로 제어하는 것보다는
Cells 개체를 직접 사용하는 것이 더 효율적일 것입니다.

그리고, 이중 반복문이 좀 이상하게 얽혀 있네요.
일부 영역은 했던 곳을 중복으로 작업하고
일부는 빠지게 되어 있습니다.

그리고, 이런 목적이라면 Do 루프보다는 For 루프가 훨씬 깔끔하고
속도도 빠릅니다.

------- 수정 프로그램 -----

Sub 텍스트형_숫자_오류_정리()
    Dim a As String    '(a 라는 변수를 지정)
    Dim b As String    '(b 라는 변수를 지정)
    Dim x As Long      ' 테이블의 행 크기
    Dim y As Integer   ' 테이블의 열 크기
    Dim i As Long      ' 행번호 반복 제어 변수
    Dim j As Integer   ' 열번호 반복 제어 변수


ActiveCell.SpecialCells(xlLastCell).Select
x = ActiveCell.Row
y = ActiveCell.Column

For i = 4 To x
   For j = 1 To y
      Cells(i, j).Select   ' i행 j열 셀을 선택
      a = ActiveCell       '‘(현재 셀의 값을 a변수에 입력)
      ActiveCell = a       '‘(a변수의 값을 현재 셀에 다시 입력)
   Next j
Next i

End Sub

 
[불량 게시물 신고]  
조삿갓For : 제어 변수의 값(범위)에 의해 반복 여부가 결정되고, 반복하는 동안 제어변수의 값이 항상 일정하게 변화하며, 그 조건이 변하지 않는 경우 가장 효율적임

Do : 반복하는 조건이 제어변수와 관계 없는 경우(예: 빈 셀을 만나면 탈출, 합계가 얼마 이상이면 탈출 등)

위 경우에는 행번호는 4행부터 끝까지
열번호는 1열부터 끝가지
각각 1씩 증가하면서 빠짐없이 작동해야 하므로
For 루프가 가장 유용하지요.
06-20 (20:32)
삭제 ■신고
김인현아하 중요한 사실을 알게 되었습니다. 두분 답변 정말 감사합니다.^^06-21 (09:55)
삭제 ■신고
        
  

작성일 : 2017-06-20(20:23)
최종수정일 : 2017-06-20(20:23)
 


 ◎ 관련글

  제 목   작성자   날짜
불특정 형태의 테이블내 모든셀을 한번씩 재입력하는 VBA 김인현 2017-06-20
[RE]불특정 형태의 테이블내 모든셀을 한번씩 재입력하는 VBA 조삿갓 2017-06-20
[RE]불특정 형태의 테이블내 모든셀을 한번씩 재입력하는 VBA 구석마을 2017-06-20