Задать переменную рабочей книги из списка пользователей - PullRequest
0 голосов
/ 27 марта 2012

Я создаю макрос для моих коллег. Они получают файл ежедневно, и в конце дня им приходится копировать определенную информацию в другую рабочую книгу. Макрос должен заботиться о копировании. Я хочу иметь пользовательскую форму с всплывающим списком со списком, который содержит список текущих открытых рабочих книг, чтобы он знал, из какого файла копировать. Как мне сделать так, чтобы выбор, сделанный там, устанавливал переменную книги с этим выбором?

Я пытаюсь сделать следующее:

Sub CopySub()

Dim wb As Workbook

UserForm1.Show

Set wb = Workbooks(ComboBox1.Value)
....Rest of Copy and Paste Code

Ниже приведен код для пользовательской формы:

Private Sub OK_Click()
'Take user selection and continue copy and paste code
UserForm1.Hide
End Sub

Private Sub Cancel_Click()
'Cancel everything, end all code
End
End Sub


Private Sub UserForm_Activate()

  'Populate list box with names of open workbooks.

  Dim wb As Workbook

  For Each wb In Workbooks

    ComboBox1.AddItem wb.Name

  Next wb

End Sub

Ответы [ 2 ]

0 голосов
/ 28 марта 2012

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

Public wb1 As String

Sub CopySub()

Dim wbCAR As Workbook

UserForm1.Show

Set wbCAR = Workbooks(wb1)
....Rest of code

и установив код пользовательской формы следующим образом:

Private Sub OK_Click()
wb1 = ComboBox1.Value
UserForm1.Hide
End Sub

Private Sub Cancel_Click()
Unload Me
End
End Sub


Private Sub UserForm_Activate()

  'Populate list box with names of open workbooks.
  Dim wb As Workbook
  For Each wb In Workbooks
    ComboBox1.AddItem wb.Name
  Next wb

End Sub
0 голосов
/ 27 марта 2012

Ваш код сейчас не работает, потому что CopySub не знает, что \ где ComboBox1. Кроме того, если пользователь нажимает X формы, чтобы закрыть ее вместо нажатия кнопки отмены, или нажимает кнопку ОК, не выбирая рабочую книгу, CopySub продолжит работу.

Есть несколько способов получить информацию о форме. Самым простым с вашим текущим кодом является правильная ссылка на ComboBox1 и добавление простого теста.

Sub CopySub()
   Dim wb As Workbook

   UserForm1.Show
   If UserForm1.ComboBox1.Value = "" Then
      Exit Sub
   End If

   Set wb = Workbooks(UserForm1.ComboBox1.Value)
   ' rest of code goes here

End Sub

Однако нужно еще кое-что подумать о том, как ускорить и упростить работу вашего макроса. Если в вашей форме единственной вещью является Combobox для выбора рабочей книги, и пользователи будут запускать макрос с помощью сочетания клавиш или из меню, подумайте о том, чтобы макрос спросил, хотят ли они запустить макрос в активной рабочей книге. Нажав Да на вопрос намного быстрее, чем щелкнуть раскрывающийся список, выбрать рабочую книгу и нажать кнопку ОК.

Sub CopySub()
   Dim wb As Workbook

   If MsgBox("Do you want to run the macro on '" & ActiveWorkbook.Name & "'?", vbQuestion + vbYesNo) = vbYes Then
      Set wb = ActiveWorkbook
   Else
      UserForm1.Show
      If UserForm1.ComboBox1.Value = "" Then
         Exit Sub
      End If
      Set wb = Workbooks(UserForm1.ComboBox1.Value)
   End If

   ' rest of code goes here

End Sub
...