閉じたワークブック(1個)からワークシートをコピーして、
アクティブのワークブックに挿入するマクロを作成しました。
普通に、Alt+F8からマクロを呼び出す時は問題なかったのですが、
ユーザーフォームのボタンに貼り付けて、
呼び出すとエラーになって機能しませんでした。
いろいろ試してみて、以下のところまで出来たのですが
どこが間違っているのかわかりません。
すいませんがユーザーフォームの機能に詳しい方
説明の上手な方、コードで直接説明出来る方、
以下のコードの間違いを教えて下さい。
--------------------
機能の詳細
「CommandButton25」からボタン一発で
所定のワークブックの(1)、特定のシート(2)をコピーして
アクティブのワークブックに挿入する
※マクロはアクティブのワークブックの中にある
1-A)取り込み先の閉じたワークブックの場所
"C:\A"(Cドライブの「A」フォルダー)
1-B)取り込み先の閉じたワークブックの名前
「取込み先.xls」
2)コピーしてくるシートの名前
「TextBox1」の中に記載された文字列を読み取る
--------------------
追記
1)
エラーメッセージの詳細は画像をご参照ください
2)
作成したマクロは以前、こちらのサイトで頂いた
よく似た機能のマクロをカスタマイズしたものです。
※機能が少し違うので余計なコードが残っているかもしれません。
↓
【VBA】3個のワークブックから同時にシートをコピーしたい
https://oshiete.goo.ne.jp/qa/9476111.html
--------------------
Private Sub CommandButton25_Click()
Const dirname As String = "C:\A"
'1つのワークブックからシートを1つコピーする
Public Sub CopySheets()
Dim dirname As String
Dim trgbooks As Variant
Dim trgsheets As Variant
Dim i As Long
Dim j As Variant
j = TextBox1.Value
trgbooks = Array("取込み先.xls")
trgsheets = Array(j)
For i = 0 To UBound(trgbooks)
'sheetの取り込み
Call GetSheet(trgbooks(i), trgsheets(i))
Next
End Sub
'指定ブックの指定シートを取り込む
Public Sub GetSheet(ByVal bookName As String, ByVal SheetName As String)
Dim fullName As String
Dim myBook As String
Dim mySheet As String
myBook = ThisWorkbook.Name
mySheet = Worksheets(1).Name
If ExistsWorkSheet(SheetName) Then
Application.DisplayAlerts = False 'シート削除時の警告を出さないようにする
Worksheets(SheetName).Delete '既に該当シートがあるなら削除する
Application.DisplayAlerts = True 'シート削除時の警告を出すようにする(元に戻す)
End If
fullName = dirname & "\" & bookName
If Dir(fullName) = "" Then
MsgBox (fullName & "は存在しません")
Exit Sub
End If
Workbooks.Open fullName
Workbooks(bookName).Activate
If ExistsWorkSheet(SheetName) = False Then
MsgBox (bookName & "中に" & SheetName & "は存在しません")
Workbooks(bookName).Close
Exit Sub
End If
Worksheets(SheetName).Copy after:=Workbooks(myBook).Worksheets(mySheet)
Application.DisplayAlerts = False 'セーブのメッセージ出さない
Workbooks(bookName).Close
Workbooks(myBook).Activate
MsgBox (bookName & "中の" & SheetName & "をコピー完了")
Sheets(" 番 号 確 認 ").Select
'動作確認にA1セルに移動
Range("A1").Select
End Sub
'ワークシートの存在チェック
Public Function ExistsWorkSheet(ByVal SheetName As String) As Boolean
Dim ws As Worksheet
ExistsWorkSheet = False
For Each ws In Worksheets
If ws.Name = SheetName Then
ExistsWorkSheet = True
Exit Function
End If
Next ws
End Sub
No.1ベストアンサー
- 回答日時:
以下のようにしてください。
(いろいろ修正しました)不明点は補足してください。
-------------------------------------------------------
Private Sub CommandButton25_Click()
'1つのワークブックからシートを1つコピーする
If TextBox1.Value = "" Then
MsgBox ("TextBox1にシート名なし")
Exit Sub
End If
'sheetの取り込み
Call GetSheet("取込み先.xls", TextBox1.Value)
End Sub
'指定ブックの指定シートを取り込む
Public Sub GetSheet(ByVal bookName As String, ByVal SheetName As String)
Const dirname As String = "C:\A"
'Const dirname As String = "d:\goo\excel\goo33"
Dim fullName As String
fullName = dirname & "\" & bookName
If Dir(fullName) = "" Then
MsgBox (fullName & "は存在しません")
Exit Sub
End If
Workbooks.Open fullName
Workbooks(bookName).Activate
If ExistsWorkSheet(SheetName) = False Then
MsgBox (bookName & "中に" & SheetName & "は存在しません")
Workbooks(bookName).Close
Exit Sub
End If
'マクロのあるBookをActivateする
ThisWorkbook.Activate
If ExistsWorkSheet(SheetName) Then
Application.DisplayAlerts = False 'シート削除時の警告を出さないようにする
Worksheets(SheetName).Delete '既に該当シートがあるなら削除する
Application.DisplayAlerts = True 'シート削除時の警告を出すようにする(元に戻す)
End If
Workbooks(bookName).Worksheets(SheetName).Copy after:=Worksheets(Worksheets.Count)
Workbooks(bookName).Close
MsgBox (bookName & "中の" & SheetName & "をコピー完了")
Sheets(" 番 号 確 認 ").Select
'動作確認にA1セルに移動
Range("A1").Select
End Sub
'ワークシートの存在チェック
Public Function ExistsWorkSheet(ByVal SheetName As String) As Boolean
Dim ws As Worksheet
ExistsWorkSheet = False
For Each ws In Worksheets
If UCase(ws.Name) = UCase(SheetName) Then
ExistsWorkSheet = True
Exit Function
End If
Next ws
End Function
----------------------------
ご解答ありがとうございます。
お礼が遅くなりすいません。
動作確認させて頂きましたがバッチリです!
いつも本当に見事で助かっております。
お気づきだと思いますが、前回の
↓
【EXCEL】別のワークブックにアクティブシートをコピーして挿入したい
https://oshiete.goo.ne.jp/qa/9696108.html
3)ユーザーフォームのボタンから実行します。
動作が分割される場合はボタン一発で実行できるものでお願いします。
→Callの利用は無理だと思います。
はこのことです。
こういったことがあったので、プロシージャーの分割されたものは
ユーザーフォームのボタンからは実行できないと思っておりました。
前回の補足要求:質問3がなかったら、
今回の件も、Callも無理だと思っていましたから。
取り急ぎ、動作確認しただけですので
しばらく質問は開けておきます。
今回は動作するコード(ALT+F8から呼び出すコード)があるので、
後で見比べてみたいと思っております。
いつも丁寧なご解答、本当にありがとうございます。
機会がありましたら、またお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別のシートから値を取得するとき
-
Excel マクロについての相談
-
別のシートを参照して計算する方法
-
エクセルのマクロについて教え...
-
ブック名、シート名を他のモジ...
-
VBA 最終行まで数式をコピーする
-
【ExcelVBA】全シートのセルの...
-
特定の文字を含むシートだけマ...
-
エクセルのマクロについて教え...
-
VBA 入力月で該当シートを選択...
-
一括印刷マクロ シート名を数字...
-
【ExcelVBA】動的にボタン、ボ...
-
VBA 存在しないシートを選...
-
同じ作業を複数のシートに実行...
-
ListViewの画面の更新
-
実行時エラー1004「Select メソ...
-
シートが保護されている状態で...
-
エクセルで通し番号を入れてチ...
-
【VBA】指定した検索条件に一致...
-
ユーザーフォームに入力したデ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別のシートから値を取得するとき
-
ユーザーフォームに入力したデ...
-
【ExcelVBA】全シートのセルの...
-
同じ作業を複数のシートに実行...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
XL:BeforeDoubleClickが動かない
-
ExcelVBA シート名を複数セルか...
-
実行時エラー'1004': WorkSheet...
-
VBA 存在しないシートを選...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ブック名、シート名を他のモジ...
-
【Excel VBA】Worksheets().Act...
-
ExcelのVBAのマクロで他のシー...
-
エクセルのシート名変更で重複...
-
特定の文字を含むシートだけマ...
-
シートが保護されている状態で...
-
Excel マクロについての相談
-
VBA 検索して一致したセル...
おすすめ情報
今回も丁寧なご解答。ありがとうございました。
以前、似たようなことを質問させて頂きましたが、
その時は何となくしかわからなかりませんでした。
今回、利用方法、利便性の理由、etc.については
理解できたので、前回のアドバイスを改めて読み返して、
Functionプロシージャーについて勉強させて頂きます。
いつもご解答ありがとうございます。
機会がありましたら、またお願いします。
--------------------------------
※メモとしてリンクを貼っておきます。
参考先
【EXCEL-VBA】シートの有無を確認してからワークシートを削除したい
https://oshiete.goo.ne.jp/qa/9551164.html
↓
NO.9
第5章 4.プロシージャについて
http://excelvba.pc-users.net/fol5/5_4.html