アプリ版:「スタンプのみでお礼する」機能のリリースについて

毎日更新される元データとなるデータファイルがあります。
それを、私のほうで集計する為に集計用のファイルを作っており、DBとして毎日データをコピペで蓄積しています。
これを自動反映できるようにしたいのですが、いい方法はありますでしょうか?

・元データは「実績0123」というようなタイトルで、毎日日付の部分は変更されてデータがきます。
項目列はA列からR列まであります。
集計用DBですが、蓄積しているので、更新したいのは今でいうと1月のデータです。
また、全部の列でははなく場合によっては特定の列のデータのみデータ蓄積・更新したい場合は
どのようにしたらよいか?ご教授頂ければ幸いです。

質問者からの補足コメント

  • うーん・・・

    補足要求です。
    >元データは「実績0123」というようなタイトルで、毎日日付の部分は変更されてデータがきます。
    項目列はA列からR列まであります。
    >>とういうことですが、「実績0123」というようなタイトルとは、
    シート名が「実績0123」ですか。
    ブック名が「実績0123」ですか。
    →説明不足で申し訳ありません。
    ブック名とシート名どちらも同じタイトルです。


    >毎日日付の部分は変更されてデータがきます。
    >項目列はA列からR列まであります。
    >> 日付はどの列ですか?
    >>見出しはありますか?
    →日付はD列にあります。見出しは売上日付です。


    >>イメージがよくつかめません。
    >>元データの図を添付していただけませんでしょうか。
    →添付いたしました。
     横に長い為、画像が小さくなってしまう為K列までとL列以降で
     2段に分けて表示しております。

    「【マクロ】元データを別ファイルへコピペ&」の補足画像1
    No.2の回答に寄せられた補足コメントです。 補足日時:2017/01/27 09:33
  • うーん・・・

    >集計用のファイルを作っており、DBとして毎日データをコピペで蓄積しています。
    >>このシートの図も添付していただけますか。
    >>そもそも、元データと集計用シートのイメージが判らないので、マクロの書きようがないです。
    →元データも集計用も列数、見出しは同じです。※添付参照ください。
    いつも自分でコピペをして蓄積をしていっているので(私のミスなのですが)
    1月からのデータを12月のデータに上書きをしてしまったりしてデータ集計がおかしくなってしまうことがあるので、それを防ぎたいので
    1月分のデータだけを更新するようにしたいです。すみません、言いたいことがうまく説明できず。。。

      補足日時:2017/01/27 09:34
  • うーん・・・

    >また、全部の列でははなく場合によっては特定の列のデータのみデータ蓄積・更新したい場合は
    >どのようにしたらよいか?ご教授頂ければ幸いです。
    >>これも、具体的に例を挙げて、どうなさりたいのか説明していただけませんでしょうか。
    →添付しております通り、黄色の列は元データではありますが集計用には不要な列な為
     G、S~V列以外を転記できたらなと思ってでした。。。
     ただ、コピペする際に削除すればいい話だとおもいますので、こちらについては大丈夫です。

      補足日時:2017/01/27 09:34
  • エラーが出て、デバッグを押すと黄色になっている部分がエラーというような表示がされます。

    「【マクロ】元データを別ファイルへコピペ&」の補足画像4
    No.11の回答に寄せられた補足コメントです。 補足日時:2017/01/30 17:04
  • モジュール部分添付します。

    「【マクロ】元データを別ファイルへコピペ&」の補足画像5
      補足日時:2017/01/30 17:06
  • うれしい

    こんにちわ。お礼を書き込んでしまったのでこちらに失礼いたします。

    先日は何度もご教授いたただきましてありがとうございました。
    №17にてご教授頂いたモジュールに書き直して実行したところ10分前後に短縮されました。

    おそらく、おっしゃっていただきました通り私のPCスペック能力が低い為に時間がかかってしまうようです。ある程度は改善されましたので、これで日々更新させていただきます。
    また、何かありましたらこちらに投稿させていただきますのでその際は、またご教授頂けますと幸いです。本当に助かりました、ありがとうございました。

    No.17の回答に寄せられた補足コメントです。 補足日時:2017/02/03 17:07

A 回答 (17件中1~10件)

多少早くなるようにしました。


