[[20120808132347]] 『複数シートのあるファイルから、複数シートのある』(あまなつ) ページの最後に飛ぶ

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

 

『複数シートのあるファイルから、複数シートのある別のファイルへ転記するマクロ』(あまなつ)

 WindowsXP Microsoft Office Excel 2007環境で使用
 (Mac OS X Excel for Mac 2011 Version 14.2.3で作成)

 校内の過去ログを検索いたしましたが、似た事例からマクロを作成してみたものの、うまくいきませんでしたので、お力をお借りしたいと思い、投稿いたしました。よろしくお願いいたします。(お力をお借りしたいことは、2点ございます。)

1点目
 「時数Bug_Fixed版」というフォルダ内に、「時数調査01.xlsm」と「時数調査02.xlsm」という2つのファイルがあります。
 「時数調査01.xlsm」の中にあるシートの一部のセルの関数式に誤りがあることが分かり、修正して「時数調査02.xlsm」を作成しました。
 そこで、「時数調査01.xlsm」の各シートに入力された一部のデータを、マクロを組んで、そのまま「時数調査02.xlsm」のファイル内の各シートに転記したいと考えています。
 なお、「時数調査01.xlsm」と「時数調査02.xlsm」のシートの構成やセルの構成は、全く同じもので、以下のようになっています。[]内がシートの名前です。
[初期設定]
[祝日設定]
[時間割]
[4月]
[5月]
[6月]
[7月]
[8月]
[9月]
[10月]
[11月]
[12月]
[1月]
[2月]
[3月]

 転記したい「時数調査01.xlsm」ファイル内の各シートのデータは、以下のとおりです。
[初期設定]シート内の B3:B4、B9:P11
[時間割]シート内の B4:F10
[4月]から[3月]までのシート内の C5:Q35、T5:W35、Y5:Y35
([4月]から[3月]までの12か月分のシートについては、すべて同じセル番地の転記になります。)
 これだけのデータを、「時数調査02.xlsm」の同じシート、同じセルにそのまま転記したいと思っています。
 転記したいデータは、関数式を含まない、テキスト、数字となります。

2点目
 「時数Bug_Fixed版」のフォルダ内にある「時数調査01.xlsm」と「時数調査02.xlsm」の2つのファイルですが、実は、職場の方30名ぐらいの方がこのファイルを利用しておりまして、「時数調査01.xlsm」のファイル名をそれぞれ多様な名前を付けております。
 そこで、「時数Bug_Fixed版」のフォルダ内には、該当のファイルを入れてもらうこととし、「時数調査01.xlsm」に当たるファイル名を指定しないで、1点目同様のマクロが組めるものか、その点を含んでお教えいただければと思っております。
 どうか、よろしくお願いいたします。


 VBAを作ってみました。
 エラー処理は入れていませんので、想定外の事態にはエラーで止まります。

 「時数調査01.xlsm」に当たるファイル名は、指定するのではなく【アクティブブック】を
 該当のブックとみなして処理します。

 一方「時数調査02.xlsm」の方は必ずこの名前として、開いた状態で実行して下さい。

 コード自体は何処へ置いて有ってもかまいませんが
 転記後は不要になりますので、新しいファイルに置いておいて
 三つのブックを開いて実行するのが良いと思います。

 その際、元データが有るブックをアクティブにするのを忘れないで下さい。

 以下コードです。

 '------
Sub 新しいブックへ値転記()
Dim i As Long
Dim MyBkN As String, MyShN As String
    MyBkN = "時数調査02.xlsm"
    For i = 1 To Worksheets.Count
        MyShN = Sheets(i).Name
        If MyShN = "初期設定" Then
            Call 転記作業(MyBkN, MyShN, "B3:B4,B9:P11")
        ElseIf MyShN = "時間割" Then
            Call 転記作業(MyBkN, MyShN, "B4:F10")
        ElseIf Right(MyShN, 1) = "月" Then
            Call 転記作業(MyBkN, MyShN, "C5:Q35,T5:W35,Y5:Y35")
        End If
    Next
End Sub
 '------
