[[20111130131935]] 『マクロブックからデータブックのシートを指定して』(ぬこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロブックからデータブックのシートを指定して別ファイルへ移動』(ぬこ)

 何度もすみません。
 検索してみたのですがどうしてもうまいやり方が分からなかったので質問です。

 あるマクロブックがあり、そのマクロブックからファイル名を指定して一つのデータブックを開いてマクロブックからデータブックにデータを入力しています。
 その際に一日15シート程のワークシートが作成されるのですが、これをマクロブックから操作してまた別のファイルに移動させることはできるでしょうか。

 マクロブックの仕様上、マクロブックで「ファイルを指定して開く」ことができるのは一つのデータブックのみになっています。

 データブックは毎日1ファイル作成されるのですが、1日で15シートほどの集計用データ用シートが作成されます。
 その中で集計処理が終わったシートを指定して別ファイル(新しいブックを作成しても最初から作っておいたものでも構いません)に
 移動させたいのです。

 シートの移動でマクロの記録をしたところ

 Sub シート移動()
 '
 ' シート移動 Macro
 '

 '
     Sheets(Array("日報_田中_111124", "日報_鈴木_111128", "日報_山田_111128")). _
         Select
     Sheets("日報_田中_111124").Activate
     Sheets(Array("日報_田中_111124", "日報_鈴木_111128", "日報_山田_111128")).Move _
         Before:=Workbooks("テスト.xlsm").Sheets(1)
 End Sub

 このようになりました(実際は「"日報_名前_日付"」のファイルがたくさんあります。)
 シート名の頭には必ず「日報_」が入っています。

 windows7、Excel2007です。

 よろしくお願いします

 このコードでも移動はできるけど、シート名を固定したくないということなんだろうね?
じゃぁ、どのようにシートを特定したいのかな?たとえば移動させたたいシートを選択して実行するなら

 Sub Sample()
    ActiveWindow.SelectedSheets.Move
 End Sub

 (ぶらっと)

 説明が下手ですみません。

 移動させたいシートが右の端にあったり真中にあったりするのでシートを選択して移動するのではなく、
 マクロブックからデータブックの中のシートを選択してまた別のファイルに移動させたいのです。

 教えていただいたコードをマクロブックの方に置いて試したらマクロブックのシートが移動されてしまいました…

 マクロブックから、データブックのシート一覧(?)を取得してその中で移動したいシートを選んで別ファイルに移動などできますでしょうか。

 >マクロブックのシートが移動されてしまいました

 提示したコードはサンプルというかヒント。
もともとの、そちらのコードは、どういう状態で実行した?
データブックを前面に出して実行したんでしょ?
だから、アップしたコードも、それを前提にしている。

 >マクロブックから、データブックのシート一覧(?)を取得してその中で移動したいシートを選んで別ファイルに移動などできますでしょうか。

 もちろん、VBAでやれば、たいていのことはできるよ。
「データブックのシート一覧(?)を取得してその中で移動したいシートを選んで」
具体的には、どこに(というか、何に)一覧を表示して、どのように選択させたいの?
あるシートの特定の列にシート名を出しておいて、それを複数選択させるとか、シートにリストボックスなんかを配置して
そこにシート名を列挙させて選ぶとか、ユーザーフォームのリストボックスを使うとか、InputBoxを表示して
シート名,シート名,シート名 といったように入力させるとか とかとか。

 そういうことを、それもあわせて考えてくれ!というんじゃなく、操作イメージとして、こうしたいと
そのようにして欲しいな。

 (ぶらっと) 

本当に拙い説明ですみません…

 こちらのイメージとしては、マクロブックにコマンドボタンを置き、それを押すと開いていてうデータブックの「シート一覧」が
 (ユーザーフォームの)リストボックスに表示され、その中から移動したいシートを選択して、ユーザーフォームの
 「移動実行」といったコマンドボタンで別ファイルに移動する、というものが理想です。
 移動先はその都度新しいファイルを作ってもいいし、あらかじめ作ったファイルに移動でもどちらでもいいです。
 完全に削除してしまうと移動したシートをもう一度参照したい時に困るから一時的にバックアップを、というだけなので…
 (移動したシートを参照するのは長くても翌日くらいまでなので、用が済んだら順次消していっても構わないので)

 最初はマクロブックのシートに直接コマンドボタンを置いて移動しようとしてみたのですが移動したいシートを直接選択できなかったので…

 このような内容で「ユーザーフォームのリストボックスに別ファイルのシート一覧を表示させる方法」と
 「選択したシートをさらに別のファイルに移動する方法」というのはどうすればいいでしょうか

(ぬこ)


 シートリストをリストボックスに取得するのは下記のコードでできました

 Private Sub UserForm_Initialize()
    Dim a As Worksheet

    ListBox1.MultiSelect = 1

    For Each a In Sheets
        ListBox1.AddItem a.Name
    Next

 End Sub

 選択したシートを別ファイルに移動するにはどうしたらよいでしょう…

(ぬこ)


 何度もすみません、移動が形ばかりできたのですが、下記のコードでは移動する度に新しいブックが作成されてしまいます。(moveメソッドの引数を省略した場合)

 Private Sub SheetIdou_Click()

    Dim i As Integer

        With ListBox1
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                If MsgBox("移動しますか?", vbYesNo, "確認") = vbYes Then
                     Sheets(i + 1).Move
                End If
            End If
        Next i
    End With

 End Sub

 それで、シートのコピーと同じようなコードを考えて下記のように書き換えると、「インデックスが有効範囲にありません」というエラーが出ます。

 Private Sub SheetIdou_Click()

    Dim i As Integer

        With ListBox1
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                If MsgBox("移動しますか?", vbYesNo, "確認") = vbYes Then
                     Sheets(i + 1).Move After:=Workbooks("Book2").Worksheets("Sheet1")
                End If
            End If
        Next i
    End With

 End Sub

 シート移動は一日に何度も行うので、その都度新しいブックが作成されるのはあまり使い勝手がよくありません。
 移動用ブックを指定できないのなら新しいブックが作成される都度、そこから更にシートをまとめるという
 作業が発生してしまうことに気がつきました。

 やはり移動用ブックを用意しておいてそこにシートを移動したいのですがどうしたらよいのでしょう

(ぬこ)


 ファイル名を指定して1シートだけ移動できるようになりましたが、同じファイルに続けて別のファイルを移動しようとしたり、
 複数シートを選択して移動しようとするとやはり「インデックスが有効範囲にありません」のエラーになります
 Private Sub SheetIdou_Click()

    Dim i As Integer

        With ListBox1
        For i = 0 To .ListCount - 1
            If .Selected(i) Then
                If MsgBox("移動しますか?", vbYesNo, "確認") = vbYes Then

                     Sheets(i + 1).Move After:=Workbooks("Book2.xlsx").Worksheets(1)

                     ActiveSheet.Name = .List(i)

                End If

            End If
        Next i
    End With

 End Sub

 Sheets(i + 1).Move After:=Workbooks("Book2.xlsx").Worksheets(1) ←ここでエラーになります

 何が悪いのでしょう…

 別の変数が必要かと思って変数を用意してFor〜文を入れ子にしてみたりしたのですがどうしても同じエラーになります。

 どなたかアドバイスお願いします

(ぬこ)


 >For i = 0 To .ListCount - 1

 これを

 For i = .ListCount - 1 To 0 Step -1

 こうしてみようか。

 (ぶらっと)

 ↑で当面のエラーはなくなると思うけど。

 ・処理前にすべてのシートが選ばれたらエラーにしておくことも必要かな。
 ・↑の手当は、後ろのシートから移動させている。結果、移動先のシートの順番が元の順番の逆になる。
 同じ順番の方がいいということなら、お手伝いするけど。

 ↑は、説明なしでコードだけなので、ちょっと不親切?
 シートが3枚ある新規ブックに以下を貼り付けて実行してみて。コードは2番目と3番目のシートを移動させようとしている。
 さて、どうなるか?

 Sub Test()
    Sheets(2).Move
    Sheets(3).Move
 End Sub

 (ぶらっと)

 上で回答した構成とは異なるけど、以下で移動先でのシート順がもとの順序と同じになる。
ご参考まで。

 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
        ThisWorkbook.Sheets(v).Move After:=Workbooks("Book2").Worksheets("Sheet1")
    End If

 End Sub

 (ぶらっと)

ありがとうございます!

 帰宅したので自宅のExcel2003で

 Sub Test()
    Sheets(2).Move
    Sheets(3).Move
 End Sub

 これを実行したところ

 Sheets(3).Move

 で「インデックスが有効範囲内にありません」のエラーが出ました。

 他のコードは明日職場で試してみます。

 ちなみにシート移動はデータの登録が終わったシートから移動させるようになっています。
 基本的に前から(左の方から)の移動になると思います。
 並び順も移動した順番に(左から順に)なると助かります。

(ぬこ)


 >で「インデックスが有効範囲内にありません」のエラーが出ました。

 その理由はわかったかな?

 (ぶらっと)

 インデックスが有効範囲内にありません のエラーをもう一度検索してみました。
 対象のシートが存在しない、実際よりも多くのシートを指定している…などの記事がありました。

 Sub Test()
    Sheets(2).Move
    Sheets(3).Move
 End Sub

 これをステップ実行してみたところ、左から2番目のSheet2は移動され、Sheets(3).Move でエラー…
 「存在しない3番目のシートを指定して移動させようとしているからエラーになった」ということでしょうか。

 だとしたら私の書いたコードでエラーになったのはListCount - 1 で変数を一つずつ前にずらしているのに
 Sheets(i + 1).Move で矛盾したシート番号を指定しているということになるのでしょうか(違ってたらすみません)

 でも何となくイメージが分かってきたような気がします
 ありがとうございます

(ぬこ)


 最初にシートが3枚あるので、各シートのインデックスは左から1,2,3。
で、Sheets(2).Move で真ん中のシートがなくなって2枚になるね。
この時点で2枚のシートのインデックスは、左から1,2。
つまりインデックスが3というシートはどこにもないということ。だからエラー。

 追記)だから、アップされたそちらのコードでも
