none
vba코드 에러가 나기도 하고 안나기도 하는데 왜 그런지 원인과 해결책이 궁금합니다. RRS feed

  • 질문

  • '에러가 나면 출력을 하던걸 다 지워버리는 코드를 만들 었습니다. 그런데... 빨간줄에서 간헐적으로 에러가 납니다. 날때도 있고 안날때도 있습니다. 왜그런가요?

    1004에러가 자꾸 납니다.

     

    '맨위에 입력

    On Error GoTo Err_delete

    Dim val3535 As Long '초기위치 저장할 공간'

    Dim s3535 As Worksheet

    val3535 = 2

    For Each s3535 In ActiveWorkbook.Sheets

    If s3535.name = RstSheet Then

    val3535 = Sheets(RstSheet).Cells(1, 1).value

    End If

    Next s3535 '시트가 이미있으면 출력 위치 저장을하고, 없으면 2을 저장한다.

     

    '맨뒤에 붙이기

    Exit Sub

    Err_delete:

    For Each s3535 In ActiveWorkbook.Sheets

    If s3535.name = RstSheet Then

    Sheets(RstSheet).Range(Cells(val3535, 1), Cells(5000, 1000)).Select

    Selection.Delete

    Sheets(RstSheet).Cells(1, 1) = val3535

    Sheets(RstSheet).Cells(val3535, 1).Select

    If val3535 = 2 Then

    Application.DisplayAlerts = False

    Sheets(RstSheet).Delete

    End If

    End If

    Next s3535

     

     

     

    '예시 프로그램에선 잘 작동합니다.

    Option Base 1
    Public DataSheet As String, rstSheet As String      'sheet이름 두 개


    Sub makeOutputSheet(sheetName)

        Dim s As Worksheet
        
        For Each s In ActiveWorkbook.Sheets
            If s.Name = sheetName Then Exit Sub '같은 시트가 있으면 안만듭니다.'
        Next s
        
        Worksheets.Add.Name = sheetName
        
        With ActiveWindow
            .DisplayGridlines = False
    '        .DisplayHeadings = False
        End With
        
        With ActiveWindow.Application.Cells
             .Font.Name = "굴림"
             .Font.Size = 9
             .HorizontalAlignment = xlRight
        End With

        With Worksheets(sheetName).Range("a1")
            .Value = 2
            .Font.ColorIndex = 2
        End With
        Worksheets(sheetName).Rows(1).Hidden = True  '1,1에다가 위치 기록해둠'
        Worksheets(sheetName).Activate
        Cells.Select
        Selection.RowHeight = 13.5
        
    End Sub

     

    Sub 아놔왜저장이안돼()
    rstSheet = "_통계분석결과_"


    '출력하는 해당 모듈에 덧 붙일 내용'
    '맨위에 입력
    On Error GoTo Err_delete


    Dim val3535 As Long '초기위치 저장할 공간'
    Dim s3535 As Worksheet
    val3535 = 2
        For Each s3535 In ActiveWorkbook.Sheets
            If s3535.Name = rstSheet Then
    val3535 = Sheets(rstSheet).Cells(1, 1).Value
    End If
    Next s3535  '시트가 이미있으면 출력 위치 저장을하고, 없으면 2을 저장한다.


    Call makeOutputSheet(rstSheet)


    Sheets(rstSheet).Cells(3 + Sheets(rstSheet).Cells(1, 1).Value, 1) = 1
     Sheets(rstSheet).Cells(1, 1).Value = 3 + Sheets(rstSheet).Cells(1, 1).Value
    Sheets(rstSheet).Cells(5 + Sheets(rstSheet).Cells(1, 1).Value, 1) = 3
     Sheets(rstSheet).Cells(1, 1).Value = 5 + Sheets(rstSheet).Cells(1, 1).Value
     Dim sdfdf As Long

     

     sdfdf = "sdfdgdg" '의도적인에러'

    Sheets(rstSheet).Cells(7, 1) = 7
     Sheets(rstSheet).Cells(1, 1).Value = 7

    '맨뒤에 붙이기
    Exit Sub
    Err_delete:

    For Each s3535 In ActiveWorkbook.Sheets
            If s3535.Name = rstSheet Then
    Sheets(rstSheet).Range(Cells(val3535, 1), Cells(5000, 1000)).Select
    Selection.Delete
    Sheets(rstSheet).Cells(1, 1) = val3535
    Sheets(rstSheet).Cells(val3535, 1).Select

    If val3535 = 2 Then
    Application.DisplayAlerts = False
    Sheets(rstSheet).Delete
    End If

    End If


    Next s3535

    MsgBox ("프로그램에 문제가 있습니다.")
     'End sub 앞에다 붙인다.

    ''해석, 에러가 나면 Err_delete로 와서 첫셀이후로 지운다. 만약 첫셀이 2면 시트를 지운다.그리고 에러메시지 출력
    'rSTsheet만들기도 전에 에러나는 경우에는 아무 동작도 하지 않고, 에러메시지만 띄운다.

    End Sub

     

    왜 간헐적으로 안될까요? 어떻게 고쳐야 하나요?

    2012년 9월 19일 수요일 오전 7:56