Sub 転記作業(MyBkN As String, MyShN As String, MyRng As String)
Dim Buf As Variant, ARA As Variant
Buf = Split(MyRng, ",")
    For Each ARA In Buf
        Workbooks(MyBkN).Sheets(MyShN).Range(ARA).Value = Sheets(MyShN).Range(ARA).Value
    Next
End Sub
 '------

 (HANA)

 HANAさん、ありがとうございます。
 お教えいただいたとおりに行いましたら、確かにバッチリ転記が行われました。最初に質問を立ててから、かなり時間が経ちましたので、あきらめかけておりましたが、本当にありがとうございます。

 さて、もう少しお教えいただきたいことがありまして、どうかよろしくお願いいたします。
 最初の質問の時には、ここまで記述していなかったこと、申し訳ございませんが、マクロを実行するボタンの設置について、お願いいたします。
 今、作ろうとしているブックは、職場の30名ほどのものが利用しますが、中にはExcelのマクロを実行するときに、「ツール」→「マクロ」→「マクロ」 と選択し、該当するマクロを実行することに敷居の高さを感じる者も多くいます。
 そこで、マクロを実行するボタンを「時数調査02.xlsm」のどこかのシートに配置して、1クリックで転記されるようにならないかな、と思っております。

 しかし、HANAさんに教えていただいた方法では、元データのある「時数調査01.xlsm」に当たるブックをアクティブの状態にしておかなければマクロが実行されませんので、マクロ実行ボタンを「時数調査02.xlsm」に配置してマクロを実行することは実際には無理なことと思われます。

 マクロ実行ボタンを配置するには、全員の個別についているファイル名を「時数調査01.xlsm」というふうにファイル名を付け替えて、そのファイル名を指定してマクロが実行されるようにするしかないでしょうか。
 もし、その方法しかないとすれば、どの部分を修正すればよいでしょうか。(「ツール」→「マクロ」→「マクロ」 と選択し、該当するマクロを実行する場合と、ファイル名の付け替えの場合では、後者の方が職場の者にとって敷居が低いと思われますので。)

 重ねて貴重なお時間を頂戴しますこと、誠に申し訳ございませんが、よろしくお願いいたします。

(あまなつ)


 >最初に質問を立ててから、かなり時間が経ちましたので
 そうですね。不思議とレスがついて居なかったですね。
 もしかしたら他の方は
 >さて、もう少しお教えいただきたいことがありまして〜〜
 と、質問が続く事を見越しておられたのかもしれません。

 >マクロを実行するボタンの設置について
 ですが
 「時数調査01.xlsm」にあたるブックをアクティブにして実行する目的は
 『どのブックがコピーするブックなのか特定する為』
 です。

 なので、他の特定出来る方法が有れば「アクティブにして実行」は
 必須では無く成ります。

 たとえば、
  ブックを二つだけ開いて実行する。
  アクティブでないブックが、コピーするブック。
 と言ったルールが有れば、特定出来ます。

 しかし、一度転記してしまえばその後不要なコードを
 ずっと持ち歩くのは無駄に思えます。

 ・・・一度実行すれば、そのブックでもう一度実行する事は無いのですよね?

 でしたら、
  1.コピー元ブック
  2.「時数調査02.xlsm」ブック
  3.マクロ入りのブック
 で、3のブックにボタンを作るのはどうですか?

 関係無いブックを開かないといけない ってのも敷居が高いでしょうか?

 或いは「時数調査02.xlsm」の保存場所が決まっていて それを開けば良いのなら
  1と3を開いて実行。2はマクロが勝手に開く。
 とか
  3を開いて実行。フォルダが表示されるので、1のブックを選択。2はマクロが勝手に開く。
 等

 「何回でも実行するので、マクロが入ってても関係無いよ。寧ろ残ってる方が良い」
 って事なら、あまり考えなくても良いのかもしれませんが。

 (HANA)


 HANAさん、早速ありがとうございます。

>「何回でも実行するので、マクロが入ってても関係無いよ。寧ろ残ってる方が良い」
 今回、作ったExcelファイルの一部に計算式の不備があり、データの転記が必要になりましたので、また、今後もないとは限らないことを考えますと、むしろマクロが残っていたほうがよいと思っております。

 HANAさんがおっしゃる、
