
とある入力用シートをまとめて別シートに全て毎回手で入力しているのですが、
入力したデータを別シートの雛形に蓄積するという方法はありますでしょうか。
コピペというのも考えましたが、入力用シート自体はシートごとで保存していたら
膨大な量になってしまうので上書きで作成しているためコピペが出来ません。
例えば、
入力用シートにA22〜F22(日付や数・単価・金額(金額は数式入っています))を入力したら
蓄積用シートのA22〜F22にデータが反映され、
それが新たに入力用シートの同じ箇所(A22〜F22)に入力しても
蓄積用シートのA22〜F22以降の行に反映し蓄積出来るようにしたいです。
また、月ごとに蓄積用シートを変えれれば尚良いと思っています。
調べていたら関数では出来ないとのこと&今まで同様の質問をされていた内容を試して見たが出来なかったです。
マクロに挑戦してみようと思うのですが、全くの初心者です。
エクセルのバージョンは2016です。
方法がなければ諦めます。方法があればお教えください。
よろしくおねがいします。
No.8
- 回答日時:
こんなものはいかがでしょうか?
① 印刷が終わると「データの転記とクリアを行いますか?」の確認が有ります「はい」ボタンを押すと先に進みます。「いいえ」ボタンを押すとキャンセルになり何もしないで終了します(印刷プレビューでの誤動作の後処理用)
② 現在存在するシートの名前を辞書に登録
③ 入力用シートの22行目からのA列の日付を基に年月(シート名)を作成
④ ③で作成したものが辞書に無かったら、辞書に登録後、シートを追加しシート名を年月に変える、入力用シートをコピぺして22行目以降のA~F列をクリア成しておきます(22行目以降のA~F列以外は書式を含めて残ります)
⑤ ③~④を最後まで繰り返します(これで必要なシートが揃います)
⑥ 一度辞書をクリアします
⑦ 入力用シートの22行目からのA列の日付を基に年月(シート名)を作成(データにあるシート名だけのリストを作成します)
⑧ ⑦で作成したものが辞書に無かったら、年月日シートに入力用シートの22行目以降のA~F列を追加コピーします。年月と合わない行のA~Fのデータをクリア、あっている場合は念のためF列を再計算しておき、22行目以降をA列を基にソートを行い、その後不要な部分を削除します。
⑨ ⑦~⑧を最後まで繰り返します。
⑩ 入力用シートのデータをクリアします。(保存データ重複防止です)
--------------------------------------------------------------------------------------
☆「入力用」へ (注:①)
これでD列とE列に何か入力されるとF列に計算式がセットされるようになります。
--------------------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row >= 22 Then
If Target.Column >= 4 Then
If Target.Column <= 5 Then
Application.EnableEvents = False
Cells(Target.Row, 6).FormulaR1C1 = "=RC[-2]*RC[-1]"
Application.EnableEvents = True
End If
End If
End If
End Sub
--------------------------------------------------------------------------------------
☆「ThisWorkbook」へ (注:②)
これで印刷開始後「転記」のマクロが起動します
--------------------------------------------------------------------------------------
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Application.OnTime Now(), "転記"
End Sub
--------------------------------------------------------------------------------------
☆「標準モジュール」へ (注:③)
--------------------------------------------------------------------------------------
Sub 転記()
Const 元シート名 As String = "入力用"
Dim シート辞書 As Object
Dim シート As Worksheet
Dim 終行番号 As Long
Dim 行番号 As Long
Dim 年月 As String
Dim 次行番号
Dim 次終行番号
If MsgBox("データの転記とクリアを行いますか?", vbDefaultButton2 + vbYesNo) <> vbYes Then Exit Sub
Sheets(元シート名).Select
終行番号 = Cells(Rows.Count, 1).End(xlUp).Row
If 終行番号 >= 22 Then
Set シート辞書 = CreateObject("Scripting.Dictionary")
For Each シート In Worksheets
シート辞書.Add シート.Name, "元"
Next
For 行番号 = 22 To 終行番号
年月 = Format(Cells(行番号, 1).Value, "yyyy_mm")
If Not シート辞書.Exists(年月) Then
シート辞書.Add 年月, "新"
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = 年月
Sheets("入力用").Cells.Copy
ActiveSheet.Paste
Range(Cells(22, 1), Cells(終行番号, 6)).ClearContents
Sheets(元シート名).Select
End If
Next
シート辞書.RemoveAll
For 行番号 = 22 To 終行番号
年月 = Format(Cells(行番号, 1).Value, "yyyy_mm")
If Not シート辞書.Exists(年月) Then
シート辞書.Add 年月, "有"
次行番号 = Sheets(年月).Cells(Rows.Count, 1).End(xlUp).Row + 1
If 次行番号 < 22 Then 次行番号 = 22
Range(Cells(22, 1), Cells(終行番号, 6)).Copy Sheets(年月).Cells(次行番号, 1)
Sheets(年月).Select
Do While IsDate(Cells(次行番号, 1).Value)
If 年月 <> Format(Cells(次行番号, 1).Value, "yyyy_mm") Then
Range(Cells(次行番号, 1), Cells(次行番号, 6)).ClearContents
End If
次行番号 = 次行番号 + 1
Loop
Range("A22:F" & 次行番号).Sort Key1:=Range("A22"), Order1:=xlAscending, Header:=xlNo
次行番号 = Cells(Rows.Count, 1).End(xlUp).Row
Rows(次行番号 & ":" & Rows.Count).Delete Shift:=xlUp
Cells(次行番号, 1).Select
Range("A1") = "請求書(蓄積用)"
次行番号 = ActiveSheet.UsedRange.Row
Sheets(元シート名).Select
End If
Next
Range(Cells(22, 1), Cells(終行番号, 6)).ClearContents
Range("A22").Select
次行番号 = ActiveSheet.UsedRange.Row
Set シート辞書 = Nothing
MsgBox ("終了しました")
Else
MsgBox ("データが有りませんでした")
End If
End Sub
--------------------------------------------------------------------------------------
※(注:)は、図を参照してください。
※ F列目には計算式が入っている可能性が有るため、行の最後の判断材料にならなかったのでA列を使用しています。
(日付が無いデータはどこのシートに転写して良いか判らないので削除してます)
※「Const …」の「=」の右側は環境に合わせて変更して下さい。

