|
例えば、以下の様な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
|
|