메뉴
해결 엑셀2019윈도우10

vba 특정 키워드와 일치 할 경우 병합 코드 질문

12월 20일 조회 1,109
안녕하세요.

A열에 있는 단어를 기준으로 검색 키워드와 일치 할 경우,

일치하는 D셀을 병합하면서 D셀의 값을 병합한 셀에 넣는 기능을 만들고 있습니다.



위와 같이 A열에 있는 명화와 플라워는 고유 상품으로 병합 할 게 없지만,

위브의 경우 3개가 일치하므로 D 셀을 병합하면서 -5라는 값을 기입하고 싶습니다.

 

문제점.

※ if문에서 검색 키워드와 일치 하지 않을 경우 현재 검색하고자 하는 행은 변동없이 검색 키워드만 1씩 증가하여 찾아야하는데, 행도 같이 변경되어 영영 찾을 수 없게 되고 있습니다.

 

해결방법

1. else문 진입 시 sh1_ArrKeyword(i)값만 따로 증가

- 이건 상식적으로 안될 것 같음

2. 2중 for문으로 첫번째 for문의 증가값을 sh1_Arrkeyword 얘한테 주기

- 가능성이 가장 높으며 else 문에 진입 했을 시 2번째 포문을 빠져나와 첫번째 포문부터 시작하게되면 예상했던 결과가 나올 것 같은데,

else 문에서 어떻게 강제로 빠져나가는지 잘 모르겠네요..

 

좋은 방법이 있을까요?

글도 길고 코드도 개판이라 알아보시기 힘드실거같습니다..

 

Dim lRow As Long
Dim iCnt As Integer
Dim rX As Range
Dim ww As Integer
Dim Sum As Integer
sh1_Keyword = "명화 D,신윤복 민속화 D,데님 D,플라워 D,위브 D,트리치"
sh1_ArrKeyword = Split(sh1_Keyword, ",")

ww = 0

Set rX = Sheets(1).Cells(1, "A") ''셀 지정

For lRow = 3 To lastRow

If InStr(1, Cells(lRow, 1), sh1_ArrKeyword(ww)) Then ''rX값과 n행 셀과 같을 경우 iCnt 값 증가
iCnt = iCnt + 1 ''iCnt는 셀 병합을 위해 증가
Sum = Sum + Cells(lRow, "D")

Else

rX.Cells(1, "D").Resize(iCnt).Merge ''rX값과 n행의 셀 값이 다를 경우 D열 iCnt 값만큼 병합
Cells(lRow - 1, "D").MergeArea.Value = Sum

Set rX = Cells(lRow, 1) ''병합 후 rX값 현재 For문 값 위치로 세팅
iCnt = 1 ''병합 크기 정하는 변수 초기화
ww = ww + 1
Sum = Cells(lRow, "D").Value '' else문의 첫번째 D열 값 저장, 이렇게 해야 정상적으로 합계가 가능
lRow = lRow

End If
Next
rX.Cells(1, "D").Resize(iCnt).Merge ''마지막셀 병합 할 것이 있을 경우 병합

댓글 5

원조백수 12월 20일
사용중인 키워드를 위한 변수, 현재키워드가 시작되는 행 변수 추가
첫번째 For,,, Next에서 각 행단위 점검을 진행
현재키워드가 행에 있으면 출고건수나 취소건수 누적하고 다음행으로,,,
현재키워드가 없으면, 시작행번호부터 현재행이전까지 병합, 둘이 같으면 skip
_                        두번째 For,,, Next 로 새로운 검색 키워드 지정
_                        새로운 시작행 저장
첫번째 For,,,Next 종료후 남아 있는 키워드와 시작행으로 마지막 정리

대충 이런 순서일 듯 합니다.
채원석 작성자 12월 20일
@원조백수 님 답변 감사합니다.

백수님께서 남겨주신 구조로 하게되면 검색 키워드만큼 for문이 추가 되는데 제가 이해한게 맞을까요?

본문의 검색 키워드 갯수는 줄여놓은거라 실제 검색키워드는 64개고, 앞으로 계속 늘어나게 될 예정이라,, 제가 이해한게 맞다면

해당 구조 말고 키워드가 계속 늘어나더라도 구조 변경 없이 진행  할 수 있도록 하는 방법은 없을까요?
원조백수 채택된 답변 12월 20일
@채원석 님 첫번째 For 문안에 두번째 For 문이 들어 갑니다.
첫번째 For문을 Excel의 Range나 Cell을 사용하지 마시고, 필요한 부분을 Array에 집어 넣고 하시면
속도에 큰 문제가 없을 듯 합니다.
채원석 작성자 12월 20일
@원조백수 님 아아아아아아 뭔가 이해가 될 듯 말 듯 하면서도 큰 힌트를 얻었습니다 ㅎㅎㅎ

시도해보겠습니다!!

시간 내어주셔서 감사드립니다
채원석 작성자 12월 20일
@원조백수 님 새로운 시작 행 저장이라는 말이,, 저도 계속 생각을 계속 하고 있었는데 생각이 안나다가 왠지 백수님 답변들으니 갑자기 해결방법이 생각나서 시도하니 해결 됐습니다~~ 감삼다!

질문답변 게시판의 최근 글

스크랩 완료