나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내
작성자:  

 dew (dewdrop)

추천:  2
파일:     질문(14)_Ans.xlsm (168.5KB) 조회:  2124
제목:   [RE]엑셀 VBA 리스트박스 관련 문의드립니다.
     
  * 답변하시는 분들께 도움이 되도록 자신의 환경을 아래 항목 옆에 기재해 주세요.

 - 엑셀 버전(95,97,2000,xp,2003,2007): 2016

* 아래줄에 질문을 작성하세요 >>

안녕하세요.
해결해보려고 노력을 해 보았으나
밤만새고 결국 질문을 드리게 되었습니다 ㅠㅠ

첨부파일의 뷴류표를 기준으로 폼을 만들어 보았으나,
일부 값들이 잘 안들어 오는 부분이 있어 
조언을 구하고자 문의 드립니다.

예시 파일은 첨부하였습니다.
고견 부탁드립니다.
감사합니다.
==============[폴라리스님 글에 대한 답변입니다]==============

첨부화일 참고하세요...


Option Explicit

Dim rGu1 As Range, rGu2 As Range, rGu3 As Range     ' 구분1 ~ 구분3
Dim rGu4 As Range, rGu5 As Range                    ' 품명, 규격

Dim Target As Range, rX As Range                    ' 임시 변수
Dim sGu As String

Private Sub UserForm_Initialize()

    For Each rX In 범위("A").Cells
        If rX <> "" Then Me.구분1리스트상자.AddItem rX
    Next

    Me.구분1리스트상자.ListIndex = 0
End Sub

Private Function 범위(구분 As String) As Range
    With Sheets("단가정보분류표").Range("b2").CurrentRegion
        Set 범위 = .Cells(2, 구분).Resize(.Rows.Count - 1)
    End With
End Function

Private Sub 구분1리스트상자_Click()
    sGu = 구분1리스트상자.list(구분1리스트상자.ListIndex)
    
    If sGu = "" Then Exit Sub
    
    Set Target = 범위("A")
    Set rGu1 = userFind(sGu, Target)
    
    Me.구분2리스트상자.Clear
    Me.구분3리스트상자.Clear
    Me.품명리스트상자.Clear
    Me.규격리스트상자.Clear

    Call AddItemListBox(Me.구분2리스트상자, rGu1)
    
    구분2리스트상자.ListIndex = 0
End Sub

Private Sub 구분2리스트상자_Click()
    sGu = 구분2리스트상자.list(구분2리스트상자.ListIndex)

    If sGu = "" Then Exit Sub
    
    Set Target = rGu1.Offset(0, 1).Resize(rGu1.MergeArea.Rows.Count)
    
    Set rGu2 = userFind(sGu, Target)
    
    Me.구분3리스트상자.Clear
    Me.품명리스트상자.Clear
    Me.규격리스트상자.Clear

    Call AddItemListBox(Me.구분3리스트상자, rGu2)
    
    구분3리스트상자.ListIndex = 0
End Sub


Private Sub 구분3리스트상자_Click()
    sGu = 구분3리스트상자.list(구분3리스트상자.ListIndex)
    
    If sGu = "" Then Exit Sub
    
    Set Target = rGu2.Offset(0, 1).Resize(rGu2.MergeArea.Rows.Count)
    Set rGu3 = userFind(sGu, Target)
    
    
    Me.품명리스트상자.Clear
    Me.규격리스트상자.Clear

    Call AddItemListBox(Me.품명리스트상자, rGu3)
    
    품명리스트상자.ListIndex = 0
End Sub

Private Sub 품명리스트상자_Click()
    sGu = 품명리스트상자.list(품명리스트상자.ListIndex)
    
    If sGu = "" Then Exit Sub
    
    Set Target = rGu3.Offset(0, 1).Resize(rGu3.MergeArea.Rows.Count)
    Set rGu4 = userFind(sGu, Target)
    
    Me.규격리스트상자.Clear

    Call AddItemListBox(Me.규격리스트상자, rGu4)
    
    규격리스트상자.ListIndex = 0
End Sub


Private Sub 규격리스트상자_Click()
    sGu = 규격리스트상자.list(규격리스트상자.ListIndex)
    
    If sGu = "" Then Exit Sub
    
    Set Target = rGu4.Offset(0, 1).Resize(rGu4.MergeArea.Rows.Count)
    Set rGu5 = userFind(sGu, Target)

    If Not rGu5 Is Nothing Then
        Me.메이커텍스트상자 = rGu5.Offset(0, 1)
        Me.조사단계텍스트상자 = rGu5.Offset(0, 2)
        Me.단위텍스트상자 = rGu5.Offset(0, 3)
        Me.거래조건텍스트상자 = rGu5.Offset(0, 4)
        Me.주기텍스트상자 = rGu5.Offset(0, 5)
        Me.설명텍스트상자 = rGu5.Offset(0, 6)
        Me.가격텍스트상자 = rGu5.Offset(0, 7)
    Else
        MsgBox "규격에서 [" & sGu & "] 값를 찾을수 없습니다.", vbCritical
    End If
End Sub

Function userFind(sWhat As String, rData As Range) As Range
    Dim rFind As Range
    
    Set rFind = rData.Find(sWhat, LookAt:=xlWhole)
    If rFind Is Nothing Then
        For Each rFind In rData.Cells
            If rFind = sWhat Then Exit For
        Next
    End If
    
    Set userFind = rFind
End Function

Sub AddItemListBox(lstBox As Object, rData As Range)
    Dim rCell As Range
    
    For Each rCell In rData.MergeArea.Cells
        If rCell(1, 2) <> "" Then lstBox.AddItem rCell(1, 2)
    Next
End Sub
 
[불량 게시물 신고]  
폴라리스이렇게도 해결할수 있네요~
몇일을 고민하던게 잘 해결되었습니다~
감사합니다~!
10-07 (08:51)
삭제 ■신고
        
  

작성일 : 2019-10-01(10:50)
최종수정일 : 2019-10-01(10:50)
 


 ◎ 관련글

  제 목   작성자   날짜
엑셀 VBA 리스트박스 관련 문의드립니다. 폴라리스 2019-09-28
[RE]엑셀 VBA 리스트박스 관련 문의드립니다. dew 2019-10-01