2015-02-02 8 views
0

다른 탭의 요약 데이터 (매월 하나씩)를 저장하는 워크 시트에 명명 된 범위가 있습니다. 범위는 JAN/FEB/MAR 등입니다. 내 파일은 한 달을 다른 달과 비교하는 다양한 보고서를 포함하고 있으며이 동적을 만들기 위해 사용자는 두 달을 비교할 수 있어야합니다.Userform Listbox를 사용하여 명명 된 범위 선택

보고서에 필요한 요약 데이터가있는 붙여 넣기 된 (값) 버전이있는 별도의 시트에서 실행되므로 본질적으로 사용자가 월을 선택할 수있는 사용자 양식의 매크로가 필요합니다. 해당 범위를 복사하여 보고서를 구동하는 시트에 붙여 넣으십시오. 시트 이름을 기반으로 유사한 작업을 수행했지만 (아래 코드 참조) 이름이 지정된 범위에서는 작동하지 않습니다.

도움을 주신다면 기꺼이 감사 드리며, 나는이 모든면에서 스스로 교육받은 아마추어입니다.

Private Sub CommandButton1_Click() 
    Dim i As Integer, sht As String 
    For i = 0 To ListBox1.ListCount - 1 
     If ListBox1.Selected(i) = True Then 
      sht = ListBox1.List(i) 
     End If 
    Next i 
    Sheets(sht).Range("A4:C15").Copy 
    Sheets("Sheet1").Select.Range("N1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
    Application.CutCopyMode = False 
    End 
End Sub 

Private Sub CommandButton2_Click() 
    Unload UserForm2 
End Sub 

Private Sub ListBox1_Click() 

End Sub 

Private Sub UserForm_Initialize() 
    Dim ws As Worksheet 
    For Each ws In ThisWorkbook.Worksheets 
     ListBox1.AddItem (ws.Name) 
    Next ws 
End Sub 

답변

0

먼저 ComboBox를 사용자가 선택할 수있는 UI 컨트롤이 필요합니다. 그런 다음 선택한 값에 따라 선택할 이름 지정된 범위를 선택할 수 있습니다. 해당 범위를 선택하고 각주기마다 간단한 반복을 통해 반복합니다. 결국

는,이 같은 것을 볼 수 있었다 :

Sub Main(selectedMonth as Integer) 
    Dim referenceName As String 
    Dim monthRange As Range 
    Dim cell As Range 

    Select Case selectedMonth 
     Case 1 
      referenceName = "JanuaryRange" 
     Case 2 
      referenceName = "FebruaryRange" 
     ' etc 
    End Select 

    If referenceName <> "" Then 
     Set monthRange = Range(referenceName) 

     For Each cell In monthRange 
      ' Add cell.Value as item to your listbox 
     Next cell 
    End If 
End sub 

당신은 어쩌면 좀 더 많은 오류 처리를 추가해야합니다.

추신 : 실제로 개체를 설명하는 이름을 사용해야합니다. 두 개가 있으면 CommandButton2가 좋을 수 있으며, 더 많은 시간을 할애해야 할 수도 있습니다.

0

당신은 콤보 상자에있는 모든의 MonthNames을로드 할 수

Private Sub Userform_Initialize() 
combobox1.List = Application.GetCustomListContents(4) 
end sub 

당신은 선택 monthrange 복사 할 수 있습니다 : (서술적인 이름 마렉와 좋은 조언) 귀하의 빠른 응답을 모두

Private Sub Combobox1_Change() 
With ThisWorkbook.Names(combobox1.value) 
    sheets("sheet1").cells(1,14).Resize(.RefersToRange.Rows.Count, .RefersToRange.Columns.Count) = .RefersToRange.Value 
End With 
End Sub 
0

감사합니다

콤보 상자는 대접을 받았지만 다음과 같이 원래 목록 상자를 만들 수도있었습니다 (기술적으로 가장 소리가 나는 방법은 확실하지 않지만 작업 OK) ...

나는 베스트 프랙티스가 아니라는 것을 알고있는 페이스트를 활성화하기 위해 시트를 활성화해야했지만 타협하지 않으면 행복하지 않아 손상을 입히고 그 방법을 갖게했다!

희미한 RNG

개인 서브 ListBox1_Click()

종료 하위

개인 서브 CommandButton1_Click() 희미한 난 하위 정수

개인 서브 CommandButton3_Click() 언로드 UserForm1을 끝으로 정수로, 문자열로 문자열 i = 0 To ListBox1.ListCount - 1 Lis의 경우 tBox1.Selected (내가) = TRUE 그런 RNG = ListBox1.List (내가) 내가 범위 (RNG) .Copy 시트 ("DRIVE"). 범위 ("A5")를 활성화 다음 경우 끝.PasteSpecial 붙여 넣기 : =의 xlPasteValues, 작동 : = xlNone, SkipBlanks _ : = 거짓, 트랜스 :. = 거짓 Application.CutCopyMode = 거짓 시트 ("보고서") 활성화 종료

최종 하위

개인 서브 UserForm_Initialize()에 ListBox1와

.AddItem "JAN" 
.AddItem "FEB" 
.AddItem "MAR" 
.AddItem "APR" 
.AddItem "MAY" 
.AddItem "JUN" 
.AddItem "JUL" 
.AddItem "AUG" 
.AddItem "SEP" 
.AddItem "OCT" 
.AddItem "NOV" 
.AddItem "DEC" 

끝으로

종료 하위

개인 하위 CommandButton2_Click()

Dim i As Integer, rng As String 
For i = 0 To ListBox1.ListCount - 1 
    If ListBox1.Selected(i) = True Then 
     rng = ListBox1.List(i) 
    End If 
Next i 
Range(rng).Copy 
Sheets("DRIVE").Activate 
Range("A43").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Application.CutCopyMode = False 
Sheets("REPORTS").Activate 
End 

최종 하위