詳しくありがとうございます!!
初めてなので出来るかわからないですが、試してみます!
ご丁寧に何度もありがとうございます(T ^ T)!
No.7
- 回答日時:
No.5 のお礼について
③ 行の最後はF列で判断すれば良いという事でしょうか?またF列で「空行」の判断をしても良いですか?
④⑤ それでしたら印刷したタイミングでの転記の方が間違いないと思いますがいかがでしょうか?
⑥ 題名とはどこのセルに入っているのですか?もしかしたら印刷時のヘッダーでしょうか?
③ 行の最後はF列で判断すれば良いという事でしょうか?またF列で「空行」の判断をしても良いですか?
F列に金額の合計が書いてあるという感じです。
④⑤ それでしたら印刷したタイミングでの転記の方が間違いないと思いますがいかがでしょうか?
印刷のタイミングで転記で構いません!
⑥ 題名とはどこのセルに入っているのですか?もしかしたら印刷時のヘッダーでしょうか?
印刷時のヘッダーではなくA1(AからEの列がセルの統合されています。)です。
よろしくお願いいたします。
No.6
- 回答日時:
こんなものはいかがでしょうか?
① 現在存在するシートの名前を辞書に登録
② 入力用シートの22行目からのA列の日付を基に年月(シート名)を作成
③ ②で作成したものが辞書に無かったら入力用シートをコピーしてシート名を年月に変えて22行目以降のA~F列を削除して空シートを作成しておきます(22行目以降のA~F列以外は書式を含めて残ります)
④ ②~③を最後まで繰り返します(これで必要なシートが揃います)
⑤ 一度辞書をクリアします
⑥ 入力用シートの22行目からのA列の日付を基に年月(シート名)を作成
⑦ ⑥で作成したものが辞書に無かったら、年月日シートに入力用シートの22行目以降のA~F列をコピーします。年月と合わない行のA~Fのデータをクリア、あっている場合は念のためF列を再計算しておき、22行目以降をA列を基にソートを行い、その後不要な部分を削除します。
⑧ ⑥~⑦を最後まで繰り返します。
⑨ 入力用シートのデータをクリアします。(保存データ重複防止です)
Sub Sample()
Const 元シート名 As String = "入力用"
Dim シート辞書 As Object
Dim シート As Worksheet
Dim 終行番号 As Long
Dim 行番号 As Long
Dim 追行番号 As Long
Dim 年月 As String
Dim 次行番号 As Long
Dim 次終行番号 As Long
Sheets(元シート名).Select
終行番号 = Cells(Rows.Count, 1).End(xlUp).Row
If 終行番号 >= 22 Then
Set シート辞書 = CreateObject("Scripting.Dictionary")
For Each シート In Worksheets
シート辞書.Add シート.Name, "元"
Next
For 行番号 = 22 To 終行番号
年月 = Format(Cells(行番号, 1).Value, "yyyy_mm")
If Not シート辞書.Exists(年月) Then
シート辞書.Add 年月, "新"
Sheets(元シート名).Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = 年月
Range(Cells(22, 1), Cells(Rows.Count, 6)).Delete Shift:=xlUp
Sheets(元シート名).Select
End If
Next
シート辞書.RemoveAll
For 行番号 = 22 To 終行番号
年月 = Format(Cells(行番号, 1).Value, "yyyy_mm")
If Not シート辞書.Exists(年月) Then
シート辞書.Add 年月, "有"
次行番号 = Sheets(年月).Cells(Rows.Count, 1).End(xlUp).Row + 1
If 次行番号 < 22 Then 次行番号 = 22
Range(Cells(22, 1), Cells(終行番号, 6)).Copy Sheets(年月).Cells(次行番号, 1)
Sheets(年月).Select
次終行番号 = Cells(Rows.Count, 1).End(xlUp).Row
For 追行番号 = 次行番号 To 次終行番号
If 年月 = Format(Cells(追行番号, 1).Value, "yyyy_mm") Then
Cells(追行番号, 6).Value = Cells(追行番号, 4).Value * Cells(追行番号, 5).Value
Else
Range(Cells(追行番号, 1), Cells(追行番号, 6)).ClearContents
End If
Next
Range("A22:F" & 追行番号).Sort Key1:=Range("A22"), Order1:=xlAscending, Header:=xlNo
次行番号 = Cells(Rows.Count, 1).End(xlUp).Row + 1
Rows(次行番号 & ":" & Rows.Count).Delete Shift:=xlUp
Cells(次行番号, 1).Select
次行番号 = ActiveSheet.UsedRange.Row
Sheets(元シート名).Select
End If
Next
Range(Cells(22, 1), Cells(終行番号, 5)).ClearContents
Range("A22").Select
Set シート辞書 = Nothing
MsgBox ("終了しました")
Else
MsgBox ("データが有りませんでした")
End If
End Sub
※ シートは見つかった順に作成するので順番には並びません、必要ならば手動で入れ替えて下さい。
※ 自動では実行されません
※ 元シート名の「入力用」は状況に合わせて下さい。
※ 転送先のシート名は「yyyy_mm」にしています。
No.5
- 回答日時:
なんとなく理解しました。
22行目だけに入力されるわけではなく、その下の行に何行か入力していくわけですね?
(提案してしまったのは22行目にだけに入力して、入力したらすぐ転記してしまうものです)
改めての確認です。
① 何行目まで入力できるとかの制限はありますか?
② 途中入力しない(空行)は存在しますか?もしあった場合は飛ばせば良いのですか?
③ 必ず入力される列はどこですか?(全てならそう回答ください)
④ 転記するタイミングは「保存」処理をしたときで良いですか?
⑤ 転記したらクリアして良いですよね?(転記した物が重複されないように)
⑥ 転記先も22行目からとなっていますが、21行目までも1度目はコピーした方が良いのでしょうか?
⑦ 転送先のシート名は「yyyy_mm」で良いですか?
① 何行目まで入力できるとかの制限はありますか?
特に制限はありません。
② 途中入力しない(空行)は存在しますか?もしあった場合は飛ばせば良いのですか?
空行は存在しますが、飛ばせば大丈夫です。
③ 必ず入力される列はどこですか?(全てならそう回答ください)
F22〜F32あたりまでは入力します。
④ 転記するタイミングは「保存」処理をしたときで良いですか?
保存するタイミングで大丈夫です。
⑤ 転記したらクリアして良いですよね?(転記した物が重複されないように)
クリアする前に印刷をかけますが、印刷後はクリアで大丈夫です。
⑥ 転記先も22行目からとなっていますが、21行目までも1度目はコピーした方が良いのでしょうか?
コピーしますが、題名を納品書(入力用シート)→請求書(蓄積用)に変更したいです。
⑦ 転送先のシート名は「yyyy_mm」で良いですか?
大丈夫です。
No.4
- 回答日時:
No.3 に対する返答が無かったので図の様な物を考えました。
次のようにしてお試しでテストしてみて下さい。
新規にブックを作成してシートを「入力用」だけにして「○○.xlsm」で保存して下さい。
図を参考に他の書式などもここで設定しておいてください。
[Enter]後のセル移動は「右」にして下さい
ちなみに G22セルはボタン風に見せる為、灰色の背景色、右と下に太い罫線引いておきます。
(判りやすくしているだけなので必ずしもこうでなくても構いません)
ここまでで一度保存しておきます。
「入力用」シートの「Worksheet_SelectionChange」に次のコードをコピペして下さい
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$G$22" Then
If IsDate(Range("A22").Value) Then
Call 転写処理(Range("A22").Value)
End If
End If
End Sub
「標準モジュール」に次のコードをコピペして下さい
Sub 転写処理(日付 As Date)
Dim シート名 As String
Dim シート As Worksheet
Dim シート有 As Boolean
Dim 次行 As Long
シート名 = Format(日付, "yyyy_mm")
For Each シート In Worksheets
If シート.Name = シート名 Then シート有 = True
Next
If シート有 Then
Sheets(シート名).Select
Else
Worksheets.Add(After:=Worksheets(1)).Name = シート名
Sheets("入力用").Range("A21:F21").Copy Range("A1")
End If
次行 = Cells(Rows.Count, 1).End(xlUp).Row + 1
Sheets("入力用").Range("A22:F22").Copy
Cells(次行, 1).PasteSpecial Paste:=xlPasteAllUsingSourceTheme
Cells(次行, 1).PasteSpecial Paste:=xlPasteValues
Cells.EntireColumn.AutoFit
Sheets("入力用").Select
Range("A22:E22").ClearContents
Range("A22").Select
End Sub
ここで保存をして下さい。(後はご自由に…)
☆ 使い方
A22 ~ E22 まで入力し[Enter]キーで金額欄に移ります。
ここで入力に間違いがないか確認して下さい。
間違いが無ければ[Enter]キーで G22セルに移ると転写され A22~E22 がクリアされ A22 に移ります。
間違いが有った場合は修正後、数回[Enter]キーを押し G22セルまでもっていけば転写されます。
マウスなどの作業が不要でとても効率よいものになると思います。
(G22 セルを選択しても A22 セルに日付が無ければ転写は行われません)

