0

同僚のためにマクロを作成しています。彼らは毎日ファイルを受け取り、一日の終わりに特定の情報を別のワークブックにコピーする必要があります。マクロはコピーを処理するためのものです。現在開いているブックのリストを含むコンボボックスポップアップを備えたユーザーフォームが必要です。これにより、コピー元のファイルがわかります。そこで行われた選択によって、その選択でブック変数が設定されるように設定するにはどうすればよいですか?

私がやろうとしていることは:

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
4

2 に答える 2

0

CopySub何\どこにあるかわからないため、コードは現在機能していませんComboBox1。また、ユーザーがキャンセル ボタンを押す代わりにフォームの X をクリックしてフォームを閉じるか、ワークブックを選択せず​​に [OK] ボタンをクリックすると、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

他に考えるべきことは、マクロをより速く簡単に実行できるようにする方法です。フォーム上にワークブックを選択するためのコンボボックスしかなく、ユーザーがキーボード ショートカットまたはメニューからマクロを開始する場合は、アクティブなワークブックでマクロを実行するかどうかをマクロに確認させることを検討してください。質問に対して [はい] をクリックする方が、ドロップダウン ボックスをクリックしてワークブックを選択し、[OK] をクリックするよりもはるかに高速です。

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
于 2012-03-27T17:57:44.117 に答える
0

さらに検索した後、答えが見つかりました.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
于 2012-03-28T12:31:00.907 に答える