해결 엑셀2019윈도우10
vba 특정 키워드와 일치 할 경우 병합 코드 질문
안녕하세요.
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 ''마지막셀 병합 할 것이 있을 경우 병합
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 ''마지막셀 병합 할 것이 있을 경우 병합
채
P
아
코
댓글 5
첫번째 For,,, Next에서 각 행단위 점검을 진행
현재키워드가 행에 있으면 출고건수나 취소건수 누적하고 다음행으로,,,
현재키워드가 없으면, 시작행번호부터 현재행이전까지 병합, 둘이 같으면 skip
_ 두번째 For,,, Next 로 새로운 검색 키워드 지정
_ 새로운 시작행 저장
첫번째 For,,,Next 종료후 남아 있는 키워드와 시작행으로 마지막 정리
대충 이런 순서일 듯 합니다.
백수님께서 남겨주신 구조로 하게되면 검색 키워드만큼 for문이 추가 되는데 제가 이해한게 맞을까요?
본문의 검색 키워드 갯수는 줄여놓은거라 실제 검색키워드는 64개고, 앞으로 계속 늘어나게 될 예정이라,, 제가 이해한게 맞다면
해당 구조 말고 키워드가 계속 늘어나더라도 구조 변경 없이 진행 할 수 있도록 하는 방법은 없을까요?
첫번째 For문을 Excel의 Range나 Cell을 사용하지 마시고, 필요한 부분을 Array에 집어 넣고 하시면
속도에 큰 문제가 없을 듯 합니다.
시도해보겠습니다!!
시간 내어주셔서 감사드립니다