[[20101104155708]] 『マクロの処理でシートがない場合』(みく) ページの最後に飛ぶ

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

 

『マクロの処理でシートがない場合』(みく)

 ファイルにはシートが何枚かありまして、
 名前が「出荷1」「出荷2」「出荷3」・・・ と付くようになっています。
 出荷が多いとシートの枚数が増えていきます。

 そこで、マクロを使って、シートのある部分をコピーするようにしたのですが
 出荷が少ないとシートがない場合があります。
 例えば、「出荷1」のシートしかないのに、
 マクロにSheets(”出荷2”).select と作ってしまうとエラーが出てしまいます。
 これを回避するにはどのようにしたらいいのでしょうか。   

 全てのワークシートをループさせて
 シート名が「出荷・・・」というシート名であれば処理をする。
 というようにしてみてはどうでしょう?

  Dim ws As Worksheet
  For Each ws In Worksheets
    If ws.Name Like "出荷*" Then
      '処理
      MsgBox ws.Name
    End If
  Next ws

 (momo)

 マクロの処理の意味がわからないので、教えて下さい。
 「’処理」 というところに 処理したい事を入れるのですよね。
 で、Sheets(”出荷2”).select 後省略
 と入れるとエラーが出てしまいます。
 どのようにすればよろしいのでしょうか。
 ど素人なもので、いわれた事を入力する知識しかないので 申し訳ありません。
 お願いします。

 (みく)


 処理がわからないので回答のしようが無いのですが・・・

 出荷・・・というシートを順番に処理するのではないのですか?
 出荷なんとかというシートが順番にwsというオブジェクト変数に入っていますので
 Selectするだけなら(VBAでの処理にSelectは必要無いと思いますが)
 ws.Select
 と入れてみてください。

 (momo)

 こんにちは
 シート名で処理を分岐するなら
 Sub test()
    Dim sh As Worksheet
    On Error Resume Next
    Set sh = Worksheets("出荷2")
    On Error GoTo 0
    If sh Is Nothing Then Exit Sub
    '処理
End Sub
そのシートが存在した時だけ処理すればいいのですが、
存在する「出荷〜」シートを順に処理する(momo)さんの方法に変更する事も検討してはどうですか?
(ウッシ)


 教えていただきましてありがとうございます。
 頭の回転が鈍いせいもありまして、まだうまく行きません。
 他の仕事もあって、時間が掛かりそうです。

 時間に余裕が無くて、説明に時間を掛けられなくてすいません。
 時間に余裕が出来ましたらまた来ますのでよろしくお願いします。

 (みく)

 


 実際にやりたい事を書いてみてはどうでしょうか?

 出荷1のA1:E10の範囲を○○シートのどこにコピーして
 次に出荷2の同じ範囲を○○シートの出荷1データの下にコピー
 以上の事を出荷?まで繰り返す。

 というような内容がわかれば参考にして頂ける程度のコードは書けますので。
 (momo)

 すいません。再度お願い致します。
 最初お話ししました内容と少し異なるので、話しをリセットして書きたいと思いますのでお願いします。

 まず、ファイルが2個、名前は「売上日報」と「出荷実績」です。
 「売上日報」のシート名は、「出荷1」「出荷2」・・・・・・ 
 というように付けてあり、出荷の量によってシートが増えて行きます。 
 「出荷実績」のシート名は、「日報1枚目」「日報2枚目」「日報3枚目」・・・「日報5枚目」、
 「集計表」「入力画面」があります。

 作業の流れですが、毎日「売上日報」というファイルが更新されます。
 その「売上日報」の「出荷1」のセルを全部コピーして、
 「出荷実績」のシート「日報1枚目」に貼り付けします。
 「出荷2」のシートがあれば同じ様にセルの全部をコピーして、
 「出荷実績」のシート「日報2枚目」に貼り付けます。
 後は同じ事を繰り返して、そのデータから必要な項目をピックアップして集計表にまとめ報告しています。

 作業の流れ的に「売上日報」のファイルを開いて、「出荷実績」のファイルを開いて、
 一個一個手作業で実施してたのですが、マクロを使って処理出来るように考えました。
 一ヶ所うまく行かない所は、出荷が少ないと「売上日報」に「出荷2」・・・のシートがないので
 次のようなマクロを使うとエラーが出てしまうのです。

   Windows("売上日報.xls").Activate
   Sheets("出荷1").Select
   Cells.Select
   Selection.Copy

   Windows("出荷実績.xls").Activate
   Sheets("日報1枚目").Select
   Cells.Select
   ActiveSheet.Paste

   Windows("売上日報.xls").Activate
   Sheets("出荷2").Select
   Cells.Select
   Selection.Copy

   Windows("出荷実績.xls").Activate
   Sheets("日報2枚目").Select
   Cells.Select
   ActiveSheet.Paste

 後は同じ様に作りました。
 説明が下手ですいません。よろしくお願いします。

 (みく)


 以前の回答のままですけど
 マクロが出荷実績.xlsに書かれているとして

  Dim ws As Worksheet
  For Each ws In Workbooks("売上日報.xls").Worksheets
    If ws.Name Like "出荷*" Then
      ws.Cells.Copy _
        ThisWorkbook.Worksheets("日報" & Replace(ws.Name, "出荷", "") & "枚目").Range("A1")
    End If
  Next ws

 こんな感じで良いのではないでしょうか?
 売り上げ日報のブックは開いた状態で実行です。

 (momo)

 ありがとうございます。
 とりあえず、momoさんのマクロだけで実行させてみました 
 出来ました。

 あともう少しお願いできますか。 
 「出荷*」ですが、「出荷1」「出荷2」・・・ではなく
 「出荷実績」、「出荷実績 (2)」、「出荷実績 (3)」・・・・ 
 となるような場合は どのように改良すればよろしいでしょうか。

 一度に聞けば良かったのですが 申し訳ございません。

 (みく)


 テストしてませんが

  Dim ws  As Worksheet, myNum As Long
  With CreateObject("VBScript.RegExp")
    .Pattern = "\d+"
    .Global = True
    For Each ws In Worksheets 'Workbooks("売上日報.xls").Worksheets
      If ws.Name Like "出荷実績*" Then
        If .test(ws.Name) Then
          myNum = .Execute(ws.Name)(0)
        Else
          myNum = 1
        End If
        ws.Cells.Copy _
            ThisWorkbook.Worksheets("日報" & myNum & "枚目").Range("A1")
      End If
    Next ws
  End With

 (momo)

 momoさん 凄いです。
 ありがとうございます。ちゃんとできました。
 私のレベルでは絶対に出来なかったです。
 感謝してます。
 これで、仕事も素早く簡単に処理できそうです。
 ありがとうございました。

 (みく)


 momoさん もう少しよろしいでしょうか。
 「売上日報」のファイルですが、毎日更新されていくのですが、
 メッセージ表示で「売上日報は更新しましたか」と出るようにして、
 更新されてなければ処理を終了させて、更新されていれば処理を進めるようにする方法って
 どのようにしたらできますか。

 あと、ファイルの更新日時が出るように出来たらいいのですが。
 よろしくお願いします。

 (みく)

 1.どのタイミングでメッセージを出すのでしょう?
   ボタンかなにかで上のコードを実行した時?それとも?

 2.ファイルの更新日時とはいつの日時ですか?
   また、どこに出るようにするのですか?

 (momo)

 すいません。 
 ボタンにマクロが登録してあるのですが、それを押すと、
