레이아웃 변경에 강한 VBA 코드

13275 단어 ExcelVBA
업데이트 내역


날짜
내용


2020-01-25
Enum 버전 추가


개요



VBA 노트: 시트 레이아웃 변경과 관련된 VBA 코드 수정을 줄이고 싶습니다. 의 기사를 보고, 자신의 방법을 투하해 보았습니다.

본문



2 패턴 투하



저 안에서 기본형이었던 것과 그것을 개량한 것입니다.
2020-01-25 추기: @jinoji 님에게 소개해 주신 Enum의 코드를 추가했습니다.

샘플 소재



제목으로 DBからエクスポートしてきた住所テーブルを、住所録っぽく書き換える処理를 사용합니다.
덧붙여 소재의 처리 자체에는 그다지 힘을 넣지 않기 때문에, 그쪽으로의 츳코미는 용서 바랍니다.

입력


결과


패턴 1, 기본형



정책



어쨌든 코드내에서 매직 넘버가 되는 개소 모두 정수로 합니다.
모든 코드는 여기
' --- シート定義
Const INPUT_SHEET_NAME = "INPUT"
Const OUTPUT_SHEET_NAME = "OUTPUT"

' --- 入力列定義
Const COL_IN_INDEX = 1
Const COL_IN_FAMILY_NAME = 2
Const COL_IN_LAST_NAME = 3
Const COL_IN_SEX = 4
Const COL_IN_ZIP1 = 5
Const COL_IN_ZIP2 = 6
Const COL_IN_PREFECTURE = 7
Const COL_IN_CITY = 8
Const COL_IN_TOWN = 9
Const COL_IN_BUILDING = 10
Const COL_IN_ADDRESSLIST_PROHIBITED = 11

' --- 入力行定義
Const ROW_IN_DATA_START = 2

' --- 出力列定義
Const COL_OUT_NAME = 1
Const COL_OUT_ZIP = 2
Const COL_OUT_ADDRESS = 3

' --- 出力行定義
Const ROW_OUT_DATA_START = 3

약점


  • 열이 10개 정도라면 좋지만, Z열보다 먼저 되면, 열 알파벳을 열 번호로 변환하는 것이 한 번 번거롭습니다.
  • 도중의 열에 무언가를 추가하게 되었을 때(예를 들어 입력의 D열당에 이름 카나를 넣는다든가)가 되었을 때, 열 번호를 정리해 고쳐야 합니다. 수고입니다.

  • 패턴 2, 개선 버전



    정책



    열 번호를 동적으로 설정합니다.

    모든 코드는 여기

    패턴 1에서는 상수였던 곳을 모듈 변수로 합니다.
    그런 다음 COL_IN_ITEM_START라는 상수를 제공하여 항목의 시작 열을 지정합니다.
    ' --- 入力列定義
    Const COL_IN_ITEM_START = 1
    Dim COL_IN_INDEX As Long
    Dim COL_IN_FAMILY_NAME As Long
    Dim COL_IN_LAST_NAME As Long
    Dim COL_IN_SEX As Long
    Dim COL_IN_ZIP1 As Long
    Dim COL_IN_ZIP2 As Long
    Dim COL_IN_PREFECTURE As Long
    Dim COL_IN_CITY As Long
    Dim COL_IN_TOWN As Long
    Dim COL_IN_BUILDING As Long
    Dim COL_IN_ADDRESSLIST_PROHIBITED As Long
    

    그리고, 열 번호를 증분하면서 대입해 갑니다.
        Dim i As Long: i = COL_IN_ITEM_START - 1
        i = i + 1: COL_IN_INDEX = i ' A列
        i = i + 1: COL_IN_FAMILY_NAME = i ' B列
        i = i + 1: COL_IN_LAST_NAME = i ' C列
        i = i + 1: COL_IN_SEX = i ' D列
        i = i + 1: COL_IN_ZIP1 = i ' E列
        i = i + 1: COL_IN_ZIP2 = i ' F列
        i = i + 1: COL_IN_PREFECTURE = i
        i = i + 1: COL_IN_CITY = i
        i = i + 1: COL_IN_TOWN = i
        i = i + 1: COL_IN_BUILDING = i
        i = i + 1: COL_IN_ADDRESSLIST_PROHIBITED = i
    

    무엇이 개선되는지



    열이 바뀌거나 추가되었을 때 열 번호의 대체 위치를 편집하기 만하면됩니다.
    위에서 열순으로 늘어서 있으므로, 실제의 표를 보면서 재정렬할 수 있어 실패도 하기 어렵습니다.

    조금 야모야하는 점



    사실상 정수인데, 문법적으로는 변수로 해 버리고 있으므로, 그 점 조금도 붙입니다.

    패턴 3, Enum 버전



    @jinoji 님에게 코멘트 받은 Enum을 사용해 보았습니다.
    모든 코드는 여기

    이런 식으로 정의하면,
    ' --- 入力列定義
    Enum COL_IN
        Index = 1
        familyName ' 2 (値を指定しなければ、前の項目からインクリメントされた値になる)
        lastName ' 3
        sex ' 4
        zip1 ' (以下略)
        zip2
        prefecture
        city
        town
        building
        addresslistProhibited
    End Enum
    
    Enum名.項目名 느낌으로 사용할 수 있습니다.
        ' 住所
        Dim prefecture As String: prefecture = wsIn.Cells(rowNoIn, COL_IN.prefecture).Value
        Dim city As String: city = wsIn.Cells(rowNoIn, COL_IN.city).Value
        Dim town As String: town = wsIn.Cells(rowNoIn, COL_IN.town).Value
        Dim building As String: building = wsIn.Cells(rowNoIn, COL_IN.building).Value
    

    이것은 쓰기 쉽고 좋습니다.
    단지 난점이 있다면, 항목명이 너무 짧아지기 때문에,
    Enum COL_IN
        Index = 1
    

    와 같이, 다른 변수와 철자가 같은 것이 된 것은, 대문자 소문자가 끊어져 버립니다.
    사치스러운 고민 같은 생각도 합니다만・・・.
    명명을 잘 돌리지 않으면, 항목명의 통일성이 없어져 버리므로, 주의가 필요할 것 같습니다.

    참고 자료



    Enum 문(VBA) - Microsoft Docs

    좋은 웹페이지 즐겨찾기