>ブックを二つだけ開いて実行する。
>アクティブでないブックが、コピーするブック。
> と言ったルールが有れば、特定出来ます。
 このようなルールを設定することは可能です。

>1.コピー元ブック
>2.「時数調査02.xlsm」ブック
>3.マクロ入りのブック
 コピー元ブックは、このブックを利用している30名程の者が、こちらからアクセスできない、それぞれのパソコンのそれぞれの場所に持っており、そのすべてのブックに当方がマクロ実行ボタンを設置するというのは、実質できない状態です。
 コピー元ブックは、当事者に、「ファイル名を変更する」「保管場所を変更する」ぐらいのことしかしてもらうことができず、ファイル内部の変更はできない状態という具合です。

 また、
>関係無いブックを開かないといけない ってのも敷居が高いでしょうか?
 関係ないブックを開くという作業は、敷居は低いと思われます。

 上記のようなことから、
1 コピー元ブック(ファイル名を「時数調査01.xlsm」とする)
2 「時数調査02.xlsm」ブック(マクロ、マクロ実行ボタンを含んだブック)
として、実行することはできないでしょうか。

 文面でうまくお伝えすることがなかなかできず、申し訳ないのですが、また、ご教示よろしくお願いいたします。

(あまなつ)


 方針は分かりましたが、状況を整理させてください。
 >今回、作ったExcelファイルの一部に計算式の不備があり、データの転記が必要になりましたので、
 >また、今後もないとは限らないことを考えますと、
 >むしろマクロが残っていたほうがよいと思っております。

 この場合、今度は「時数調査02.xlsm」ブックを元データとして
 正しい数式に変更した「時数調査03.xlsm」ブックに値を貼り付けるのですよね?

 すると、「時数調査02.xlsm」ブックのマクロはやはり使わない
   このマクロは、02に値貼り付けする為のマクロなので
 と言う事になるのでは無いですか?

 それとも、運用が進んでも 01ブックの値が元データ
  (各自02ブックを使う事に成っても、値の変更が有った場合
   同時に01ブックも変更する)
 に成る様に使用して行くのでしょうか?
 そして、正しい数式の入った02ブックを作って・・・・???
 新しい02ブックに入っているマクロを実行・・・???

 今回作るマクロを02ブック(これから運用して行くブック)に入れておいた場合
 それを使う場合 と言う状況が想像つかないのですが
 どういった時に使うのでしょう?

 (HANA)

 なかなかうまくお伝えすることができずに申し訳ありません。

 今回、このようなお願いをするに至った状況をご説明いたします。

 今年度4月より、私が作成した「時数調査01.xlsm」ブックで運用をしておりました。
 ところが、ブック内の一部の計算式に不備があることが分かり、それを修正した「時数調査02.xlsm」ブックを作成いたしました。
 9月分より「時数調査02.xlsm」ブックに乗り替え、運用を再開したいところなのですが、4月から8月までのデータを「時数調査02.xlsm」ブックに再入力しなければ、時数の合計や残り時数等の関係でうまく計算してくれません。
 そこで、これまで運用していた「時数調査01.xlsm」ブックから「時数調査02.xlsm」ブックへ、データの転記が必要になりました。

 ただ、「時数調査01.xlsm」ブックの修正版として作成しました「時数調査02.xlsm」ブックも、今後新たに計算式の不備が出てくるやも知れません。そうした場合に、「時数調査02.xlsm」ブックを上書きで修正した「時数調査03.xlsm」ブックを作成し、マクロのコード内に指定してある"時数調査02.xlsm"等の該当部分を"時数調査03.xlsm"等に置き換えて、さらに転記できるようにしたいと考えています。

 マクロやExcel自身について、自分の知識と理解の不十分さから、どうしても言葉足らずの部分があったり、見当違いの考えを述べていたりするかも知れませんが、このような状況です。

 以下、HANAさんから前スレッド中にいただきました確認事項について、記します。

>この場合、今度は「時数調査02.xlsm」ブックを元データとして
>正しい数式に変更した「時数調査03.xlsm」ブックに値を貼り付けるのですよね?
 はい、そうなります。

