[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロの処理でシートがない場合』(みく)
ファイルにはシートが何枚かありまして、 名前が「出荷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.