No.3
- 回答日時:
幾つか確認させてください。
① 入力用シートですが、F列以降は何か入力されていますか?
② 多分ですが入力後右のセルに移るように設定されていると思いますが間違いないでしょうか?
③ 日付はどこに記入されていますか?
④ 計算式はどこに入っていますか?
⑤ 入力後クリアした方が使いやすいと思うのですが、クリアしない方が良いところはありますか?
No.2
- 回答日時:
こんばんは!
一例です。
標準モジュールにしてください。
Sub Sample1()
Dim myRow As Long
Dim wS As Worksheet
Set wS = Worksheets("蓄積用")
If wS.Cells(Rows.Count, "A").End(xlUp).Row < 22 Then
myRow = 22
Else
myRow = wS.Cells(Rows.Count, "A").End(xlUp).Row + 1
End If
With Worksheets("入力用").Range("A22").Resize(, 6)
.Copy
wS.Cells(myRow, "A").PasteSpecial Paste:=xlPasteValues
.SpecialCells(xlCellTypeConstants).ClearContents '//★//
End With
End Sub
※ 「入力用」シートのA22~F22を入力後マクロを実行してください。
※ 値の貼り付けにしていますので、「蓄積用」シートの日付列の表示形式は好みの表示形式にしておいてください。
※ 「入力用」シートのA22~F22のデータはコピー&ペースト後、
数式が入っていないセルを消去するようにしています。
そのままデータを残したい場合は「★」の行を削除してください。
>また、月ごとに蓄積用シートを変えれれば尚良いと思っています。
というコトですが同一ブック内に同一シート名を付けるコトはできませんので、
「蓄積用」シートのシート名を月によって変更する必要があります。m(_ _)m
No.1
- 回答日時:
ありがとうございます!内容を見てみたのですが、私の理想とちょっと違いましたが、違う業務で活かせると思うので知識として頭に入れておきます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
EXCELでシート1で作ったデータをシート2にデータを蓄積させたい
Excel(エクセル)
-
エクセルでデータを蓄積させるには?
Excel(エクセル)
-
エクセルで日毎のデータの蓄積
Excel(エクセル)
-
-
4
エクセルで「入力」と「蓄積」の簡単なデータベース
Excel(エクセル)
-
5
エクセルvbaで、別シートの最下行にデータを取り込むコードを教えてください。
Visual Basic(VBA)
-
6
ユーザーフォームに別シートからデータを反映させたい。
Visual Basic(VBA)
-
7
エクセルを利用して、日計と累計を毎日作成する方法
Excel(エクセル)
-
8
エクセルで別シート、または別ファイルに出力、蓄積保存する方法。 マクロなんかを活用してできないでしょ
Excel(エクセル)
-
9
VBA 別シートの同じ日付の欄に値を貼付け
Excel(エクセル)
-
10
別シートの最終行に貼り付けするマクロを教えてください。 シートYのE3からE15までをコピー シート
Excel(エクセル)
-
11
excelで、セル内に文字が入力される毎に行が自動挿入される仕組みを作りたいのですが…
Excel(エクセル)
-
12
特定セルの内容を更新したら、その更新日を自動的に表示する方法について
Excel(エクセル)
-
13
毎日の日計を別シートに自動で更新、反映させたい
PowerPoint(パワーポイント)
-
14
エクセルVBAでデータの蓄積方法?
Excel(エクセル)
-
15
Excelで日付変更ごとに、自動的にデータを転記
Excel(エクセル)
-
16
VBA別シートの最終行の次行へ転記したい。
Visual Basic(VBA)
-
17
A1セルに入力したら、入力時間をA2セルに自動挿入
Excel(エクセル)
-
18
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
19
☆Excelエクセルで入力した日の日付を表示したいです☆
Excel(エクセル)
-
20
VBA 数式を残して値をクリアについて
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAで、指定したシートに...
-
エクセルのワークシートが重く...
-
【Excel】VLOOKUP関数で複数の...
-
データを時系列で表示させたい
-
エクセルVBA:表の内容を担当者...
-
Excel 複数のシートからグラフ...
-
Excelの選択肢をポップアップリ...
-
excelでデータの集計
-
EXCELでシートごとの合計を一つ...
-
Excel ハイパーリンク先のセル...
-
IF, ISNUMBER, INDIRECTの組み...
-
エクセルで入力シートから別シ...
-
エクセル:複数シートのデータ...
-
Excelの中央値の複数条件について
-
指定した日付の範囲内でデータ...
-
エクセル 毎日更新する表のデ...
-
エクセル シフト勤務表から、...
-
エクセルにて別シートの値を参...
-
excel:行挿入までは参照できな...
-
エクセルで入力→日付を自動判別...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA セルの値と同じ名前のシー...
-
エクセルのワークシートが重く...
-
Excelの中央値の複数条件について
-
Excel ハイパーリンク先のセル...
-
ExcelVBAで、指定したシートに...
-
IF, ISNUMBER, INDIRECTの組み...
-
エクセルで入力シートから別シ...
-
エクセルについて質問です 日付...
-
エクセルVBA:表の内容を担当者...
-
指定した日付の範囲内でデータ...
-
VBAのoffsetの動き方について教...
-
EXCEL VBA 一致しないデータの...
-
エクセルで入力→日付を自動判別...
-
エクセル マクロを使って日々...
-
VBAを利用しオートフィルタで日...
-
エクセル 毎日更新する表のデ...
-
【Excel】VLOOKUP関数で複数の...
-
エクセル:複数シートのデータ...
-
Excel 複数のシートからグラフ...
-
質問:特定文字列から空白行ま...
おすすめ情報
No.3・4様
お返事が遅くなり申し訳ございません。
No.4で試して見ます!念のため質問に答えておきます。
① 入力用シートですが、F列以降は何か入力されていますか?
→されております。
② 多分ですが入力後右のセルに移るように設定されていると思いますが間違いないでしょうか?
→設定されております。
③ 日付はどこに記入されていますか?
→A22セルから下に入力されております。
④ 計算式はどこに入っていますか?
DとEをかけてFに合計です。
⑤ 入力後クリアした方が使いやすいと思うのですが、クリアしない方が良いところはありますか?
→入力用シートに入力した後はまた新たにクリアします。