>それとも、運用が進んでも 01ブックの値が元データ
>(各自02ブックを使う事に成っても、値の変更が有った場合 同時に01ブックも変更する)
>に成る様に使用して行くのでしょうか?
 「02ブック」を使用していく段階では、「01ブック」を削除いたします。
 万が一、運用している「02ブック」に修正を入れなければならなくなったときは、「02ブック」に上書きで修正をかけ、「03ブック」とします。そして、「02ブック」からデータの転記を行い、「02ブック」を削除して、「03ブック」のみで運用していきます。

 HANAさんにとって、的を射たお答えになっているかどうか、また、相応しい運用の仕方になるのかどうか自信がないのですが、どうぞよろしくお願いいたします。

(あまなつ)


 イメージが分かりました。
  今後「02ブック」を複製して「03ブック」を作った時に
  「02ブック」に保存されているマクロも「03ブック」に複製されるので
  そのまま使う
 って事ですね。

 私が思ったのは
 ・次に03ブックを作る時までこのマクロも マクロ実行ボタンを置いているシートも要らないよね
 って事なんです。

 通常業務で要らない物を持ち歩いていると
 本当に要るものが見つかりにくくなってしまう。

 或いは、うっかりやってしまう事も無いと思いますが
  01ブックに8月分までデータを入力している。
  マクロでデータをコピーして、02ブックに9月分を入れた。
  確認したい事が有って01ブックを開いている時 うっかりボタンを押してしまった。
 すると、9月分のデータは消えてしまいますよね。

 マクロを入れるだけのブックを作って
 '------
Sub 新しいブックへ値転記2()
Dim i As Long
Dim CBkN As String, PBkN As String, MyShN As String
Dim Buf As Variant
    If Workbooks.Count <> 3 Then
        MsgBox "コピー元ブック・コピー先ブックを開いて実行して下さい。"
        Exit Sub
    End If
    For Each Buf In Workbooks
        If Left(Buf.Name, 4) = "時数調査" Then
            PBkN = Buf.Name
        ElseIf Buf.Name <> ThisWorkbook.Name Then
            CBkN = Buf.Name
        End If
    Next

    If PBkN = "" Or CBkN = "" Then
        MsgBox "対象ブックが開いていません。"
        Exit Sub
    End If

    For Each Buf In Workbooks(CBkN).Worksheets
        If Buf.Name = "初期設定" Then
            Call 転記作業(CBkN, PBkN, Buf.Name, "B3:B4,B9:P11")
        ElseIf Buf.Name = "時間割" Then
            Call 転記作業(CBkN, PBkN, Buf.Name, "B4:F10")
        ElseIf Right(Buf.Name, 1) = "月" Then
            Call 転記作業(CBkN, PBkN, Buf.Name, "C5:Q35,T5:W35,Y5:Y35")
        End If
    Next
End Sub
 '------
Sub 転記作業(CBkN As String, PBkN As String, MyShN As String, MyRng As String)
Dim Buf As Variant, ARA As Variant
Buf = Split(MyRng, ",")
    For Each ARA In Buf
        Workbooks(PBkN).Sheets(MyShN).Range(ARA).Value = Workbooks(CBkN).Sheets(MyShN).Range(ARA).Value
    Next
End Sub
 '------

 ↑マクロと、実行ボタンを設置。
 01にあたるブックと、「時数調査02.xlsm」と、このブックを開いて実行。

 して貰う事にしてはどうでしょう?

 今後新しいブック名が03,04・・・と変わっても良い様に
 コピー先ブックは、名前が「時数調査」で始まっている事を目安にしています。
 コピー元ブックの名前を もしも変更していない場合
 どちらからどちらにコピーして良いのか分からないので 終了させる様にしています。
 変更してから、実行する様にして貰って下さい。

 (HANA)


 HANAさん、ありがとうございました。うまくいきました。

 ただ、コピー元のブック名を「時数調査01.xlsm」、コピー先のブック名を「時数調査02.xlsm」とした状態では、うまくいかず、"対象ブックが開いていません。"と表示されました。

 そこで、コピー元のブック名を「時数集計01.xlsm」とし、最初の4文字分を「時数調査」から「時数集計」に変えたところ、うまく転記されました。

