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. Затем, исходя из выбранного значения, вы можете выбрать, к какому именованному диапазону выбрать. Вы выбираете этот диапазон и повторяете его с помощью простого для каждого цикла.

В конце концов, это может выглядеть примерно так:

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 

Вы, возможно, потребуется добавить еще несколько обработки ошибок.

PS: Вы должны использовать дескриптивные имена для своих объектов, 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

Спасибо как для ваших быстрых ответов (и хорошего совета с описательными именами Марека)

Коробка сработала, но мне также удалось заставить мой оригинальный список работать следующим образом (не уверен, что это самый технически здоровый способ сделать это, но, похоже, работа ОК) ...

Мне нужно было активировать лист для вставки, который, как я знаю, не является лучшей практикой, но он не был доволен без этого, так что я скомпрометировал и дал ему свой путь!

Dim ГСЧ As Integer

Private Sub CommandButton3_Click() Разгрузка UserForm1 End Sub

Private Sub ListBox1_Click()

End Sub

Private Sub CommandButton1_Click() Dim я Как Integer, rng As String Для i = 0 To ListBox1.ListCount - 1 Если Lis tBox1.Selected (я) = True Then RNG = ListBox1.List (я) End If Next я Range (ГСЧ) .Copy Sheets ("ДРАЙВ"). Активировать Range ("A5").PasteSpecial Paste: = xlPasteValues, Operation: = xlNone, SkipBlanks _ : = False, Транспонирование:. = False Application.CutCopyMode = False Sheets ("Отчёты") Активировать Конец

End Sub

Private Sub 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" 

End With

End Sub

Private Sub 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 

End Sub

 Смежные вопросы

  • Нет связанных вопросов^_^