• 締切済み

エクセル 日報売上を月報売上に日付をキーにして反映

エクセル 日報売上を月報に展開するマクロで困っております。 準備するシート (1)日報入力シート (2)月報売上シート 日報入力シートに作ったボタンを押すとB3の日付(今日)と月報売上シートA列の2~31に用意された日付(1ヶ月分)を参照する 一致した場所(B列~D列)に 入力シート B7:D7のデータを貼り付ける作業を考えております。 以下は過去の事例を参考にさせて頂きました。日付が横軸ですが、目的は縦軸です。 日報入力は1回のみですので、重複はなく1行ずらす処理は必要ありません。 ご教示頂けば助かります。 よろしくお願い致します。 Sub ボタン1_Click() Dim FRng As Range Dim Rw As Long With Sheets("月報売上シート") If Range("B3").Value = "" Then MsgBox "入力日を記入してください。", vbExclamation Exit Sub End If Set FRng = .Rows(1).Find(Range("B3").Value, lookat:=xlWhole) If Not FRng Is Nothing Then Rw = .Cells(Rows.Count, FRng.Column).End(xlUp).Row If Rw < 3 Then Rw = 3 Else Rw = Rw + 1 .Cells(Rw, FRng.Column).Resize(, 3).Value = Range("B7:D7").Value Else MsgBox "転記先日付が 見つかりません。", vbCritical Exit Sub End If End With Set FRng = Nothing MsgBox "転記しました。", vbInformation, "完了" End Sub

みんなの回答

  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.2

方法は色々あると思いますが、日付を検索する必要性はあるのでしょうか? 月報のA2が1日と決まっているのですから、日報の日付の日付だけ1日に変換した変数が一致した場合はデータを入力させる。 データを入力させる行は売上日に日付+1行目となります。 月報の日付はマクロで作成する事とすれば日付が間違える事はありませんよね。 日報のデータは7行目で無く6行目ですよね。 下記は修正案の一例です。 Sub ボタン1_Click() Dim FRng As Range Dim Rw As Long Dim mydate As Date Dim ws As Worksheet Dim myday As Integer Set ws = Sheets("月報売上シート") With Sheets("日報入力シート") If .Range("B3").Value = "" Then MsgBox "入力日を記入してください。", vbExclamation Exit Sub End If mydate = DateSerial(Year(.Range("B3")), Month(.Range("B3")), 1) myday = Day(.Range("B3")) If mydate = ws.Range("A2") Then ws.Cells(myday + 1, 2).Resize(, 3).Value = .Range("B6:D6").Value Else MsgBox "転記先日付が 見つかりません。", vbCritical Exit Sub End If End With MsgBox "転記しました。", vbInformation, "完了" End Sub

nezumisansan
質問者

補足

dogs_catsさん、 kagakusuki さん 早速にご返答ありがとうございました。 月報売上シートのカレンダーはマクロで作成するのではなく、 関数を利用し、任意のセルに年と月を入力すると、 A列に日付(標準の数値) B列に曜日(関数式) が入る万年カレンダーを作成しようと考えております。 よってA列の数値を参照させたいと思います。 その場合の変更はどのようになりますでしょうか? お手数おかけしますがよろしくお願い致します。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 日付データはFindメソッドとの相性が悪いため、日付を検索する事は出来ないと思います。  ですから以下の様に、日付けのシリアル値を整数値に変換した値をMach関数で検索する様なマクロにされては如何でしょうか? Sub QNo9083059_エクセル_日報売上を月報売上に日付をキーにして反映() Const OutputSheetName = "月報売上シート" Const DateCell = "B3" Dim OutputSheet As Worksheet, temp If IsError(Evaluate("ROW('" & OutputSheetName & "'!A1)")) Then MsgBox "データの転記先のシートとして設定されている" _ & vbCrLf & vbCrLf & OutputSheetName & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set OutputSheet = Sheets(OutputSheetName) temp = Range(DateCell).Value If temp < 1 Or Not IsDate(temp) Then MsgBox DateCell & "セルに日付が入力されていません。" _ & vbCrLf & "マクロの実行を一旦中止しますので、" & DateCell & _ "セルに日付を入力してから、再度マクロの実行ボタンをクリックし直して下さい。" _ , vbExclamation, "日付未指定" Exit Sub End If If WorksheetFunction.CountIf(OutputSheet.Columns("A:A"), temp) = 0 Then MsgBox "指定された日付" & vbCrLf & vbCrLf & temp & vbCrLf & vbCrLf _ & "に該当する行が見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "該当する日付なし" Exit Sub End If OutputSheet.Range("B" & WorksheetFunction.Match(CLng(temp), _ OutputSheet.Range("A:A"), 0)).Resize(1, 3).Value = Range("B6:D6").Value MsgBox "転記しました。", vbInformation, "完了" End Sub