「売上日報」のファイルが開き、momoさんが教えてくれたマクロを使って
 シートのコピーをするように作りました。 
 そのボタンを押したときに、「売上日報」の更新をしたのかどうか、確認出来るようにしたいのです。
 売上日報を更新させないで、処理してしまう事が考えられるため、
 処理が進む前に、チェックさせたいのです。
 それで、更新してないと気付いたら作業を終了するようにしたいと思うのです。

 それから、更新日時の件ですが、ファイルには更新日時がありますよね。
 あの日時を使えるといいかもって思ったものですから・・・。
 「更新しましたか」というようなメッセージと共に更新日時がでればいいかと思います。

 出来ればでいいので、お手数お掛けします。すいません。ほんとに。

 (みく)

 なるほど、では最初にこんなコードを追加してみてはどうですか?

  Dim myDoc As DocumentProperty
  Dim myDate As Date
  For Each myDoc In Workbooks("売上日報.xls").BuiltinDocumentProperties
    If myDoc.Name = "Last save time" Then
      myDate = myDoc.Value
      Exit For
    End If
  Next
  If MsgBox("売上日報は更新しましたか?" & vbLf & _
            "最終保存日時は " & myDate & " です。", vbYesNo) = vbNo Then
    MsgBox "売上日報を更新してから作業してください"
    Exit Sub
  End If

 (momo)

 momoさん 大成功です。
 素晴らしいものが出来ました。ありがとうございました。

 みんなで、すごいすごいの連続でしたよ。

 (みく)

 今回のコードの中身を1つづつゆっくり理解していって
 次は、みくさんが直接喜ばれるようなコードを作れるように頑張ってください。

 理解される過程でわからない事があれば、遠慮なく質問してください。
 (momo)

 あまり頼ってはいけないと思いながら、知識も乏しくて調べるのも大変で
 最終的には、ここへ来てお願いしちゃうんですよね。
 コードの中身はわからない事が多くて、コピペしてるだけでなんです。
 少しずつ勉強していきますので、またお願いします。

 (みく)

コメント返信:

[ 一覧(最新更新順) ]


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