>コピー先ブックは、名前が「時数調査」で始まっている事を目安にしています。
>コピー元ブックの名前を もしも変更していない場合
>どちらからどちらにコピーして良いのか分からないので 終了させる様にしています。

 「コピー先ブックは、名前が『時数調査』で始まっている事を目安にしています」ということは、あくまでもコピー先のブック名だけに該当し、コピー元のブック名の最初には「時数調査」の文字が入っていてはいけない、という理解でよろしいでしょうか。

 また、私が職場に配布した時点でブック名を「時数調査01.xlsm」としておりましたが、配布された側では、ブック名の最初の部分は変えずに「時数調査01_6年1組.xlsm」のようにしている場合も多いと予想しています。
 コピー元のブック名を変更することが必須であることは伝えることはできますが、それでも、ブック名を変更しないままマクロを実行する場合も考えられます。
 そういう場合には、「ブック名の最初が『時数調査』で始まっています。コピー元のブック名を変えて、もう一度実行してください。」というようなメッセージを出すように、上記マクロの構文に入れることは可能でしょうか。

 また、お時間を取らせますが、よろしくお願いいたします。

(あまなつ)


 >コピー元のブック名の最初には「時数調査」の文字が入っていてはいけない、
 >という理解でよろしいでしょうか。 
 はい、最初の4文字を取り出して判断していますので。

 そうですか。
 でしたら、どこかのセルに何かを入れてもらう事にしましょうか。

 たとえば、コピー先ブック(02ブック)の 初期設定シートのA1セルにでも
 「新しいブック」と入力しておく。
 この文字が無いブックがコピー元ブックで、この文字が無いブックがコピー先ブック。

 或いは、入力が有った時に必ず値が出るセルでも有れば
 それを目安に出来ますが。

 たとえば、初期設定シートのB3,B4セルなんかは 何が入力されるのでしょう?
 「使用する時は必ず入力する」と言ったセルであれば このセルの入力内容の有無で
 どちらのブックなのか特定出来ると思います。

 マクロ実行前にそのセルに何かを入力されてしまっては
 結局特定できないのですが。

 (HANA)

 HANAさん、何度もありがとうございます。

>或いは、入力が有った時に必ず値が出るセルでも有れば
>それを目安に出来ますが。

 これに該当するのが、各ブックの[4月]シートのセル番地「R38」だと思われます。
 [4月]シートのセル番地「R38」は、累計の時数が以下の計算式によって打ち出されるようになっております。
=IF(COUNTBLANK(C38:Q38)=15,"",SUM(C38:Q38))

 これまで運用していたコピー元のブックには、1以上の数字が入っており、コピー先ブックには、ブランク(数字は何も入力されていない)になります。

 これでうまくいきますでしょうか。
 よろしくお願いいたします。

(あまなつ)


 5月から運用が始まったブック なんてのは無いのですか?
 その場合、4月はデータの入力が無い事に成りませんか?

 「初期設定」シートの方が、確実に何か有りそうですが。。。

 「02」ブックは、テンプレートの様なものを
 各個人が開き(或いは自PCにコピーして)
 このマクロを実行して、運用を開始するのですよね?

 でしたら、「02」ブックに仕込んでおく方が良さそうに思います。

 「02」ブックの初期設定シートのA1セルに "新" と言う文字を入れておいて下さい。
 処理終了後、その文字は削除されます。

 '------
