| 
    
     |  | 例えば、以下の様なUserFormをモーダル表示で試して見たら? 
 UserFormに以下のコントロールを配置します
 1、TextBox1:OpenしているBookのFullPathを表示
 2、CommandButton1:OpenするBookを選択する為のダイアログ表示し、BookをOpen
 3、CommandButton2:現在OpenしているBookをCloseする
 4、ComboBox1:OpenしたBook(転記元)のシート選択
 5、RefEdit1:転記元シートの範囲選択用
 6、ComboBox2:マクロの在るBook(転記先)のシートを選択、若しくは新規シート作成
 7、CommandButton3:転記実行ボタン
 8、CommandButton4:UserFormを閉じるボタン
 
 UzerFormが表示される時点で、TextBox1が""ならBook選択ダイアログが表示されるので
 選択してOkすれば、BookがOpenされます
 BookがOpenされると、そのBookの全シート名がComboBox1のListに設定されます
 Copyするシートを選択し、RefEdit1にフォーカスが移れば、上記のシートで範囲選択が出来ます
 次に、ComboBox2でList選択されればそのシートが転記先に選択され、
 TextBox部に転記元に無いシート名を入れてEnterすれば、TextBox部の名前でシートが作成され転記先に成ります
 RefEdit2は、転記先の転記位置を選択します
 上記の各パラメタが揃えば、CommandButton3(実行ボタン)で転記が実行されます
 CommandButton4は閉じるボタンで、もしBookが開いていた場合此れを閉じ、UserFormを閉じます
 
 尚、RefEditのコントロールは、モードレスでは使えないと思います
 
 Option Explicit
 
 Private wkbOpen As Workbook
 
 Private Sub UserForm_Activate()
 
 If wkbOpen Is Nothing Then
 CommandButton1_Click
 End If
 
 End Sub
 
 Private Sub UserForm_Initialize()
 
 Dim i As Long
 
 With ThisWorkbook
 For i = 1 To .Worksheets.Count
 ComboBox2.AddItem .Worksheets(i).Name
 Next i
 End With
 
 ComboBox1.Enabled = False
 RefEdit1.Enabled = False
 
 End Sub
 
 Private Sub UserForm_Terminate()
 
 Set wkbOpen = Nothing
 
 End Sub
 
 Private Sub ComboBox1_Change()
 
 If ComboBox1.ListIndex = -1 Then
 Exit Sub
 End If
 
 With wkbOpen.Worksheets(ComboBox1.Value)
 .Activate
 RefEdit1.Enabled = True
 RefEdit1.Value = .UsedRange.Address(External:=True)
 RefEdit1.SetFocus
 End With
 
 End Sub
 
 Private Sub ComboBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
 
 If ComboBox2.Value <> "" And ComboBox2.ListIndex = -1 Then
 If MsgBox("新規のシートをComboBoxの名前で作成します", vbOKCancel) = vbOK Then
 With ThisWorkbook.Worksheets.Add
 .Name = ComboBox2.Text
 .Activate
 End With
 Else
 Cancel = True
 End If
 Else
 If ComboBox2.ListIndex > -1 Then
 If MsgBox("既存のシートのデータを消去します", vbOKCancel) = vbOK Then
 With ThisWorkbook.Worksheets(ComboBox2.Text)
 .UsedRange.ClearContents
 .Activate
 End With
 Else
 Cancel = True
 End If
 End If
 End If
 
 RefEdit2.Enabled = True
 
 End Sub
 
 Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 
 With ComboBox2
 If .Value <> "" And .ListIndex = -1 Then
 .AddItem .Text
 End If
 End With
 
 End Sub
 
 Private Sub CommandButton1_Click()
 
 Dim i As Long
 Dim vntBook As Variant
 
 If Not GetReadFile(vntBook, ThisWorkbook.Path, False, "OpenするBookを選択して下さい") Then
 Exit Sub
 End If
 
 If StrComp(Dir(vntBook), ThisWorkbook.Name, vbTextCompare) = 0 Then
 MsgBox "開こうとしているBookはマクロの在るこのBookです"
 Exit Sub
 End If
 
 If wkbOpen Is Nothing Then
 TextBox1.Text = vntBook
 Set wkbOpen = Workbooks.Open(vntBook)
 Else
 If MsgBox("現在別のBookがOpenされていますのでCloseします", vbOKCancel) = vbOK Then
 wkbOpen.Close
 TextBox1.Text = vntBook
 Set wkbOpen = Workbooks.Open(vntBook)
 Else
 Exit Sub
 End If
 End If
 
 With ComboBox1
 .Text = ""
 .Clear
 For i = 1 To wkbOpen.Worksheets.Count
 .AddItem wkbOpen.Worksheets(i).Name
 Next i
 End With
 
 ComboBox1.Enabled = True
 RefEdit1.Enabled = False
 
 End Sub
 
 Private Sub CommandButton2_Click()
 
 If Not wkbOpen Is Nothing Then
 If MsgBox("現在のBookをCloseします", vbOKCancel) = vbOK Then
 wkbOpen.Close
 TextBox1.Text = ""
 Set wkbOpen = Nothing
 End If
 End If
 
 ComboBox1.Enabled = False
 RefEdit1.Enabled = False
 
 End Sub
 
 Private Sub CommandButton3_Click()
 
 Dim lngPos As Long
 Dim vntCopy As Variant
 Dim vntTo As Variant
 
 If ComboBox2.ListIndex > -1 Then
 vntCopy = RefEdit1.Value
 lngPos = InStr(1, vntCopy, "!", vbBinaryCompare)
 If lngPos > 0 Then
 vntCopy = Mid(vntCopy, lngPos + 1)
 End If
 vntTo = RefEdit2.Value
 lngPos = InStr(1, vntTo, "!", vbBinaryCompare)
 If lngPos > 0 Then
 vntTo = Mid(vntTo, lngPos + 1)
 End If
 wkbOpen.Worksheets(ComboBox1.Value).Range(vntCopy).Copy _
 Destination:=ThisWorkbook.Worksheets(ComboBox2.Text).Range(vntTo)
 End If
 
 End Sub
 
 Private Sub CommandButton4_Click()
 
 If Not wkbOpen Is Nothing Then
 wkbOpen.Close
 End If
 
 Unload Me
 
 End Sub
 
 Private Sub RefEdit2_Enter()
 
 If ComboBox2.ListIndex > -1 Then
 RefEdit2.Value = ThisWorkbook.Worksheets(ComboBox2.Text) _
 .Cells(1, 1).Address(External:=True)
 End If
 
 End Sub
 
 Private Function GetReadFile(vntFileNames As Variant, _
 Optional strFilePath As String, _
 Optional blnMultiSel As Boolean = False, _
 Optional strTitle As String) As Boolean
 
 '  FileDialog使用版
 
 Dim i As Long
 Dim objFDL As FileDialog
 Dim vntSelected As Variant
 Dim vntFilters As Variant
 
 'Filterを指定
 vntFilters = Array("Excel File", "*.xls;*.xlsx;*.xlsm")
 
 '[ファイル参照] ダイアログの FileDialog オブジェクトを作成
 Set objFDL = Application.FileDialog(msoFileDialogFilePicker)
 
 'Show メソッドでダイアログを表示し、ユーザーのアクションを取得
 With objFDL
 'タイトルを設定
 If strTitle <> "" Then
 .Title = strTitle
 End If
 '初期フォルダ及び、指定ファイル名を設定
 If strFilePath <> "" Then
 .InitialFileName = strFilePath
 End If
 'Filterを設置
 With .Filters
 .Clear
 For i = 0 To UBound(vntFilters) Step 2
 .Add vntFilters(i), vntFilters(i + 1), i \ 2 + 1
 Next i
 End With
 '表示するFilterを設定
 .FilterIndex = 1
 'MultiSelectを設定
 .AllowMultiSelect = blnMultiSel
 'ユーザーがボタンをクリック
 If .Show = -1 Then
 If blnMultiSel Then
 'ファイル名保存する配列を確保
 ReDim vntFileNames(1 To .SelectedItems.Count)
 'FileDialogSelectedItemsコレクション内のすべてのファイル名を取得
 i = 0
 For Each vntSelected In .SelectedItems
 '選択した各アイテムのパスを含む値を取得
 i = i + 1
 vntFileNames(i) = vntSelected
 Next vntSelected
 Else
 vntFileNames = .SelectedItems(1)
 End If
 '戻り値としてTrueを返す
 GetReadFile = True
 End If
 End With
 
 Set objFDL = Nothing
 
 End Function
 
 |  |