データ1万件で確認したところ、こちらの環境では、
変更前:5秒
変更前:2秒
で、2~3倍程度速くなりました。前のマクロと入れ替えてください。
------------------------------------------------
Public Sub バックアップ処理2()
Dim sh1 As Worksheet 'データシート
Dim sh2 As Worksheet 'バックアップシート
Dim sh As Worksheet '管理シート
Dim dataFolder As String '元データフォルダ
Dim dataFile As String '元データファイル
Dim dataSheet As String '元データシート
Dim myBook As String 'バックアップブック名
Dim backSheet As String 'バックアップシート
Dim fullpath As String '元データシートのフルパス
Dim maxRow1 As Long 'データシート最大行
Dim row1 As Long 'データシート行
Dim row2 As Long 'バックアップシート行
Dim yyyy As Long '年
Dim mm As Long '月
Dim rg1 As String 'データシートレンジ
Dim rg2 As String 'バックアップシートレンジ
Dim t1 As Variant
Dim t2 As Variant
If MsgBox("バックアップを開始します", vbOKCancel) = vbCancel Then Exit Sub
myBook = ThisWorkbook.Name
Set sh = Worksheets("管理")
dataFolder = sh.Cells(2, "A").Value
dataFile = sh.Cells(2, "B").Value & ".xlsx"
dataSheet = sh.Cells(2, "C").Value
backSheet = sh.Cells(2, "D").Value
If ExistsWorkSheet(backSheet) = False Then
MsgBox (backSheet & "は存在しません")
Exit Sub
End If
If Dir(dataFolder, vbDirectory) = "" Then
MsgBox (dataFolder & "は存在しません。")
Exit Sub
End If
fullpath = dataFolder & "\" & dataFile
If Dir(fullpath) = "" Then
MsgBox (fullpath & "は存在しません。")
Exit Sub
End If
Workbooks.Open fullpath
Workbooks(dataFile).Activate
If ExistsWorkSheet(dataSheet) = False Then
MsgBox (dataFile & "中に" & dataSheet & "は存在しません")
Workbooks(dataFile).Close
Exit Sub
End If
Set sh1 = Worksheets(dataSheet) '元データシート
maxRow1 = sh1.Cells(Rows.count, 1).End(xlUp).row '元データシートの最大行取得
If maxRow1 < 2 Then
MsgBox (dataSheet & "にデータなし")
Workbooks(dataFile).Close
Exit Sub
End If
yyyy = year(sh1.Cells(2, "G").Value) 'データの年を取得
mm = month(sh1.Cells(2, "G").Value) 'データの月を取得
'バックアップシートの書き込み開始位置を検索する
Workbooks(myBook).Activate
Set sh2 = Worksheets(backSheet) 'バックアップシート
For row2 = 2 To Rows.count
If sh2.Cells(row2, "L") = "" Then Exit For
If year(sh2.Cells(row2, "L")) = yyyy And month(sh2.Cells(row2, "L")) = mm Then Exit For
Next
sh2.Activate
sh2.Range("L" & row2).Activate
If MsgBox(backSheet & "の" & row2 & "行以降へ書き込みます", vbOKCancel) = vbCancel Then
Workbooks(dataFile).Close
Exit Sub
End If
t1 = Time
Application.ScreenUpdating = False
'データをバックアップシートへコピーする
For row1 = 2 To maxRow1
rg1 = "A" & row1 & ":R" & row1
rg2 = "F" & row2 & ":W" & row2
Workbooks(myBook).Worksheets(backSheet).Range(rg2).Value = Workbooks(dataFile).Worksheets(dataSheet).Range(rg1).Value
row2 = row2 + 1
Next
Workbooks(dataFile).Close
Application.ScreenUpdating = True
t2 = Time
MsgBox ("バックアップ処理完了 処理件数=" & maxRow1 - 2 + 1 & " 処理時間=" & Minute(t2 - t1) & "分" & Second(t2 - t1) & "秒")
End Sub
-------------------------------------------------------
変更箇所は、copy命令をやめて代入命令に変えただけです。
(他に時間計測の命令を追加してます)
コピーではないので、集計先のL列の値が数値の可能性があります。その場合は、
L列の書式設定を適切に行い、日付が表示されるようにしてください。(書式のコピーはしません)