Sub 新しいブックへ値転記3()
Dim i As Long
Dim CBkN As String, PBkN As String, MyShN As String
Dim Buf As Variant
    If Workbooks.Count <> 3 Then
        MsgBox "コピー元ブック・コピー先ブックを開いて実行して下さい。"
        Exit Sub
    End If
    For Each Buf In Workbooks
        If Buf.Name <> ThisWorkbook.Name Then
            If Buf.Sheets("初期設定").Range("A1") = "新" Then
                PBkN = Buf.Name
            Else
                CBkN = Buf.Name
            End If
        End If
    Next    
    If PBkN = "" Then
        MsgBox "コピー先ブックが見つかりませんでした。"
        Exit Sub
    End If
    If CBkN = "" Then
        MsgBox "コピー元ブックが見つかりませんでした。"
        Exit Sub
    End If    
    For Each Buf In Workbooks(CBkN).Worksheets
        If Buf.Name = "初期設定" Then
            Call 転記作業(CBkN, PBkN, Buf.Name, "B3:B4,B9:P11")
        ElseIf Buf.Name = "時間割" Then
            Call 転記作業(CBkN, PBkN, Buf.Name, "B4:F10")
        ElseIf Right(Buf.Name, 1) = "月" Then
            Call 転記作業(CBkN, PBkN, Buf.Name, "C5:Q35,T5:W35,Y5:Y35")
        End If
    Next    
    Workbook(PBkN).Sheets("初期設定").Range("A1").ClearContents
End Sub
 '------
Sub 転記作業(CBkN As String, PBkN As String, MyShN As String, MyRng As String)
Dim Buf As Variant, ARA As Variant
Buf = Split(MyRng, ",")
    For Each ARA In Buf
        Workbooks(PBkN).Sheets(MyShN).Range(ARA).Value = Workbooks(CBkN).Sheets(MyShN).Range(ARA).Value
    Next
End Sub
 '------

 (HANA)


HANAさん、ありがとうございます。

>5月から運用が始まったブック なんてのは無いのですか?

 はい、ありません。職場の者、個々にバラバラな月から始まるということはなく、すべての者が4月からデータ入力を行っています。

>「02」ブックは、テンプレートの様なものを
>各個人が開き(或いは自PCにコピーして)
>このマクロを実行して、運用を開始するのですよね?

 はい、そのとおりです。

>でしたら、「02」ブックに仕込んでおく方が良さそうに思います。

 HANAさんが指示された「02」ブックの初期設定シートのA1セルには、すでに入力されたテキストがありましたので、A20セルに「新」と入れ、マクロの記述もそれに該当すると思われる2箇所をA1セルからA20セルに置き換えて実行いたしました。
 あと、分からないながらも「Workbook(PBkN).Sheets("初期設定").Range("A20").ClearContents」の部分を
 「Workbooks(PBkN).Sheets("初期設定").Range("A20").ClearContents」に変更しました。(済みません。見つけるのに時間がかかり、遅くなってしまいました。)

 すると、転記の作業はすべてうまくいきましたが、以下の2点が問題として出てきました。
1 マクロ実行後、転記作業は行われるものの、「Microsoft Visual Basic 400」というメッセージが表示される。
2 マクロの記述上、消えるはずのA20セルの「新」が消えずに残ってしまう。

 どういったことが考えられますでしょうか。
 また、よろしくお願いいたします。

 (あまなつ)


 >A20セルに「新」と入れ、マクロの記述もそれに該当すると思われる2箇所を
 >A1セルからA20セルに置き換えて実行いたしました。
 はい、それで大丈夫です。

 >「Microsoft Visual Basic 400」というメッセージが表示される。 
 に関して、一応確認ですが
 コードは、標準モジュールに書いて貰っていますか?
 もしもシートモジュールに書いていたら、標準モジュールを挿入して
 そこにコードを置いてみてください。

 それでとりあえず、オートシェイプで図形を描いて
 右クリック→マクロの登録 で、マクロを登録してみて下さい。
 (Macだと、右クリックないのか。。。
  済みませんが、同様の操作が分からないので。)

 (HANA)

 HANAさん、遅い時間までありがとうございます。

>コードは、標準モジュールに書いて貰っていますか?

 HANAさんのご指摘のとおり、シートモジュールに書いていました。
 そこで、標準モジュールに書き直して実行しましたところ、転記は行われるものの、A20セルの「新」のテキストは消えない状態で、さらに今度は、以下のようなメッセージが出ました。

