레이아웃 변경에 강한 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
약점
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
약점
패턴 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
Reference
이 문제에 관하여(레이아웃 변경에 강한 VBA 코드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kumanobori/items/79ca7c4295e7a09b3f73텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)