Sheets(i + 1).Move After:=Workbooks("Book2.xlsx").Worksheets(1)
これをシートインデックス指定じゃなく、シート名指定で実行すれば、OKなんだよ。
Sheets(.List(i)).Move After:=Workbooks("Book2.xlsx").Worksheets(1)

 (ぶらっと)

 なるほど、ありがとうございます。

 段々分かってきました…が、やはりエラーが出ます。
 私が書いたコードを2か所修正して

  Private Sub SheetIdou_Click()

    Dim i As Integer

        With ListBox1
        For i = .ListCount - 1 To 0 Step -1

            If .Selected(i) Then
                If MsgBox("移動しますか?", vbYesNo, "確認") = vbYes Then

                     Sheets(.List(i)).Move After:=Workbooks("Book2.xlsx").Worksheets(1)

                     ActiveSheet.Name = .List(i)

                End If

            End If
        Next i
    End With

 End Sub

  これでまた「インデックスが有効範囲にありません」のエラー(場所は同じ場所)

 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
        ThisWorkbook.Sheets(v).Move After:=Workbooks("Book2").Worksheets("Sheet1")
    End If

 End Sub

 次にこの中の

        ThisWorkbook.Sheets(v).Move After:=Workbooks("Book2").Worksheets("Sheet1")

 で「インデックスが〜」なるのでここを

 Sheets(.List(i)).Move After:=Workbooks("Book2.xlsx").Worksheets(1)

 にしてみたところ、.List(i)「参照が不正または不完全です」のコンパイルエラーが出ました。
 検索したら「ピリオドを外せ」ということが書いてあったので List(i) にしてみたところ
 「SUBまたはFUNCTIONがありません」
 のエラーが出ます。

 せっかくわかったと思ったのに、どうして何でしょう…