「実行時エラー '1004'
変更しようとしているセル、またはグラフは保護されているため、読み取り専用となっています。保護を解除するには、[ツール]メニューの[保護]をポイントし、[シートの保護]をクリックします。パスワードが必要な場合もあのます。」

 確かに、「02」ブックの初期設定シートには、余計な書き込みができないようにシートの保護をかけており、そこで作業がストップしたものと思われます。

 マクロ実行後には、「02」ブックの初期設定シートが保護されている状態にしたいと思っています。
 そうなると、マクロ構文の中で、「02」ブックの初期設定シートの保護を解除し、実行後にはシートの保護をかける、という記述が必要になるということでしょうか。
 ちなみに、パスワードは設定していません。

 どうか、よろしくお願いいたします。

(あまなつ)


 >そうなると、マクロ構文の中で、「02」ブックの初期設定シートの保護を解除し、
 >実行後にはシートの保護をかける、という記述が必要になるということでしょうか。

 まさに、そのとおりです。

 シートの保護・解除の操作を  マクロの記録でとってみて下さい。

 そして  〜.ClearContents  の上下に追加して下さい。

 (HANA)

 HANAさん、ありがとうございます。

        Workbooks(PBkN).Sheets("初期設定").Unprotect
        Workbooks(PBkN).Sheets("初期設定").Range("A20").ClearContents
        Workbooks(PBkN).Sheets("初期設定").Protect

というふうに記述しましたら、転記もされて、「新」も消えて、シートの保護をかけた状態で作業を終えてくれました。

 その後、マクロ構文中にあります、"コピー先ブックが見つかりませんでした。"、"コピー元ブックが見つかりませんでした。"というメッセージがどのような場合に表示されるのか、点検を兼ねてあれこれやっていましたら、

1 マクロの書かれているブック、コピー元のブック、まったく構成の違うExcelブック(拡張子は、.xls)を開いた状態でマクロ実行
2 マクロの書かれているブック、コピー先のブック、まったく構成の違うExcelブック(拡張子は、.xls)を開いた状態でマクロ実行

ということをした場合に、いずれも
「実行時エラー '9'  インデックスが有効範囲にありません。」
とメッセージが出ました。
 そのメッセージ中の「デバッグ」をクリックして表示されたマクロのコードを見ましたら、
「If Buf.Sheets("初期設定").Range("A20") = "新" Then」
の部分が黄色の網掛けで表示されていました。

 このようなエラーになった場合、「正しいブックを開いてください。」のようなメッセージを出して、処理を終了させるようなことはできますでしょうか。

 次から次へと申し訳ございませんが、ご教示よろしくお願いいたします。

(あまなつ)


 あぁ、そうですね。
 今のままでは
 >MsgBox "コピー元ブックが見つかりませんでした。"
 に分岐する事は無いですね。

 元々【今回使用する3つのブックだけを開いて処理する】を前提に話を進めて居ますので
 それ以外のブックが開いているとエラーになります。

 後は エラーで止まらない様に、何を何処まで確認するか が問題だと思います。
 考え始めるときりがないので、後はそちらで実装して下さい。

 取り敢えず
 >「If Buf.Sheets("初期設定").Range("A20") = "新" Then」 
 >の部分が黄色の網掛けで表示されていました。
 これは、対象ブック(変数:Bufに入っているブック)に
 「初期設定」と言うシートが無かった為に エラーに成っていると思います。

 ブックが3つだけ開いていて
 If Buf.Name <> ThisWorkbook.Name Then
 だった場合、先に「初期設定」と言うシートが有るかどうか確認して
 セルの値の確認に入って貰うと良いと思います。

  それでも、たまたま間違えて開いたブックに「初期設定」と言うシートが有ったら
  エラーには成りませんが、正しいブックでは無いのですが。

 シートの有無の確認方法は、Web検索して貰うといくつか見つかると思いますので
 あまなつさんが分かりやすいと思った物を使って貰うと良いと思います。

 (HANA)

 HANAさん、懇切ていねいにお教えいただきまして、誠にありがとうございました。丸一日以上、貴重なお時間を頂戴しましたこと、本当にありがたく、感謝の思いでいっぱいです。おかげさまで、十分満足のいく、扱いやすいブックに仕上がりました。

 最後に教えていただいたこと、自分なりにがんばってみたいと思います。
 本当にありがとうございました。

(あまなつ)


コメント返信:

[ 一覧(最新更新順) ]


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