関連するQ&A

  • Excelで日報から月報へとデータ参照をさせたい。

    現在、Excelで日報を作成しています。 日報に入力したデータが、既存の月報へ反映されるようにしたいのですが、 なかなかうまくいきません。 既存の月報は、1ヶ月分をひとつのブックとし、 その中に各従業員の名前のシートを作成し、保存しています。 今回新たに作成しようとしている日報は、 やはり1ヶ月分をひとつのブックとし、 その中に1~31日のシートを作成し、保存したいと思っています。 今までは、月報しかなかったため、 従業員一人ひとりのシートにデータを入力していたのですが、 これからは1日の終わりに、 日報にデータを入力し、 それを月報に反映する事が出来れば 少しでも効率的になるため、そのように出来れば…と考えています。 添付画像の例では、 【平成25年11月 日報.xlsx】ブックの [1日] シートの、 B4~C6に入力したデータを、 【平成25年11月 月報.xlsx】ブックの [鈴木] [佐藤] [田中] の各シートの、 11/1(金)に、対応するセル(C4~D4)へと反映したいです。 ですが、日報も月報もシート数が多いため (添付画像の例はシート数を省略しています)、 今後、毎月同じように1ヶ月分のブックを作成していく事を考えると、 どのような参照の仕方や作成の仕方をすれば良いのかわからず、 途方に暮れています。 Excelに詳しくないため、 なるべくわかりやすくお教えいただけると幸いです。 大変お手数をお掛け致します。 Excelに詳しい方、どうかご教示くださいますようお願い致します。

  • エクセルで日付と時間を自動入力する

    エクセルでF13~P13に何か入力したら、その下のセルの F14~P14に日付と時間が自動入力される という質問、回答を見つけました。 これで日付を削除するかどうかのメッセージボックスを出さずに 入力するセルのデータを削除した時に日付も削除するには どの部分を削除すれば良いですか? Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim mRng As Range Application.EnableEvents = False For Each mRng In Target If Not Intersect(mRng, Range("F13:P13")) Is Nothing Then If mRng.Value = "" Then If MsgBox("日付も削除しますか?", vbYesNo + vbDefaultButton2) = vbYes Then mRng.Offset(1, 0).Value = "" End If Else mRng.Offset(1, 0).Value = Format(Now, "yyyy/mm/dd"" ""hh:mm:ss") End If End If Next mRng Application.EnableEvents = True End Sub

  • 転記の仕方

    Sub 入力する() If AIRシート.Range("A1").Value = "A" Then Dim AIRシート最終行 As Long AIRシート最終行 = AIRシート.Range("A65536").End(xlUp).Row + 1 If AIRシート最終行 = 30 Then MsgBox "AIRシートがいっぱいです " Exit Sub Else End If AIRシート.Range("A" & AIRシート最終行).Value = 入力シート.Range("A1").Value AIRシート.Range("B" & AIRシート最終行).Value = 入力シート.Range("B1").Value MsgBox "入力完了" Else End If End Sub ●質問● 今、"入力シート"のA1に『A』と入力しマクロを実行すると"AIRシート"のA列、B列に入力シートのA1、B1の値が次々と転記されるようにしてるのですが、これを入力シートのA1だけではなく、A1~A3まで入力することが出来、実行すると全てが転記できるようにしたいのですが。 ※A2,A3は入力しないときもあります。 If AIRシート.Range("A1").Value = "A" Then           ↓          ("A1:A3") みたいな感じでです。

  • 日報のデータを月報へ

    sheet1からsheet10には1sheet1日の、日報データを,sheet11は1行1日で 日報データを記録して、月報としています。 sheet1のセルA2にデータを入れると同時にsheet11のセルD6に入力、sheet2のA2に入れるとsheet11のD7に入力したいのです、 どのように設定のか教えてください。

  • DTPickerで入力したらの検索が出来なくなりました。

    お世話になります。 質問ですが 以下のVBAコードがあります。Sheet3のCells(2, 6)に記入した日付によってSheet1の検索を一部行うのですが、Cells(2, 6)への入力をDTPickerを使って行うようにしたら該当する日付がありませんのエラーが帰ってきます。たぶん書式が違うせいかなと思うのですがどうすればいいのでしょうか? どなたか分かる方いらっしゃいますか?よろしくお願いします。  Private Sub CommandButton1_Click() Dim trgA As Variant, trgB As Variant With Worksheets("Sheet3") If IsEmpty(.Cells(2, 7)) Then MsgBox "個数が空です。", vbCritical: Exit Sub '日付 trgA = Application.Match(.Cells(2, 6).Value2, Worksheets("Sheet1").Range("A:A"), 0) If IsError(trgA) Then MsgBox "該当する日付がありません。", vbCritical: Exit Sub '製品名 trgB = Application.Match(.Cells(2, 4).Value, Worksheets("Sheet1").Range("2:2"), 0) If IsError(trgB) Then MsgBox "該当する製品名がありません。", vbCritical: Exit Sub If Worksheets("Sheet1").Cells(trgA, trgB + 1).Value = "" Then Worksheets("Sheet1").Cells(trgA, trgB + 1).Value = .Cells(2, 7).Value Else If MsgBox("上書きしますか", vbQuestion + vbOKCancel) = vbOK Then Worksheets("Sheet1").Cells(trgA, trgB + 1).Value = .Cells(2, 7).Value End If End If End With End Sub

  • 印刷後のVBAの実行 (3)

    Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "Sheet1" Then If Range("D6").Value = "" Then Cancel = True MsgBox ("名前を入力してください") Range("D6").Select Exit Sub End If Else If ActiveSheet.Name = "Sheet2" Then If Range("C11").Value = "" Then Cancel = True MsgBox ("受付時間を入力してください") Range("C11").Select Exit Sub End If Else Exit Sub End If End If If Worksheets("Sheet1").Range("D5") = "不要" Then GoTo P1 ActiveSheet.Range("A70:Y70").Copy If Worksheets("Sheet3").Range("A1").Value = "" Then Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues Else Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _ Paste:=xlPasteValues End If Application.CutCopyMode = False P1: ActiveSheet.Range("A1").Select End Sub sheet1のD5に「不要」と入っていたら 24~33行目の作業がキャンセルになりますが sheet2のD5にも「不要」と入っていたら、同じ様にキャンセルできる様に出来ますでしょうか? ご回答お願いします

  • Excel VBA 日付の認識など

    こんにちは。 VBA初心者のものですが質問させていただきます。 ※エクセル2003です 「sheet1のD4:FA4のうち、09年8月以外の日付のセルすべてを選択する」 の構文を下記のように作ってみたのですがうまくいきません・・・ (1)「09年8月」の認識 (2)「~以外のセル全て選択」 の2点がネックで困っています。 ちなみに日付のセルには「2009/8/5」のように入力されており、 表示は「09/8/5」です。 すみませんがご教示お願いいたします。 Sub Macro1() Dim 日付 As Range For Each 日付 In Worksheets("sheet1").Range("D4:FA4") If 日付.Value like"*09/8/*"= false Then 日付.select End If Next End Sub

  • エクセル 数値結果の値によって日付を入れたい

    シート2の2列目にOKが入ると、シート1のC列にOKが入り、更新された日がB列に表示されるようにしたいです。 C列に手入力でOKと入力すればB列に日付が表示されるのですが、C列をVLOOKで呼ぶようにしたら表示されなくなってしまいました。 どのように修正していいのか分かりません。 お教えいただければと思います。よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim TgRng As Range Set TgRng = Intersect(Range("C1:C2000"), Target) If Not TgRng Is Nothing Then Application.EnableEvents = False For Each Rng In TgRng If Rng.Value = "OK" Then Rng.Offset(, -1).Value = Date End If Next Application.EnableEvents = True End If Set TgRng = Nothing End Sub

  • 印刷後のVBAの実行 (2)

    Private Sub Workbook_BeforePrint(Cancel As Boolean)   If ActiveSheet.Name = "Sheet1" Then     If Range("D6").Value = "" Then       Cancel = True       MsgBox ("名前を入力してください")       Range("D6").Select       Exit Sub     End If   Else     If ActiveSheet.Name = "Sheet2" Then       If Range("C11").Value = "" Then         Cancel = True         MsgBox ("受付時間を入力してください")         Range("C11").Select         Exit Sub       End If     Else              Exit Sub     End If   End If   ActiveSheet.Range("A70:Y70").Copy   If Worksheets("Sheet3").Range("A1").Value = "" Then     Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues   Else     Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _       Paste:=xlPasteValues   End If   Application.CutCopyMode = False   ActiveSheet.Range("A1").Select End Sub 先日、上記のコードを回答者の方から教えてもらい、とても助かっていますが sheet1のD5に「不要」という文字が入っていた場合、 sheet3への貼り付け(23~30行目の作業)をキャンセルして、最後にsheet1のA1を選択するようにはどの様にしたらいいでしょうか?

  • エクセルのマクロを利用して

    マクロ初心者でです。 いろんなサイトから引用させて頂き次のようなマクロを作成しました。 実行すると、日付と担当者氏名(A1)がファイル名となるものです。 そこで教えて頂きたいのですが、実行すると保存先がマイドキュメントに なるのですが、これを例えば「C:\日報」というフォルダが指定されるようにしたいのですが、 自分なりに、いろいろ試したのですが全くできません。 宜しくお願い致します。 Sub 名前をつけて保存() Dim SaveFileName As String, re As Variant With Sheets("sheet1").Range("A1") If .Value = "" Then MsgBox "名前が入力されていません", vbExclamation Exit Sub Else SaveFileName = Format(Now, "yyyymmdd") & "_" & .Value End If End With re = Application.GetSaveAsFilename(SaveFileName) If re = False Then MsgBox "保存を中止しました", vbExclamation Else MsgBox "日報をを保存しました", vbInformation End If End Sub

専門家に質問してみよう