(ぬこ)


 >Sheets(.List(i)).Move After:=Workbooks("Book2.xlsx").Worksheets(1)
 >これでまた「インデックスが有効範囲にありません」のエラー(場所は同じ場所)

 この「インデックス・・・」は、もしかしたら("Book2.xlsx")からでているんじゃない?
処理しようとした時、確実に、"Book2.xlsx という名前の 拡張子付のブックが存在していた?

 それと For i = .ListCount - 1 To 0 Step -1
これは、インデックスで処理するなら後ろからということで提言したけど、シート名で処理するなら
もともとの For i = 0 To .ListCount - 1 で、いいんだよ。

 >Sheets(.List(i)).Move After:=Workbooks("Book2.xlsx").Worksheets(1)
 >にしてみたところ、.List(i)「参照が不正または不完全です」のコンパイルエラーが出ました。

 .○○○ と記述可能な場所は、 With と End With に囲まれた場所。
 このコードの3行前で End With で、オブジェクト修飾が終了しているので .○○○ という記述は不可。
 この場所で書くなら
Sheets(ListBox1.List(i)).Move After:=Workbooks("Book2.xlsx").Worksheets(1)

 さらに追記)↑ 文法的にはこうだけど、ListBox1.List(i)) この変数 i は、その上のループ内でセットされている値。
ループを抜けたここでは、この i は 使えないよ。

 (ぶらっと)


 おそらくインデックスエラーは"Book2.xlsx"からきているとして
