Список VBA выбирает лист по индексу

У меня есть форма со списком, которая динамически предоставляет список листов в текущей книге (код ниже). Я хочу взять выбранный лист и сослаться на него в формуле позже в процессе. Из часов игры я не могу этого сделать. Кажется, я где-то читал, что вы не можете вернуть строку обратно в подпрограмму и использовать ее для ссылки на объект. Поэтому я подумал, может быть, я могу создать два списка

  1. для имени листа
  2. для листового индекса

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

В жизни моей я не могу найти способ соединить их, поскольку элементы всегда будут меняться; код будет запускаться в нескольких книгах несколькими операторами, поэтому макет, скорее всего, будет меняться между пользователями. Я могу легко добавить второй список с индексом #, но у меня есть блок, как связать имя, которое будет иметь значение для пользователя, и индекс, который я могу передать обратно в подпрограмму. Я понимаю, что процедура «По щелчку» для поля со списком связывает эти два поля, но из-за динамического характера полей я не могу придумать логику, чтобы поместить это в код.

For N = 1 To ActiveWorkbook.Sheets.Count
    With ListBox1
        .AddItem ActiveWorkbook.Sheets(N).Name
    End With
Next N

person Mark    schedule 13.01.2015    source источник
comment
Вы можете ссылаться на лист, используя имя, а также индекс. Что вы хотите сделать, получив строку выбранного элемента? то есть Msgbox(Worksheets(selectedItemFromList).Name)   -  person shahkalpeshp    schedule 13.01.2015
comment
Я подумал, что могу добавить его в формулу для ссылки на рабочий лист (где xxxxxxxx представляет выбор из списка): Cells(1, 1).FormulaR1C1 = =VLOOKUP(R7C5, & xxxxxxx & !R1C1:R65000C8,2,FALSE ) Я должен упомянуть, что я передаю выбранный лист обратно в подпрограмму в типе переменной: строка.   -  person Mark    schedule 13.01.2015
comment
Вы строите формулу, используя строку. Итак, я не уверен, почему это не сработает?   -  person shahkalpeshp    schedule 13.01.2015


Ответы (1)


Попробуйте это.

Объявите общедоступную переменную над кодом пользовательской формы, сделав ее доступной для всей книги из любого модуля или кода.

Public listChoice As String

Использование вашего кода для получения имен листов для источника строк ListBox.

Private Sub UserForm_Activate()

    For n = 1 To ActiveWorkbook.Sheets.count
        With ListBox1
            .AddItem ActiveWorkbook.Sheets(n).name
        End With
    Next n

End Sub

Включение события обновления для ListBox

Private Sub ListBox1_AfterUpdate()

    listChoice = ListBox1.Text

End Sub

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

Private Sub cmdTestChoice_Click()

    MsgBox ("The choice made on the ListBox was: " & listChoice)

End Sub

изменить. Чтобы получить доступ к этому листу позже, вы можете вызвать его, используя что-то вроде этого:

Некоторые примеры различных способов доступа к ячейке с использованием .Range или .Cells с цифрами или буквами.

Использование lRow и lCol as Long для установки номеров строк и столбцов.

Sheets(listChoice).Cells(lRow, lCol).Value = TextBox1.Value  'Set cell on sheet from TextBox
TextBox2.Value = Sheets(listChoice).Range("A2").Value        'Set TextBox From Cell on Sheet
'Set a cell on another sheet using the selected sheet as a source.
Sheets("AnotherSheet").Cells(lRow, "D") = Sheets(listChoice).Range("D2")  

Снимок экрана

person peege    schedule 13.01.2015
comment
да, у меня есть лист по имени Стэн, ничего страшного. - person peege; 13.01.2015
comment
Спасибо. У меня очень похожая установка. Теперь, когда я возвращаю общедоступную переменную, в данном случае listchoice. Как я могу заставить VBA использовать это как рабочий лист? В этот момент пользователь хочет найти данные, которые находятся на листах[listchoice]. - person Mark; 13.01.2015
comment
см. пересмотренный ответ, чтобы получить несколько примеров использования переменной в объявлении рабочего листа для установки значений. При использовании Sheets("sheetName") ожидаемый тип имени листа в любом случае является строкой, поэтому он хорошо подходит. - person peege; 13.01.2015
comment
Спасибо. Теперь я вижу, что моя проблема была больше связана со ссылкой в ​​формуле. Ваша работа подтвердила, что моя идея была в правильном направлении. Я не помещал .name после переменной в myVlookup. - person Mark; 13.01.2015
comment
Замечательно. Я рад слышать, что вы уже двинулись в этом направлении. В качестве подсказки, проверьте окно Locals при отладке, оно сообщает вам, какие типы вещей и их значения по мере того, как вы проходите код. Никакого оскорбления не имелось в виду, если вы уже знали об этом. Вы можете видеть, как все доступно. - person peege; 13.01.2015
comment
Никаких оскорблений... Мы очень признательны за вашу помощь. Мне нужно многому научиться. - person Mark; 13.01.2015