余談ですが、こちらでは、前回のマクロでも6秒で完了します。
多分、あなたのパソコンの処理能力が低いのとメモリ不足が原因の可能性が高いです。
このバックアップ実行時は、できるだけ他の処理を終了させ、このexcelだけが動くように
してください。そうすれば、もっと処理時間が短縮できると思われます。
この回答への補足あり
    • good
    • 1
この回答へのお礼

何度も検証いただき、申し訳ありませんでした。明日再度実行してみます。

仰る通り、PCの処理能力が低いのとメモリー不足は原因の1つの可能性が高いです。

アドバイスいただいたように、なるべくその作業のみをするようにしてみます。

本当にいつもご教授いただき、感謝しております。ありがとうございます。

お礼日時:2017/02/01 21:31

>この元データがかなり重く、作業完了するまでにかなり時間がかかってしまうのですが


>何か軽減するモジュールはありますでしょうか?

作業完了するまでの時間とは、このバックアップ処理2の作業が完了するまでの時間と理解しました。
幾つか質問がありますので補足ください。

質問1)1月末が最大になると思いますが、その時は、約何行(=何件)ありますか。
質問2)現在、完了までにどのくらいの時間がかかっていますか。(例 約10分等)
また、この程度なら我慢できるという時間は、どの程度ですか。(例 約1分等)
質問3)バックアップ処理()でも、同様の現象が発生してますか。
質問の趣旨は、バックアップ処理2()だけでなく、バックアップ処理()も対策が必要かという意味です。

処理時間の問題は、元データのデータ量が多いことが、原因ですが、
①案
現行方式のまま、転送方法を改善する。(あまり、効果は期待できない)
つまり、1月1日以降のデータをまるまるコピーする方法です。
現行だと1月末に1か月分のデータをコピーすることになる。
②案
バックアップ方法を変える。
前日と当日の差分のみをバックアップする。

上記の対策が考えられますが、とりあえず①案でいきます。
1案で改善されない場合、②案になりますが、その場合は、更にヒアリングが必要になります。
(どのようにデータが増え、どのようにバックアップするか等を詳細に詰める必要があります)
    • good
    • 1
この回答へのお礼

>作業完了するまでの時間とは、このバックアップ処理2の作業が完了するまでの時間と理解しました。
>幾つか質問がありますので補足ください。
→ご返信ありがとうございます。
 下記、回答させていただきます。

>質問1)1月末が最大になると思いますが、その時は、約何行(=何件)ありますか。
→5,000行ほどです。ただし、集計をしたい部署の分だけですとバックアップ処理()で処理をする件数(1,000~2,000前後)と同じくらいに
 なると思いますが、現状はすべてコピーして処理したいです。
 理由としましては、この部署だけ例外で部署限定してしまうと商品売上の集計が漏れてしまう可能性がある為です。
 
>質問2)現在、完了までにどのくらいの時間がかかっていますか。(例 約10分等)
→約15分ほど。
>また、この程度なら我慢できるという時間は、どの程度ですか。(例 約1分等)
→5分ほど。
>質問3)バックアップ処理()でも、同様の現象が発生してますか。
→バックアップ処理()は5分以内には完了していますので支障はありません。
>質問の趣旨は、バックアップ処理2()だけでなく、バックアップ処理()も対策が必要かという意味です。

>処理時間の問題は、元データのデータ量が多いことが、原因ですが、
①案
現行方式のまま、転送方法を改善する。(あまり、効果は期待できない)
つまり、1月1日以降のデータをまるまるコピーする方法です。
現行だと1月末に1か月分のデータをコピーすることになる。
②案
バックアップ方法を変える。
前日と当日の差分のみをバックアップする。

>上記の対策が考えられますが、とりあえず①案でいきます。
1案で改善されない場合、②案になりますが、その場合は、更にヒアリングが必要になります。
(どのようにデータが増え、どのようにバックアップするか等を詳細に詰める必要があります)
→承知いたしました。
 ただ、②になりますと、前日の数値が修正が入って変わっていることもある為
 できれば①のまますべてコピーする方法で集計時間が短縮できればと思っております。
 お手数をおかけしている上に無理を申し上げて大変恐縮ではございますが
 何卒よろしくお願いいたします。

お礼日時:2017/02/01 16:12

