Excelユーザーフォームでシートの移動方法

このQ&Aのポイント
  • Excelユーザーフォームを使用してデータブック内のシートを移動させる方法について解説します。
  • ユーザーフォームにリストボックスを配置し、データブック内のシート一覧を表示します。
  • 選択したシートを移動ボタンをクリックすることで、別のファイルに移動させることができます。
回答を見る
  • ベストアンサー

Excelユーザーフォームでシートの移動

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 よろしくお願いいたします<(__)>

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答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 #今となっては別に構わないことですが >とりあえずアクティブなシートを対象にするのは当たり前ですよね いいえ,全然逆です。 アクティブなブック,アクティブなシートを対象にするのは,まさに今回ひっかかったように失敗しやすい「典型的なダメなマクロ」です。

narnia_aslan
質問者

お礼

ありがとうございます。 ダメなマクロ…その通りです… ダメなのは分かりつつもどこをどうしたらダメじゃなくなるのかが分かっていないという… 今回のユーザーフォームは完全に自分で作ったのでUserForm_Initializeも自分で作りました。 他の(詳しい人が作った)ユーザーフォームは少し特殊な操作をするコードが書いてあるのでそのままあてはめることはできませんでした。 なのでUserForm_Initialize自体をなくして、コマンドボタンをもう一つ作ってそこでシート一覧のリストを取得するようにしました。 何度もご回答ありがとうございました。

その他の回答 (2)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答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

narnia_aslan
質問者

補足

ありがとうございます。 UserForm_Initializeプロシジャが中途半端なのには理由がありまして… このマクロブックは複数のデータブックに使うものなのですが、そのデータブックの名前が毎日変わるのです。 (格納されているフォルダも日毎に変わる) それで、他の操作をするマクロでは常にそのデータブックをアクティブにしておくコードを詳しい人に書いていただいたのですが、私があまり知識がないものでその指定方法が分からず… (書かれたコードを見ながら応用できないかと試行錯誤しましたができませんでした) よく考えたらおっしゃる通り、とりあえずアクティブなシートを対象にするのは当たり前ですよね 再取得する時にデータブックを指定することは無理でしょうか…

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

詳しく見ていませんが、シート移動後に Call UserForm_Initialize と、でも入れてリストを更新してやっては?

narnia_aslan
質問者

お礼

ありがとうございます。 他の問題もあって指定したファイルの一覧が再取得できません…

