- ベストアンサー
Excelユーザーフォームでシートの移動方法
- Excelユーザーフォームを使用してデータブック内のシートを移動させる方法について解説します。
- ユーザーフォームにリストボックスを配置し、データブック内のシート一覧を表示します。
- 選択したシートを移動ボタンをクリックすることで、別のファイルに移動させることができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ブックが毎回変わることは元のご相談から読み取れましたが,少なくとも「今日の対象のブックを開く」ことだけは出来ていたからこのマクロが動いたので,出来ると思いましたが無理ですか。 では仕方ないのでお薦めしたくない手段ですが,少なくとも「リストボックスから選んで『これとこれのシートを移動しろ』と命じるその瞬間」には,データブックがアクティブになっているハズだという前提で綱渡りをしましょうか。 UserForm_Initializeは,以前に他の誰かが作ってくれたマクロ?のその通りの状態に正しく戻します。 絶対に直し間違えないように,よくよく注意してください。 Private Sub SheetIdou_Click() dim Targetbook as workbook ’(中略) If MsgBox("以下のシートを移動しますか?" & vbLf & Join(v, "/"), vbYesNo, "確認") = vbYes Then set targetbook = activeworkbook Sheets(v).Move After:=Workbooks("Book2.xlsx").Worksheets(1) targetbook.activate listbox1.clear userform_initialize End If End sub #今となっては別に構わないことですが >とりあえずアクティブなシートを対象にするのは当たり前ですよね いいえ,全然逆です。 アクティブなブック,アクティブなシートを対象にするのは,まさに今回ひっかかったように失敗しやすい「典型的なダメなマクロ」です。
その他の回答 (2)
- keithin
- ベストアンサー率66% (5278/7941)
簡易には 1.sheets(v).moveをした直後に 2.リストボックスをclearして 3.userformのinitializeをやり直す でいいと思います。 ただし一つ問題なのは,今のUserForm_Initializeのプロシジャが「作業対象のデータブックを指定せずに」アクティブブックを対象としている中途半端なマクロになっているため,今のまま動かすと上手く作動しません。 作成の基本方針: Private Sub UserForm_Initialize() ’(前略) ’★下記のままでは上手くないので,キチンと作業対象ブックを取得して指定すること For Each a In workbooks("データブック.xlsx").Sheets ListBox1.AddItem a.Name Next End Sub Private Sub SheetIdou_Click() ’(前略) If MsgBox("以下のシートを移動しますか?" & vbLf & Join(v, "/"), vbYesNo, "確認") = vbYes Then Sheets(v).Move After:=Workbooks("Book2.xlsx").Worksheets(1) listbox1.clear userform_initialize End If End sub
補足
ありがとうございます。 UserForm_Initializeプロシジャが中途半端なのには理由がありまして… このマクロブックは複数のデータブックに使うものなのですが、そのデータブックの名前が毎日変わるのです。 (格納されているフォルダも日毎に変わる) それで、他の操作をするマクロでは常にそのデータブックをアクティブにしておくコードを詳しい人に書いていただいたのですが、私があまり知識がないものでその指定方法が分からず… (書かれたコードを見ながら応用できないかと試行錯誤しましたができませんでした) よく考えたらおっしゃる通り、とりあえずアクティブなシートを対象にするのは当たり前ですよね 再取得する時にデータブックを指定することは無理でしょうか…
- mt2008
- ベストアンサー率52% (885/1701)
詳しく見ていませんが、シート移動後に Call UserForm_Initialize と、でも入れてリストを更新してやっては?
お礼
ありがとうございます。 他の問題もあって指定したファイルの一覧が再取得できません…
お礼
ありがとうございます。 ダメなマクロ…その通りです… ダメなのは分かりつつもどこをどうしたらダメじゃなくなるのかが分かっていないという… 今回のユーザーフォームは完全に自分で作ったのでUserForm_Initializeも自分で作りました。 他の(詳しい人が作った)ユーザーフォームは少し特殊な操作をするコードが書いてあるのでそのままあてはめることはできませんでした。 なのでUserForm_Initialize自体をなくして、コマンドボタンをもう一つ作ってそこでシート一覧のリストを取得するようにしました。 何度もご回答ありがとうございました。