>もし、もう一度ご教授頂けるようでしたらG列が日付の場合のモジュールを再度ご教授頂ければ幸いです。


元データ G列が日付
集計先 L列が日付 で作成しなおしました。
前回のバックアップ処理2()を全てこちらで置き換えてください。
-----------------------------------------------------
Public Sub バックアップ処理2()
Dim sh1 As Worksheet 'データシート
Dim sh2 As Worksheet 'バックアップシート
Dim sh As Worksheet '管理シート
Dim dataFolder As String '元データフォルダ
Dim dataFile As String '元データファイル
Dim dataSheet As String '元データシート
Dim myBook As String 'バックアップブック名
Dim backSheet As String 'バックアップシート
Dim fullpath As String '元データシートのフルパス
Dim maxRow1 As Long 'データシート最大行
Dim row1 As Long 'データシート行
Dim row2 As Long 'バックアップシート行
Dim yyyy As Long '年
Dim mm As Long '月
Dim rg1 As String 'データシートレンジ
Dim rg2 As String 'バックアップシートレンジ
If MsgBox("バックアップを開始します", vbOKCancel) = vbCancel Then Exit Sub
myBook = ThisWorkbook.Name
Set sh = Worksheets("管理")
dataFolder = sh.Cells(2, "A").Value
dataFile = sh.Cells(2, "B").Value & ".xlsx"
dataSheet = sh.Cells(2, "C").Value
backSheet = sh.Cells(2, "D").Value
If ExistsWorkSheet(backSheet) = False Then
MsgBox (backSheet & "は存在しません")
Exit Sub
End If
If Dir(dataFolder, vbDirectory) = "" Then
MsgBox (dataFolder & "は存在しません。")
Exit Sub
End If
fullpath = dataFolder & "\" & dataFile
If Dir(fullpath) = "" Then
MsgBox (fullpath & "は存在しません。")
Exit Sub
End If
Workbooks.Open fullpath
Workbooks(dataFile).Activate
If ExistsWorkSheet(dataSheet) = False Then
MsgBox (dataFile & "中に" & dataSheet & "は存在しません")
Workbooks(dataFile).Close
Exit Sub
End If
Set sh1 = Worksheets(dataSheet) '元データシート
maxRow1 = sh1.Cells(Rows.count, 1).End(xlUp).row '元データシートの最大行取得
If maxRow1 < 2 Then
MsgBox (dataSheet & "にデータなし")
Workbooks(dataFile).Close
Exit Sub
End If
yyyy = year(sh1.Cells(2, "G").Value) 'データの年を取得
mm = month(sh1.Cells(2, "G").Value) 'データの月を取得
'バックアップシートの書き込み開始位置を検索する
Workbooks(myBook).Activate
Set sh2 = Worksheets(backSheet) 'バックアップシート
For row2 = 2 To Rows.count
If sh2.Cells(row2, "L") = "" Then Exit For
If year(sh2.Cells(row2, "L")) = yyyy And month(sh2.Cells(row2, "L")) = mm Then Exit For
Next
sh2.Activate
sh2.Range("L" & row2).Activate
If MsgBox(backSheet & "の" & row2 & "行以降へ書き込みます", vbOKCancel) = vbCancel Then
Workbooks(dataFile).Close
Exit Sub
End If
Application.ScreenUpdating = False
'データをバックアップシートへコピーする
For row1 = 2 To maxRow1
rg1 = "A" & row1 & ":R" & row1
rg2 = "F" & row2
Workbooks(dataFile).Worksheets(dataSheet).Range(rg1).Copy Workbooks(myBook).Worksheets(backSheet).Range(rg2)
row2 = row2 + 1
Next
Workbooks(dataFile).Close
Application.ScreenUpdating = True
MsgBox ("バックアップ処理完了 処理件数=" & maxRow1 - 2 + 1)
End Sub
---------------------------------------
    • good
    • 1
この回答へのお礼

再度ご教授いただきましてありがとうございます。
お忙しい中、何度もお手数をおかけして申し訳ありませんでした。
無事、エラーがでずに作業を進めることができました。
本当にありがとうございます。

それから、何度も申し訳ありませn。
もう一つ可能でしたらご教授いただきたいのですが
この元データがかなり重く、作業完了するまでにかなり時間がかかってしまうのですが
何か軽減するモジュールはありますでしょうか?

