【ExcelVBA】 「변수가 정의되어 있지 않습니다」로 컴파일 할 수 없다

3341 단어 VBAExcel

소개



지금까지 몇가지 「컴파일할 수 없는 현상」을 기사로서 정리해 왔습니다만, 이번 새로운 패턴을 발견했기 때문에 기사로서 정리해 보았습니다.
  • 「컴파일할 수 없는 현상」의 예
  • 【ExcelVBA】Dictionary의 Item에 사용자 정의형을 지정할 수 없다
  • 【ExcelVBA】 「정수식이 필요합니다」로 컴파일 할 수 없다
  • 【ExcelVBA】 「수식자가 부정합니다」로 컴파일 할 수 없다


  • 현상


  • 자신이 만든 함수(Function)를 복사하여 그 함수를 약간 수정했을 때 "변수가 정의되지 않았습니다"라는 오류가 발생했습니다.
  • 복사 소스 함수에서 컴파일 오류가 발생하지 않았습니다.

  • 함수를 정의한 표준 모듈의 선두에는 Option Explicit 스테이트먼트가 쓰여져 있어 변수의 선언이 강제된 상태였습니다.
  • 함수의 코드량은 10행 정도로, 변수나 정수는 모두 정의되고 있었습니다.

  • Option Explicit 문을 제거하면 컴파일 오류가 발생하지 않지만 함수 결과가 예상하는 것과 다릅니다.
  • 다음의 샘플 코드의 경우, 반환값의 형태(Long)의 변수의 초기치인 0이 돌려주어집니다.




  • 원인


  • 컴파일 에러의 원인은 「함수명(CalcTaxIncluded)과 반환값의 변수명(CalcTaxInclude)이 다른 것」 때문이었습니다.
  • 컴파일 오류 메시지와 달리 "변수가 정의되지 않았습니다"로 인해 발생하지 않았습니다 ...


  • 샘플 코드
    Option Explicit
    
    ' 消費税率
    Const TAX_RATE As Integer = 10
    
    '--------------------------------------------------------------------------------
    ' 消費税の税込み価格を返す。
    '
    ' taxExcluded:税抜き価格。
    ' return:消費税の税込み価格。
    '--------------------------------------------------------------------------------
    Function CalcTaxIncluded(taxExcluded As Long) As Long
        CalcTaxInclude = taxExcluded / 100 * (100 + TAX_RATE)    ' "CalcTaxIncluded"ではなく"CalcTaxInclude"になっている!
    End Function
    

    요약


  • VBA 컴파일 오류 메시지는 직접적인 원인을 알기 어려운 경우가 많아서 곤란합니다 ...
  • 본래는 구문 오류가 되어야 하는데,
  • 게다가 중도반단에 함수를 실행할 수 버리므로, 이것이 생각하지 않는 부작용을 낳을 가능성이 있을 것 같습니다.

  • 서브프로시저나 함수의 입도를 작게 유지하는 것으로, 코드의 가독성을 높일 뿐만 아니라, 이번과 같은 케이스로 원인을 추구하기 쉬워진다(=보수성이 높아진다)라고 하는 것을 몸으로 배웠습니다 .
  • 이 점에 대해서는, Java나 C# 등 다른 언어에서도 완전히 같습니다.

  • 좋은 웹페이지 즐겨찾기