私がアップしたコードをベースに、移動先ブックを指定せず、移動すべきシートのみの新規ブックにすればいかが?

    If MsgBox("以下のシートを移動しますか?" & vbLf & Join(v, "/"), vbYesNo, "確認") = vbYes Then
        ThisWorkbook.Sheets(v).Move
    End If

 (ぶらっと)

 Book2.xlsx は確かに存在して、同時に開いていました。
 変な空白などが入らないようにファイル名をコピーしてコードに記述していました。

 >ループを抜けたここでは、この i は 使えないよ。
 そういえばそうですね…
 シート名を完全に固定なら他の書き方ができますがリストボックスで選ばれたものを…ということは、もう一つ
 変数を用意してIF文を入れればいい、とか安直すぎますか…

 >移動すべきシートのみの新規ブックにすればいかが

 これは上の方で一度やってみたのですが、移動する度に新しいブックが作成されるので使い勝手がよくないです。
 一日に何度も移動処理が発生するのでブックがいくつもに分かれてしまうと大変なので…
 (その都度ブックをまとめればいいですが結局手間が余計にかかってしまうので)

 何とか同じファイルに移動したいのですがダメでしょうか

(ぬこ)


 >何とか同じファイルに移動したいのですがダメでしょうか

 う〜ん・・・・こちらでアップしたのは
Sheets(v).Move After:=Workbooks("Book2").Worksheets(1)
これを
Sheets(.List(i)).Move After:=Workbooks("Book2.xlsx").Worksheets(1)
こうしたということだね。
つまり v を .List(i) 、("Book2") を ("Book2.xlsx")

 この時に存在する、移動先のブック名が "Book2.xlsx" だということだから、("Book2") を ("Book2.xlsx") に変更しなければいけないけど
v を .List(i) は必要ないよ。(というか、こうしちゃだめ)
エラーはブック名がないというところからきているので。

 そうじゃなく
Sheets(v).Move After:=Workbooks("Book2.xlsx").Worksheets(1)
これで試してみて。

 (ぶらっと)


 やっぱり2回目以降の移動で

 Sheets(v).Move After:=Workbooks("Book2.xlsx").Worksheets(1)

 のところに「インデックスが〜」が出ます…

 もしかして Worksheets(1) これがダメなんでしょうか。
 リストボックスに表示されたのを選択して「移動」のコマンドボタンをクリック→移動なんですが、
 移動した時に Worksheets(1) にあたるものがなくなってるとか?

 実際のシートには全部で25ほどのシートがあってその中から後ろの15シートほどを移動させたいので、今
 1つずつ選択して移動または2つ以上選択して移動を試してます。
 しかし1つだけの移動は成功するのに2つ目以降または複数選択して移動だとエラーになるんです。

 Worksheets(1) の (1)にも変数を使わないとだめですか?

(ぬこ)


 引き続き試していたところ、

 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

 このコードで、シートを移動した後一旦ユーザーフォームを閉じ、再度ユーザーフォームを開いて別のシートを
 移動するとエラーは出ませんでした。
 つまりフォームの中にあるメモリ(?)を開放しなければならないのかと思いましたがその記述が分かりません
 リストボックスを再読み込みして移動したシートを除いたシート一覧を再表示させるのか…
 とまでは考え付いたんですがその先がわからなくて…

 Googleで色々検索してみましたがそれでも分かりません

 ユーザーフォームを閉じずに、次のシートを移動させる方法を教えてください…

(ぬこ)


    If MsgBox("以下のシートを移動しますか?" & vbLf & Join(v, "/"), vbYesNo, "確認") = vbYes Then
        Sheets(v).Move After:=Workbooks("Book2.xlsx").Worksheets(1)
         ListBox1.Clear
         Call UserForm_Initialize

 このようにしてみたらBook2のシート一覧が取得されてしまいました。

 Private Sub UserForm_Initialize()
    Dim a As Worksheet

    ListBox1.MultiSelect = 2

    For Each a In Sheets
        ListBox1.AddItem a.Name
    Next

 End Sub

 ここでちゃんとデータブックを指定しなければならないのでしょうが、ファイル名もそれぞれ違うので直接データブックの名前を指定することができません
 (ファイル名は「業務日報1201.xlsm」のように末尾が変わります)

 試しに For Each a In Workbooks("業務日報*.xlsm").Sheets としてみましたが「インデックスが〜」のエラーが出続けて挫折しました…

 もう、一度移動したらひたすら画面を閉じて再度開くしかないのでしょうか