お礼日時:2017/02/01 13:48

No13の依頼ですが、訂正します。

(No13は無視してください)
以下の行を
yyyy = year(sh1.Cells(2, "L").Value) 'データの年を取得・・・①
①の直前に追加して、実行してください。

MsgBox ("ファイル=" & fullpath & vbLf & "シート=" & dataSheet & vbLf & "L2.VALUE=<" & sh1.Cells(2, "L").Value & ">" & vbLf & "L2.TEXT=<" & sh1.Cells(2, "L").Text & ">")
yyyy = year(sh1.Cells(2, "L").Value) 'データの年を取得・・・・①
のようになります。

ファイル名、シート名、L2の値(2017/1/1)、L2の表示上の値(1月1日)
が表示されます。
全て正しい値でしょうか。確認をお願いいたします。
    • good
    • 1
この回答へのお礼

ご返信が遅れてしまい、申し訳ございません。
また、お忙しい中何度もお手数をおかけして申し訳ございません。
そして再度見直して、実行してみて気づいたことがあり。。。お詫びがございます。

>○元データファイル
>ファイル名、シート名ともに「実績0123」です。
>A列からR列まであります。
>日付はL列(見出しは納入日付)です。
>すべてのデータをコピペしたいです。
→そもそも私がはじめにお伝えした内容が間違っていたことに気づきました。
 元データの日付はL列ではなくG列でした。本当に申し訳ございません。
 本当になんとお詫びしたらよいか・・・。

もし、もう一度ご教授頂けるようでしたらG列が日付の場合のモジュールを再度ご教授頂ければ幸いです。
急ぎではありませんのでお時間ある時で結構でございます。
お手数をおかけして申し訳ありませんが、何卒よろしくお願いいたします。

お礼日時:2017/02/01 11:11

実行時エラー:13


型が一致しません。
のエラーですが、L2の内容が日付でない("abc"等)場合に発生します。

こちらで確認したかぎりでは、L2が不正としか考えられませんでした。
お手数ですが、以下の2行を
yyyy = year(sh1.Cells(2, "L").Value) 'データの年を取得
の直前に追加して、その後、実行していただけませんでしょうか。(L2の内容を直接表示します)
MsgBox (sh1.Cells(2, "L").Value)
MsgBox (sh1.Cells(2, "L").Text)
yyyy = year(sh1.Cells(2, "L").Value) 'データの年を取得
のようになります。
最初に 2017/1/1 が表示され
次に 1月1日 が表示されれば正しいセルになります。
    • good
    • 0

詳細情報ありがとうございました。



本当に念の為、確認ですが、参照しているブック、シート名が違っていたということはないですね。
「管理」シートの
B2:ブック名
C2:シート名
のL2のセルが1月1日になっていますか。

これから、ブック名、シート名のセルの内容に誤りがない前提で、確認作業に入ります。
もし、ブック名、シート名のセルの内容等で誤りに気付いた場合は、その旨、補足ください。

これから、エラーの再現及び原因調査を行います。
本日中の回答は難しいと思いますので、一旦打ち切ります。
    • good
    • 1

>おっしゃる通り、2017/1/1で表示されておりますので


>問題なしということですよね?
>何度試してもやはりそこのエラーが出てしまいます。。。

すみません。日付が正しいとすると、私の想定外のエラーかもしれません。
エラーメッセージは、なんと表示されていますか?

文字でエラーメッセージを提示していただくか、画像で提示していただけませんでしょうか。
この回答への補足あり
    • good
    • 1
この回答へのお礼

何度も申し訳ありません。
エラー画像添付いたします。

お礼日時:2017/01/30 17:01

③>yyyy = Year(sh1.Cells(2, "L").Value) 'データの年を取得


→この部分にエラーがでます。
>>元データのL列が日付のはずですが、L2のセルが日付になっていません。L2のセルを見直してください。
→こちらについてですが、元データの日付が1月1日表記になっていることが原因でしょうか?