関連するQ&A

  • VBA ユーザーフォーム

    VBA初心者です。以下の様なソースを見つけました。この場合は、文字を検索するとD1 にその該当番号が表示されます。 ※A列には番号、B列には文字列 そうではなく、そのクリックした行のA列にセルが移動し、ユーザーフォームが閉じられる様にできますでしょうか? よろしくお願い致します。 Private Sub ListBox1_Click() Sheets("Sheet1").Range("D1").Value = ListBox1.Value End Sub Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) Dim v() As Variant Dim c As Range Dim k As Long ListBox1.Clear With Sheets("Sheet1") With .Range("A1", .Range("A" & .Rows.Count).End(xlUp)) ReDim v(1 To 2, 1 To .Rows.Count) For Each c In .Cells If c.Offset(, 1).Value Like TextBox1.Value & "*" Then k = k + 1 v(1, k) = c.Value v(2, k) = c.Offset(, 1).Value End If Next If k = 0 Then MsgBox "指定の値は存在しません" Else ReDim Preserve v(1 To 2, 1 To k) ListBox1.List = WorksheetFunction.Transpose(v) End If End With End With End Sub

  • EXCELのユーザーフォームのリストについて

    WinXP(sp3) EXCEL2003 いつも本当にお世話になっております。 また、1つ教えていただきたいのですが、ユーザーフォームのリストボックよりデータ取得で、必ずクリック(選択) しなければ、エラーになると思うのですが、ここを選ばない場合は、1行目選択としたいのですが、 どうもうまくいきません。 どなたかご教授いただけないでしょうか? いかにコードを転記いたします。 Private Sub CommandButton1_Click() gy = UserForm.ListBox1.ListIndex If gy = -1 Then MsgBox "1行目選択" Worksheets("データ入力シート").Cells(1, 2).Value = ListBox1.List(2, 35)←ここで実行時エラー381 Else                                          Listプロパティの値を取得で                                            きません。プロパティのインデッ                                             クスの配列が無効ですと                                              なります。   Worksheets("データ入力シート").Cells(1, 2).Value = ListBox1.List(ListBox1.ListIndex, 35) End If Unload Me End Sub

  • ユーザーフォーム

    こんばんは。 またまた教えていただきたく思います。ユーザーフォームにリスト ボックスをセットし、シート(商品一覧)のa2からy10までを表示 させたいのですがcまでしか表示できません。宜しくお願いします。 Sub リスト読み込み() Dim myDCount As Long, myDRange As String Worksheets("商品一覧").Activate myDCount = Worksheets("商品一覧").Range("b1").CurrentRegion.Rows.Count + 1 myDRange = "a2:y" & myDCount ListBox1.ColumnCount = 3 ListBox1.ColumnWidths = "60;60;60" ListBox1.RowSource = myDRange End Sub

  • ユーザーフォームを表示されないようにしたい

    Vista excel2007 でマクロ作成中の超初心者です。 A、B、Cのブックがあります。Bブックのみマクロをワークシートに貼り付けています。 1)Aブック(マクロ記録用)の中にある、Aコマンドボタンを押すと  BブックのBシートにジャンプします。ジャンプと同時に、Bユーザーフォームを 表示しています。 2)そしてBシートには、フォームコントロールを貼り付けており、ここをクリックするとCブックCシートに飛びます。 3)ところが、CシートにはBユーザーフォームが残ったままです。このフォームを  表示されないようにしたいのです。 4)Bシートのフォームコントロールには、次のコード記述をしてあります。       Sub Cブック Cシートへ() Dim wb As Workbook Dim ws As Worksheet Dim sh As Worksheet Dim i As Long ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path On Error Resume Next '開いて作業中の場合。 Set wb = Workbooks("CCC.xls") On Error GoTo 0 If wb Is Nothing Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\CCC.xls") End If Worksheets(1).Select End Sub どうかよろしくお願いします。 

  • エクセルユーザーフォームで困ってます。

    エクセル初心者です。 自分のユーザーフォーム(住所、商品登録)を作りたくて大変困ってます。 下記は、ネットなどをみて貼り付けたのですが、上手くいきません。 まずTOPページを作り、ユーザーフォームを呼び出すボタンを作り、クリックすると フォームが出るようにしてあります。 そこに、自分の入力したいものをユーザーフォームにテキストでつくり、シート9に 登録ボタンを作りクリックしたら、シートに反映させたいと思ってます。 登録ボタンを押したら、入力画面はクリアにしたいです。 他にいろいろやりたい事もあるのですが、入力した順番に001・002・003と顧客番号をつけたり 検索ボタンを作って、名前や、顧客番号を入れると情報を呼び出したり、請求書用のプリントシートや、封筒シートに簡単に反映できればと思っています。 しかし、まだまだそこまではいかず、最初でつまずいてます。 現状は、フォームを呼び出すときに実行時エラーがでます。 どうしても、自分の使い勝手のいいものを作りたいので どうか、助けてください。大変まいってます。 長文になりますが、どうかよろしくお願いします。 下記の入力中のものをみていただけて、いろいろ意見をいただけるとありがたいです。 Sub FormShow() UserForm1.Show End Sub 'Sheet9へ書き込む Private Sub 登録_Click() Dim i As Integer With Worksheets(9) 'テキストボックスの値を書き出し For i = 1 To 80 .Range("B" & i) = UserForm1.Controls("TextBox" & i).Text Next End With End Sub 'Formを呼び出したとき、Sheet9から読み込む Private Sub UserForm_Initialize() Dim i As Integer With Worksheets(9) 'テキストボックスの値を読み込み For i = 1 To 80 UserForm1.Controls("TextBox" & i).Text = .Range("B" & i) Next End With End Sub '終了ボタン Private Sub CommandButton2_Click() Unload Me End Sub

  • エクセルVBA ユーザーフォームのリストボックス

    エクセルVBAのユーザーフォームのリストボックスについて教えてください。 現在、以下のようにコードがされています。 Private Sub UserForm_Initialize() With UserForm.ListBox1 .AddItem "ABC" .AddItem "DEF" .AddItem "GHI" .ListIndex = 0 End With End Sub Private Sub ListBox1_Click() With ListBox2 .Clear Select Case UserForm.ListBox1.List(ListBox1.ListIndex) Case "ABC" .AddItem "123" .AddItem "456" .AddItem "789" Case "DEF" .AddItem "456" .AddItem "789" Case "GHI" .AddItem "789" End Select .ListIndex = 0 End With End Sub それで、ユーザーフォームを起動した時点で、ListBox1には"ABC"、ListBox2には"789"を選択し、青く色がついている状態にすることは可能でしょうか。 よろしくお願いします。

  • ListBox内の並び替えで実行エラー

    OSはXP、 Excelは2003を使用しています。 ユーザーフォーム内のListBox内で、コマンドボタンをクリックして行を上や下に並び替えたく、 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1041407835 を参考にして、下記の通りに組んだのですが、 下に並び替えるCommandButton2を実行時や、 上に並び替えるCommandButton1を「2回目」に実行時に 「実行時エラー -2147417848(80010108)  オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。」 となってしまいます。 Private Sub CommandButton1_Click() Dim i As Variant Dim j As Integer Dim k As Integer Dim myBuf1 As Variant Dim myBuf2 As Variant ' 選択されている項目を1つ上げる。 i = Me.ListBox1.ListIndex If i > 0 Then For j = 1 To 7 myBuf1 = Me.ListBox1.List(i - 1, j) Me.ListBox1.List(i - 1, j) = Me.ListBox1.List(i, j) Me.ListBox1.List(i, j) = myBuf1 Me.ListBox1.Selected(i - 1) = True For k = 0 To 6 myBuf2 = Me.ListBox2.List(i - 1, k) Me.ListBox2.List(i - 1, k) = Me.ListBox2.List(i, k) Me.ListBox2.List(i, k) = myBuf2 Me.ListBox2.Selected(i - 1) = True Next k Next j End If End Sub Private Sub CommandButton2_Click() Dim i As Variant Dim j As Integer Dim k As Integer Dim myBuf1 As Variant Dim myBuf2 As Variant ' 選択されている項目を1つ下げる。 i = Me.ListBox1.ListIndex If i < Me.ListBox1.ListCount - 1 Then For j = 1 To 7 myBuf1 = Me.ListBox1.List(i + 1, j) Me.ListBox1.List(i + 1, j) = Me.ListBox1.List(i, j) Me.ListBox1.List(i, j) = myBuf1 Me.ListBox1.Selected(i + 1) = True For k = 0 To 6 myBuf2 = Me.ListBox2.List(i + 1, k) Me.ListBox2.List(i + 1, k) = Me.ListBox2.List(i, k) Me.ListBox2.List(i, k) = myBuf2 Me.ListBox2.Selected(i + 1) = True Next k Next j End If End Sub 説明不足や上記の記述にとんちんかんな間違いがありましたら、ごめんなさい。 どなたか解決方法を教えて頂けますようお願い致します。

  • ユーザーフォームがシートの裏に隠れてしまう

    ブックを開いた時に、表示されるユーザーフォームが作業シートの裏に隠れて、作業が思うようにできません。なんとかシートの前面に表示させたいです。EXCEL365solo,WINDOWS10使用の超初心者です。ご指導よろしくお願いします。 Private Sub CommandButton96_Click() Dim OpenFileName As String Unload Me ChDir Application.ThisWorkbook.Path & "\2年集計" OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xlsm") G給与入力.Show vbModeless If OpenFileName <> "False" Then Workbooks.Open OpenFileName Else MsgBox "キャンセルされました" End If End Sub

  • エクセル ユーザーフォームでVLOOK

    ユーザーフォームのテキストボックスで、ご教示お願いいたします。 現在、以下のようなコードこちらで教えていただきセルに入力をしております。 テキストボックス5に値を入れ、 listのシートから該当する文字をテキストボックス6に表示させたいと思っております。 ■現在のコード '// Private Sub CommandButton1_Click() Dim LastRow As Long 'ここはキャメル形式やパスカル形式にします/大文字は定数です。 Dim i As Long '/テキストボックスに値があるか調べる For i = 1 To 7 Next i '/セルに書き込み With Worksheets("Sheet1") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To 7 .Cells(LastRow, i).Value = Me.Controls("TextBox" & i).Value Next End With '/TextBox1-7をクリア If MsgBox("テキストボックスを空にしてよろしいですか?", vbQuestion + vbYesNo) = vbYes Then For i = 1 To 7 Me.Controls("TextBox" & i).Value = "" Next i End If 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub ■付け足したいコード Private Sub textbox5_change() Dim temp, x temp = Me.textBox5.Value If IsNumeric(temp) Then temp = Val(temp) x = Application.VLookUp(temp, Sheets("list").Range("a1:b20"), 2, False) If Not IsError(x) Then Me.TextBox6.Value = x Else MsgBox Me.TextBox5.Value & " はリストにありません" End If End Sub 【質問内容】 付け足したいコードは上記の通りですが、どのように付け足せばいいのかが分からず、 困っております。 度々で申し訳ありませんが、テキストボックス5の値を見て、 テキストボックス6に表示させるやり方をご教示お願いいたします。

  • エクセル ユーザーフォームの位置

    ブックを閉じた時のユーザーフォームの位置を、次回ブックを開いた時に同じ位置で表示したいです。 以下のコードでユーザーフォームは閉じれないようになっています。 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then Cancel = True End If End Sub この場合でも、前回と同じ位置でのユーザーフォームの表示は可能でしょうか? 可能な場合はどのようにしたらいいでしょうか?

専門家に質問してみよう