(ぬこ)


 おちついて、操作を確認して。
1.ユーザーフォームを表示する。
2.ユーザーフォームのInitializeルーティンでシート名がリストボックスの登録される。
 (どのブックのシートと限定していないところが、ネックだけどね)
3.移動させたいシートを選んでコマンドボタン。
4.この段階で、選んだシートは物理的にマクロブックからデータブック(Book2.xlsx)に移動される。

 で、この後は?
・もし、このまま、またボタンをおすと、移動済みのシートが選ばれているわけで、それは、マクロブック側にないので
 「インデックス・・・」でエラーになる。
・あるいは、また、リストボックスを選択し直した?
 注意しなきゃいけないのは、このときのリストボックスは、移動前の状態で、移動済みのシートもある。
 かりに、それを選んでボタンをおすと、同様に「インデックス・・・」でエラーになる。

 >データブックを指定しなければならないのでしょうが、ファイル名もそれぞれ違うので直接データブックの名前を指定することができません

 ??
 ということは、そちらのコードに Book2.xlsx とあったのは間違い?
 それとも、マクロブックのこと? どうもよくわからないなぁ。

 登場するブックを整理して教えて。
・移動先のブック。 これは決まった名前?それとも?
・移動元のブック。これはその時々で変わる?
・で、このマクロが書かれているブック。これは移動元のブックと同じ?

 で、処理するときにそれらのブック、特に移動先ブックは、どうやって呼び出している?

 処理後、リストボックスを再設定する方法はシンプルなので、ここで質問したことをクリアにしてもらえれば
あわせて、対応方法をアップする。

 (ぶらっと)


 すみません、上からせっつかれて焦ってました

 >あるいは、また、リストボックスを選択し直した
 >かりに、それを選んでボタンをおすと、同様に「インデックス・・・」でエラーになる。

 一応移動してないシートを選んでボタンを押したんですがエラーになります。

 で、ブックの件はややこしくなってすみません

 ・マクロブック
 ・データブック(業務日報XXX.xlsm)
 ・Book2.xlsx(移動したシートを格納するブック。名前は固定。用が済んだシートは順次削除してファイル名は変えないまま使う予定)

 の3つのブックがあります。

 移動元のブックは毎日違ったブックです。
 レイアウトはほぼ同じですが、ファイル名と格納されるフォルダ名が違います。

 マクロブックはマクロ専用なのでこのブックから日々のデータブックの集計などの操作をしています。

 移動先ブックは、ユーザーフォームでフォルダとファイル名を指定して開くコマンドボタンを作り、それで呼び出していましたが
 何故かそこから呼び出すと「インデックスが〜」のエラーになります。
 (どんなコードを書いたのかは今自宅なので覚えていませんが、ここの過去ログを検索してファイルを開くメソッドで開くようにしていました)
 同じブックを普通に手作業で開いて移動処理をするとエラーになりません。
 この違いもよく分からないのですが…
 ちなみにファイルを呼び出すボタンはシート一覧を表示するリストボックスや移動するためのコマンドボタンを置いたユーザーフォームの中に「ファイルを開く」コマンドボタンを置いていました。

 なんだか話をややこしくしてすみません。よろしくお願いします

(ぬこ)


 まず、マクロブックも含めて複数のブックがエクセル上にある状態でマクロを実行する場合は
「扱うすべてのシート」が、どのブックのシートかを明示的にブック修飾をすべき。
また「あつかうべきセル」が、どのシートのセルなのか、シート修飾すべき。これが原則。
これを、おろそかにすると、操作の流れの中でマクロが想定していないブック、あるいはシートが
操作者によって、あるいは、コードの処理によってアクティブになり、障害の原因となる。

 とりあえず、ユーザーフォームのコード案。BookOpen というコマンドボタンも配置。