元データの日付が1月1日表記になっていることが原因でしょうか?
表記上1月1日なら問題ありません。
そのセル(L2)をクリックした時、fxが表示されている欄に 2017/1/1の日付が表示されれば問題ありません。(添付図の黄色部分参照)
もし、表示されなければ("1月1日"の文字が格納されているなら)問題ありです。
もう一度、確認をお願いします。
「【マクロ】元データを別ファイルへコピペ&」の回答画像10
    • good
    • 1
この回答へのお礼

うーん・・・

何度もお手数をおかけしております。
おっしゃる通り、2017/1/1で表示されておりますので
問題なしということですよね?
何度試してもやはりそこのエラーが出てしまいます。。。

お礼日時:2017/01/30 16:50

>原因は何が考えられますか?


以下回答です。
以下、エラーの発生する順に回答します。
エラー発生時は、一旦マクロを終了(リセット)し、オープン中のexcelファイルがあれば、
全て閉じてから、マクロを再度実行してください。(マクロのあるexcelは閉じなくて良いです)
①>Workbooks.Open fullpath
→この部分にエラーがでます。
既にオープンされている可能性があります。
(手動でオープンかまたは前回マクロを途中で止めたままで終了するとオープンされた状態になります)
もし、上記いがいなら、アクセス権がないことが考えられますが、たぶんこのケースではないと思われます。

②>Workbooks(dataFile).Activate
>If ExistsWorkSheet(dataSheet) = False Then
>MsgBox (dataFile & "中に" & dataSheet & "は存在しません")
①で正常終了していれば、ここではエラーにならないはずです。
①のあとで、強引に実行したと思われます。

③>yyyy = Year(sh1.Cells(2, "L").Value) 'データの年を取得
→この部分にエラーがでます。
元データのL列が日付のはずですが、L2のセルが日付になっていません。L2のセルを見直してください。
    • good
    • 1
この回答へのお礼

ご返信ありがとうございます。
何度も申し訳ありません、下記追加で質問です。

③>yyyy = Year(sh1.Cells(2, "L").Value) 'データの年を取得
→この部分にエラーがでます。
>>元データのL列が日付のはずですが、L2のセルが日付になっていません。L2のセルを見直してください。
→こちらについてですが、元データの日付が1月1日表記になっていることが原因でしょうか?

以下、解決済みです。
>原因は何が考えられますか?
以下回答です。
以下、エラーの発生する順に回答します。
エラー発生時は、一旦マクロを終了(リセット)し、オープン中のexcelファイルがあれば、
全て閉じてから、マクロを再度実行してください。(マクロのあるexcelは閉じなくて良いです)
①>Workbooks.Open fullpath
→この部分にエラーがでます。
既にオープンされている可能性があります。
(手動でオープンかまたは前回マクロを途中で止めたままで終了するとオープンされた状態になります)
もし、上記いがいなら、アクセス権がないことが考えられますが、たぶんこのケースではないと思われます。
→こちらについては、いったん開いたファイルを閉じて再度マクロを実行してからは
 でなくなりました。

②>Workbooks(dataFile).Activate
>If ExistsWorkSheet(dataSheet) = False Then
>MsgBox (dataFile & "中に" & dataSheet & "は存在しません")
>>①で正常終了していれば、ここではエラーにならないはずです。
>>①のあとで、強引に実行したと思われます。
→こちらについては問題ありませんでした。失礼いたしました。

お礼日時:2017/01/30 16:15

下記の要望の回答です。


>○元データファイル
>ファイル名、シート名ともに「実績0123」です。
>A列からR列まであります。
>日付はL列(見出しは納入日付)です。
>すべてのデータをコピペしたいです。
>○集計先
>A列からE列まで作業列がある為、F列からへデータを貼り付けたいです。

