Excel2007です。
データを集計するためのデータブックがあり、その中に30ほどのシートがあります。
このデータ集計を別に作成したマクロブックから操作しています。
データブックは毎日その日ごとのものが作成されます。
30ほどのシートの中で、その日の集計が終わったシートを選択して、別のシート移動用ファイルに移動させるようにしたいと思い、ユーザーフォームを作成しました。
ユーザーフォームにリストボックスを置き、そこにデータブックにあるシートの一覧が表示されます。
その中で選択したシートを「移動」というコマンドボタンで指定したファイル(この場合はBool2.xlsx)に移動させようとしています。
下記のコードを書いたところ、ユーザーフォームを開いて一度移動の操作でBook2に移動するまではできたのですが、更に別のシートを移動しようとすると
「インデックスが有効範囲にありません」
のエラーが出ます。
ユーザーフォームを一旦閉じて再度開くとエラーなく移動処理できます。
また、移動処理後にリストを再取得する方法がわからなくて、既に移動したシートもリストボックスに表示されたままになります。
ユーザーフォームを閉じることなく続けて移動処理をしたいのと、移動させたものをリストボックスから削除するにはどうしたらよいでしょうか。
’リストボックスにシート一覧を表示
Private Sub UserForm_Initialize()
Dim a As Worksheet
ListBox1.MultiSelect = 2
For Each a In Sheets
ListBox1.AddItem a.Name
Next
End Sub
’Book2にシートを移動
Private Sub SheetIdou_Click()
Dim i As Integer
Dim v() As String
Dim k As Integer
With ListBox1
ReDim v(1 To .ListCount)
For i = 0 To .ListCount - 1
If .Selected(i) Then
k = k + 1
v(k) = .List(i)
End If
Next i
If k = .ListCount Then
MsgBox "すべてのシートを移動することはできません"
Exit Sub
End If
End With
ReDim Preserve v(1 To k)
If MsgBox("以下のシートを移動しますか?" & vbLf & Join(v, "/"), vbYesNo, "確認") = vbYes Then
Sheets(v).Move After:=Workbooks("Book2.xlsx").Worksheets(1)
End If
End Sub
よろしくお願いいたします<(__)>
No.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
#今となっては別に構わないことですが
>とりあえずアクティブなシートを対象にするのは当たり前ですよね
いいえ,全然逆です。
アクティブなブック,アクティブなシートを対象にするのは,まさに今回ひっかかったように失敗しやすい「典型的なダメなマクロ」です。
ありがとうございます。
ダメなマクロ…その通りです…
ダメなのは分かりつつもどこをどうしたらダメじゃなくなるのかが分かっていないという…
今回のユーザーフォームは完全に自分で作ったのでUserForm_Initializeも自分で作りました。
他の(詳しい人が作った)ユーザーフォームは少し特殊な操作をするコードが書いてあるのでそのままあてはめることはできませんでした。
なのでUserForm_Initialize自体をなくして、コマンドボタンをもう一つ作ってそこでシート一覧のリストを取得するようにしました。
何度もご回答ありがとうございました。
No.2
- 回答日時:
簡易には
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プロシジャが中途半端なのには理由がありまして…
このマクロブックは複数のデータブックに使うものなのですが、そのデータブックの名前が毎日変わるのです。
(格納されているフォルダも日毎に変わる)
それで、他の操作をするマクロでは常にそのデータブックをアクティブにしておくコードを詳しい人に書いていただいたのですが、私があまり知識がないものでその指定方法が分からず…
(書かれたコードを見ながら応用できないかと試行錯誤しましたができませんでした)
よく考えたらおっしゃる通り、とりあえずアクティブなシートを対象にするのは当たり前ですよね
再取得する時にデータブックを指定することは無理でしょうか…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【ExcelVBA】sheet作成時にマク...
-
VBA シートの切り替えができな...
-
エクセル/マクロ Exit Subが実...
-
マクロ実行ボタンがコピー出来ない
-
VBAでシートコピー後、シート名...
-
不明なコマンドです("FROM")。...
-
オペランドが足りませんとコメ...
-
VBAで横データを縦データに変換...
-
Excel2010でふりがなが漢字にな...
-
WordPressをインストールしてい...
-
JWWでDXFファイルを開きたい
-
Access2010 「演算子がありませ...
-
貼り付けをマクロで禁止させたい。
-
ザウルスのLinuxでSEDのスクリ...
-
OBSが起動できません
-
(int)キャストとintvalの違い
-
エクセル DBから該当データを...
-
GhostからWin XPがインストール...
-
エクセルVBAで参照設定というフ...
-
『PHP』 MAMPで$_SERVER["REMOT...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【ExcelVBA】sheet作成時にマク...
-
エクセル/マクロ Exit Subが実...
-
VBA シートの切り替えができな...
-
エクセル 「実行時エラー"13":...
-
マクロ実行ボタンがコピー出来ない
-
VBAでシートコピー後、シート名...
-
エクセル 複数シートのフィル...
-
シートの表示が消えて整列をし...
-
フェイス・シートについて教え...
-
エクセルのワークシートの並べ替え
-
Excelユーザーフォームでシート...
-
Excel2000でシート上にボタンを...
-
【エクセル】複数の文字を同時...
-
アクセス97での罫線について
-
エクセルのシートを自動でコピー
-
ワークシート上に配置したコマ...
-
不明なコマンドです("FROM")。...
-
Access2010 「演算子がありませ...
-
WordPressをインストールしてい...
-
オペランドが足りませんとコメ...
おすすめ情報