모든 응답

  • 안녕하세요.

    답변이 조금 늦었습니다만, 올려주신 코드를 검토해 보았습니다.

    먼저, 지정하신 rstSheet 가 존재하는경우 해당 시트의 지정 Range 를 삭제하기 위하여

    검사하는 과정에서 에러가 있군요.

    Sub 아놔왜저장이안돼() rstSheet = "_통계분석결과_" '출력하는 해당 모듈에 덧 붙일 내용' '맨위에 입력 On Error GoTo Err_delete Dim val3535 As Long '초기위치 저장할 공간' Dim s3535 As Worksheet val3535 = 2 For Each s3535 In ActiveWorkbook.Sheets If s3535.Name = rstSheet Then val3535 = Sheets(rstSheet).Cells(1, 1).Value End If Next s3535 '시트가 이미있으면 출력 위치 저장을하고, 없으면 2을 저장한다. Call makeOutputSheet(rstSheet) Sheets(rstSheet).Cells(3 + Sheets(rstSheet).Cells(1, 1).Value, 1) = 1 Sheets(rstSheet).Cells(1, 1).Value = 3 + Sheets(rstSheet).Cells(1, 1).Value Sheets(rstSheet).Cells(5 + Sheets(rstSheet).Cells(1, 1).Value, 1) = 3 Sheets(rstSheet).Cells(1, 1).Value = 5 + Sheets(rstSheet).Cells(1, 1).Value Dim sdfdf As Long sdfdf = "sdfdgdg" '의도적인에러' Sheets(rstSheet).Cells(7, 1) = 7 Sheets(rstSheet).Cells(1, 1).Value = 7 '맨뒤에 붙이기 Exit Sub Err_delete: For Each s3535 In ActiveWorkbook.Sheets If s3535.Name = rstSheet Then

    Sheets(rstSheet).Range(Cells(val3535, 1), Cells(5000, 1000)).Select Selection.Delete Sheets(rstSheet).Cells(1, 1) = val3535 Sheets(rstSheet).Cells(val3535, 1).Select If val3535 = 2 Then Application.DisplayAlerts = False Sheets(rstSheet).Delete End If End If Next s3535 MsgBox ("프로그램에 문제가 있습니다.") 'End sub 앞에다 붙인다. ''해석, 에러가 나면 Err_delete로 와서 첫셀이후로 지운다. 만약 첫셀이 2면 시트를 지운다.그리고 에러메시지 출력 'rSTsheet만들기도 전에 에러나는 경우에는 아무 동작도 하지 않고, 에러메시지만 띄운다. End Sub

    Sheets(rstSheet).Range(Cells(val3535, 1), Cells(5000, 1000)).Select
    여기에 문제가 있습니다.

    우선, 엑셀의 최대 행은 65536개 / 최대 컬럼은 256 입니다.

    지정하신 소스에서는 Range 지정을 하기위한 자리가 1000 컬럼으로 되어있군요.

    아마도 '1004'번 에러를 보시지 않았을까 생각합니다.

    1. 1000 -> 256 으로 수정.

    2. Ragne 지정을 위해서 많은 시트중에서 현재 지정된 이 시트이다. ( Sheets(rstSheet) )

    라는 지정이 필요합니다. 그래서 소스의 Range 지정부분을 조금 수정하면 아래와 같이 됩니다.

    이런식으로 고쳐서 한번 해보십시오.

    Sheets(rstSheet).Range(Sheets(rstSheet).Cells(val3535, 1), Sheets(rstSheet).Cells(5000, 256)).Select

    소스가 문제없이 구동되는것을 확인했습니다.

    도움되시길 바라고, 뭔가 다른 문제가 있으시다면 다시 질문 주십시오.


    VB/VB.NET is my Life


    • 편집됨 Sungman KOMVP 2012년 10월 16일 화요일 오전 1:23 개행부분 수정
    • 답변으로 제안됨 Sungman KOMVP 2012년 10월 16일 화요일 오전 1:23
    2012년 10월 16일 화요일 오전 1:21