集計先はQ列が日付になります。
以下のモジュールを追加してください。(No7を基に作成してあります)
-------------------------------------------------------------
Public Sub バックアップ処理2()
Dim sh1 As Worksheet 'データシート
Dim sh2 As Worksheet 'バックアップシート
Dim sh As Worksheet '管理シート
Dim dataFolder As String '元データフォルダ
Dim dataFile As String '元データファイル
Dim dataSheet As String '元データシート
Dim myBook As String 'バックアップブック名
Dim backSheet As String 'バックアップシート
Dim fullpath As String '元データシートのフルパス
Dim maxRow1 As Long 'データシート最大行
Dim row1 As Long 'データシート行
Dim row2 As Long 'バックアップシート行
Dim yyyy As Long '年
Dim mm As Long '月
Dim rg1 As String 'データシートレンジ
Dim rg2 As String 'バックアップシートレンジ
If MsgBox("バックアップを開始します", vbOKCancel) = vbCancel Then Exit Sub
myBook = ThisWorkbook.Name
Set sh = Worksheets("管理")
dataFolder = sh.Cells(2, "A").Value
dataFile = sh.Cells(2, "B").Value & ".xlsx"
dataSheet = sh.Cells(2, "C").Value
backSheet = sh.Cells(2, "D").Value
If ExistsWorkSheet(backSheet) = False Then
MsgBox (backSheet & "は存在しません")
Exit Sub
End If
If Dir(dataFolder, vbDirectory) = "" Then
MsgBox (dataFolder & "は存在しません。")
Exit Sub
End If
fullpath = dataFolder & "\" & dataFile
If Dir(fullpath) = "" Then
MsgBox (fullpath & "は存在しません。")
Exit Sub
End If
Workbooks.Open fullpath
Workbooks(dataFile).Activate
If ExistsWorkSheet(dataSheet) = False Then
MsgBox (dataFile & "中に" & dataSheet & "は存在しません")
Workbooks(dataFile).Close
Exit Sub
End If
Set sh1 = Worksheets(dataSheet) '元データシート
maxRow1 = sh1.Cells(Rows.count, 1).End(xlUp).row '元データシートの最大行取得
If maxRow1 < 2 Then
MsgBox (dataSheet & "にデータなし")
Workbooks(dataFile).Close
Exit Sub
End If
yyyy = year(sh1.Cells(2, "L").Value) 'データの年を取得
mm = month(sh1.Cells(2, "L").Value) 'データの月を取得
'バックアップシートの書き込み開始位置を検索する
Workbooks(myBook).Activate
Set sh2 = Worksheets(backSheet) 'バックアップシート
For row2 = 2 To Rows.count
If sh2.Cells(row2, "L") = "" Then Exit For
If year(sh2.Cells(row2, "Q")) = yyyy And month(sh2.Cells(row2, "Q")) = mm Then Exit For
Next
sh2.Activate
sh2.Range("Q" & row2).Activate
If MsgBox(backSheet & "の" & row2 & "行以降へ書き込みます", vbOKCancel) = vbCancel Then
Workbooks(dataFile).Close
Exit Sub
End If
Application.ScreenUpdating = False
'データをバックアップシートへコピーする
For row1 = 2 To maxRow1
rg1 = "A" & row1 & ":R" & row1
rg2 = "F" & row2
Workbooks(dataFile).Worksheets(dataSheet).Range(rg1).Copy Workbooks(myBook).Worksheets(backSheet).Range(rg2)
row2 = row2 + 1
Next
Workbooks(dataFile).Close
Application.ScreenUpdating = True
MsgBox ("バックアップ処理完了 処理件数=" & maxRow1 - 2 + 1)
End Sub
------------------------------------
もし、このマクロをNo7のマクロと異なるブックに格納する場合は、
NO7の下記プロシージャもコピーして一緒に格納してください。
'ワークシートの存在チェック
Public Function ExistsWorkSheet(ByVal sheetName As String) As Boolean

不明点、不備がありましたら補足ください。
    • good
    • 1
この回答へのお礼

早々にご教授いただきありがとうございます。

下記のモジュール追加しました。
'ワークシートの存在チェック
Public Function ExistsWorkSheet(ByVal sheetName As String) As Boolean
Dim ws As Worksheet
ExistsWorkSheet = False
For Each ws In Worksheets
If UCase(ws.Name) = UCase(sheetName) Then
ExistsWorkSheet = True
Exit Function
End If
Next ws
End Function

また、マクロを実行すると下記エラーが出てしまいます。

>yyyy = Year(sh1.Cells(2, "L").Value) 'データの年を取得
→この部分にエラーがでます。

>Workbooks.Open fullpath
→この部分にエラーがでます。
>Workbooks(dataFile).Activate
>If ExistsWorkSheet(dataSheet) = False Then
>MsgBox (dataFile & "中に" & dataSheet & "は存在しません")

原因は何が考えられますか?

お礼日時:2017/01/30 13:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!