なお、InitializeルーティンはやめにしてMultiSelectプロパティは、デザインでプロパティにあらかじめ
セットしておいた方がいいのでは?

 Option Explicit

 Dim wb As Workbook

 Private Sub UserForm_Initialize()

    ListBox1.MultiSelect = 1  '(または 2)

 End Sub

 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Set wb = Nothing
 End Sub

 Private Sub BookOpen_Click()
    Dim fName As String
    fName = Application.GetOpenFilename("移動元ブック,*.xls*", , "移動元のブックを選んでください ")
    If fName = "False" Then Exit Sub
    Set wb = Workbooks.Open(fName)
    Call ListSet
 End Sub

 Private Sub SheetIdou_Click()

    Dim i As Integer
    Dim v() As String
    Dim k As Integer

    If wb Is Nothing Then
        MsgBox "移動元のブックが選ばれていません!!"
        Exit Sub
    End If

    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
        wb.Sheets(v).Move After:=Workbooks("Book2.xlsx").Worksheets("Sheet1")
    End If

    Call ListSet

 End Sub

 Private Sub ListSet()
    Dim a As Worksheet
    With ListBox1
        .Clear
        For Each a In wb.Sheets
            .AddItem a.Name
        Next
    End With
 End Sub

 (ぶらっと)

 ありがとうございます。

 MultiSelectプロパティはおっしゃるようにプロパティで設定しました。
 そしてシートの移動もうまくいきました!

 一つだけお聞きしたいのですが、対象のデータブック(移動元のブック)を既に開いていた状態でも「BookOpen」で開いてから処理、
 ということになるのですよね。

 それはそれで大丈夫なのですがこれからこのマクロブックの説明書を作らなければならないので、説明するのに念のためお聞きしたくて…

 本当に助かりました!

(ぬこ)


 >対象のデータブック(移動元のブック)を既に開いていた状態でも「BookOpen」で開いてから処理、
 ということになるのですよね。

 うん、提示したコードはそうなっている。
 もし、開いていれば、開くボタンをおさなくても、リストボックスから選んで処理できるはず・・・と考えるよねぇ。
 ただ、マクロから見ると、そのエクセル空間に、複数ブックが開かれていると、どのブックが今回対象かわからない。
 もう1つ、実行して認識いただいたと思うけど、フォームを開いた時点ではリストボックスがからっぽ。
 そりゃぁ、そうだよね、シートを表示すべきデータブックが、まだ読み込まれていないわけなので。
 リストボックスは、ブックが開かれた時に、そのブックのシートをセットしている。
(もちろん、移動後にもリフレッシュしてるけど)

 こういうことならできるけど。
・まず最初は、絶対にマクロブックを開く。
・次に、呼び出しボタンではなく手動でデータブックを開く。
・で、そのブックを対象にシート移動を行う。
・もちろん、呼び出しボタンでの操作も可能。

 (ぶらっと)


 >・次に、呼び出しボタンではなく手動でデータブックを開く。

 業務上で操作する場合、常にデータブックはマクロブックと同時に開かれているので、改めて手動で…の方が
 使う人が混乱するかもしれません…
 むしろ今のままの方が「こういうもの」と納得してもらえるかも…

 今の手順は「マクロブックを開く」→「マクロブックからデータブックを呼び出す」→「集計操作」
 で、これが終わった後シートの移動を行います。

 現在開いているブックの中でデータブックがどのブックか選択する、というのを昨日探していたのですが
 コードの中で指定したブックをアクティブにする方法、ぐらいしか分からなかったのでこれはあきらめました。

 今の状態で大丈夫です!

(ぬこ)


 あれ?朝一番に試した時は何もエラーが出なかったのに、今試したら「移動元のブックを開く」時に既にデータブックを開いていると
 「二重に開くことはできません。元のデータは破棄されます」
 というようなエラーメッセージが出ます。

 朝からコードはいじってないんですが…

 一旦データブックを閉じるか、こまめに上書き保存する以外の回避方法ってないですよね…

質問ばかりですみません

(ぬこ)


 マクロであれ、手動であれすでに開かれているブックをまた開こうとすればエラーになる。
ただ、人間のやることなので勘違いして同じものを開く場合もあるかもね。

 以下にする?

 Private Sub BookOpen_Click()
    Dim fName As String
    Dim wk As Variant
    Dim bName As String
    fName = Application.GetOpenFilename("移動元ブック,*.xls*", , "移動元のブックを選んでください ")
    If fName = "False" Then Exit Sub
    wk = Split(fName, "\")
    bName = wk(UBound(wk))
    On Error Resume Next
    wk = ""
    wk = Workbooks(bName).Sheets(1).Name
    On Error GoTo 0
    If Len(wk) > 0 Then
        If MsgBox(bName & "はすでに開かれています。これを移動元ブックにしますか?", vbYesNo) = vbNo _
                                                                                        Then Exit Sub
        Set wb = Workbooks(bName)
    Else
        Set wb = Workbooks.Open(fName)
    End If
    Call ListSet
 End Sub

 (ぶらっと)

ありがとうございます!

これで大丈夫です!

(ぬこ)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.