閲覧ありがとうございます。当方、最近事務職に異動になった者です。
Excelデータを作成・提出するよう指示を受けましたが、なにぶんにもエクセル初心者の為
なかなかうまく行かず困っています。
下記の元データがあります
A B C D E F G H
1 施設No. 請求月 氏名 入金日 入金額 H26/入金回数 H26/入金額 H26/最終入金日
2 0062710 H26/04 須藤 H26/09/25 1,500
3 0062710 H26/05 須藤 H26/11/05 1,500
4 0062710 H26/06 須藤 H26/11/05 1,500
5 0062710 H26/08 須藤 H27/05/08 1,500
6 0062710 H26/08 須藤 H27/06/23 1,500
7 0062710 H26/08 阿部 H27/08/20 1,500
8 0062710 H26/08 阿部 H27/08/20 1,500
9 0062710 H26/08 阿部 H28/05/10 1,500
10 0062710 H26/08 阿部 H28/06/24 1,500
11 0062710 H26/08 阿部 H28/06/24 1,500
提出データ
A B C D E F
1施設No. 氏名 H26/入金回数 H26/入金金額 H26/最終入金日 H27/入金回数・・・・・
H28年11月末までの各年度のデータが横に表示される様にしたいです。
その後、28年度末の分までのデータの追加がされます。
同じ施設Noに退居・入居のに伴い2人の名前がある時もあり、その施設は当然VLOOKUPでは抽出できません。その上、年度ごとの入金回数、入金金額、その年度の最終入金日も抽出しなくてはいけません。
① 一旦、データとなるシートに入金回数・入金金額を抽出出来たのですが入金回数抽出で、同じ日 に2回以上あると1回とカウントされてしまい困っています。式にはSUMPRODAUCT関数を使い ました。
② 年度毎の入金回数・入金金額を取りあえず出せたので、その式を流用してその年度の最終入金日を
抽出できないかアレコレやってみたのですがうまくいきません。
③ 取りあえず、抽出した回数と入金額を提出データに表示させようとしたのですがうまく行きませ ん・・・。人によって表示されないところがあります。INDEXとMATCH関数を使用しました。
1)全部で8,000人のデータがあります。元データの各年度の入金回数・金額・最終入金日の上 と下の行は空白行が多いです。その為読み込みエラーが出るのでしょうか?
2)提出シートは途中、集計の為に行を挟んであります。
その為に読み込みエラーが出るのでしょうか?
集計行を挟んだ下の行が表示されなくなってしまったりします。
以上、大変申し訳ないのですが、ご教示いただきたくお願いいたします。
サイトでそれらしい式を探してきたりしてやっとここまで来たのですが
もうこれ以上はお手上げ状態です。
よろしくお願いいたします。
No.7ベストアンサー
- 回答日時:
No6です。
以下のマクロを標準モジュールに登録してください。
マクロ「集計表作成」を実行するとsheet3に提出用データが作成されます。(sheet3は空のシートを用意しておくこと)
----------------------------------------------------------------------
Option Explicit
Public Const シート名1 As String = "Sheet1" '元データのシート名
Public Const シート名2 As String = "Sheet3" '提出データのシート名
Public Const 開始年度 As Long = 26 '提出データの開始年度(平成の年度)(現在 H26)
Public Const 集計年度数 As Long = 3 '提出データの集計対象の年度の数(現在 3年度分)(H26,H27,H28)
Public Sub 集計表作成()
Dim sh1, sh2 As Worksheet
Dim row1 As Long 'sheet1の行番号
Dim row2 As Long 'sheet2の行番号
Dim col2 As Long 'sheet2の列番号
Dim maxrow1 As Long 'sheet1の最大行番号
Dim maxrow2 As Long 'sheet2の最大行番号
Dim dicT As Object '連想配列
Dim key As String
Dim yyyy As Long
Dim mm As Long
Dim i As Long
Dim nendo As Long '相対年度(H26年度を1とする)
Dim errorFlag As Boolean
Dim errormsg As String
errorFlag = False
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set sh1 = Worksheets(シート名1)
Set sh2 = Worksheets(シート名2)
sh2.Cells.Clear 'Sheet2クリア
sh2.Cells(1, 1).Value = "施設No."
sh2.Cells(1, 2).Value = "氏名"
For i = 1 To 集計年度数
sh2.Cells(1, i * 3).Value = "H" & 開始年度 + i - 1 & "/入金回数"
sh2.Cells(1, i * 3 + 1).Value = "H" & 開始年度 + i - 1 & "/入金金額"
sh2.Cells(1, i * 3 + 2).Value = "H" & 開始年度 + i - 1 & "/最終入金日"
Next
maxrow2 = 1
maxrow1 = sh1.Cells(Rows.Count, 1).End(xlUp).row ' 最終行を求める
'2行~最終行まで繰り返す
For row1 = 2 To maxrow1
'空白行はスキップする
If sh1.Cells(row1, 1).Value = "" Then GoTo CONTINUE99
'施設+氏名でキーを作成
key = sh1.Cells(row1, 1).Value & "|" & sh1.Cells(row1, 3).Value
If dicT.exists(key) Then
'当該キーが既存のキーなら、そのSheet2用行数を取得
row2 = dicT(key)
Else
'新規のキーなら、Sheet2の行数をカウントアップし、施設、氏名を作成
maxrow2 = maxrow2 + 1
dicT(key) = maxrow2
row2 = maxrow2
sh2.Cells(row2, 1).Value = sh1.Cells(row1, 1).Value
sh2.Cells(row2, 2).Value = sh1.Cells(row1, 3).Value
End If
'入金日の年、月を取得
yyyy = Year(sh1.Cells(row1, 4).Value)
mm = Month(sh1.Cells(row1, 4).Value)
'H26を1とする相対年度を取得
nendo = yyyy - 1989 - 開始年度 + 2
'1月~3月は前年度扱いとする
If mm >= 1 And mm <= 3 Then
nendo = nendo - 1
End If
If nendo < 1 Or nendo > 集計年度数 Then
'H26年度~H28年度以外はスキップする(1度のみ表示)
If errorFlag = False Then
errormsg = row1 & "行 施設|氏名=" & key & " 処理対象外入金日=" & sh1.Cells(row1, 4).Text & vbLf
errormsg = errormsg & "このデータをスキップします。このメッセージは1回のみ表示されます。"
MsgBox (errormsg)
errorFlag = True
End If
GoTo CONTINUE99
End If
col2 = nendo * 3
'入金回数
sh2.Cells(row2, col2).Value = sh2.Cells(row2, col2).Value + 1
'入金額
sh2.Cells(row2, col2 + 1).Value = sh2.Cells(row2, col2 + 1).Value + sh1.Cells(row1, 5).Value
sh2.Cells(row2, col2 + 1).NumberFormatLocal = "#,##0"
'最終入金日
If sh1.Cells(row1, 4).Value > sh2.Cells(row2, col2 + 2).Value Then
sh2.Cells(row2, col2 + 2).Value = sh1.Cells(row1, 4).Value
sh2.Cells(row2, col2 + 2).NumberFormatLocal = "gee/mm/dd"
End If
CONTINUE99:
Next
End Sub
--------------------------------------------------------------
尚、あなたのほうでこのマクロを改造する場合は、以下の行を修正してください。
1)Public Const シート名1 As String = "Sheet1" '元データのシート名
元データのシート名を○○にする場合は、"Sheet1"を"○○"に変えてください。
2)Public Const シート名2 As String = "Sheet3" '提出データのシート名
提出用データのシート名を変える場合は、"Sheet3"を"▲▲"のように変えてください。
3)Public Const 開始年度 As Long = 26 '提出データの開始年度(平成の年度)(現在 H26)
もし、来年になって、集計開始年度をH27から開始する場合は、この数字を27に変えてください。
4)Public Const 集計年度数 As Long = 3 '提出データの集計対象の年度の数(現在 3年度分)(H26,H27,H28)
もし、来年になって、4年度分(H26,H27,H28,H29)にする場合は、これを4にしてください。
その場合、開始年度は26のままで構いません。
不明点があれば、補足してください。
おはようございます❢今やっとデータが完成しました❢
今回は、本当に本当にお世話になりました。
お陰様で期限に間に合いました。
マクロまで組んでいただいて、本当に申し訳ない限りです。
このレベルの仕事ができないと、やって行けないのだなぁと
かなり凹んでおりますが、一生懸命勉強しようと思います。
出勤された上司にデータを提出しましたら
びっくり顔をされました(笑)
それでは、これから帰宅します(笑)
今回は、本当にありがとうござきました❢❢
No.6
- 回答日時:
マクロで提出データを作成しても良いならマクロの提供は可能です。
その場合は、その旨、補足ください。その際、幾つか質問がありますので、補足をお願いいたします。
1)元データのD列の入金日付は、セルの書式設定のユーザー定義 "[$-411]ge/m/d" を使用していると理解していますが
それであっていますか。(添付の図を参照)
2)H26/4/1からH27/3/31の入金が提出データの"H26"の欄に該当するということでよいですか。
3)H26/3/31以前のデータはありますか。あるとすれば、何件程度ありますか。
(大量にあれば、エラーを表示せずにスキップします。原則、ないなら、エラーを表示してスキップします)
何度も申し訳ございません。
大事になってしまい、恐縮しております。
1)元データのD列の入金日付は、セルの書式設定のユーザー定義 "[$-411]ge/m/d" を使用していると理解していますがそれであっていますか。(添付の図を参照)→ユーザー定義のgee/mm/ddで設定されています。
2)H26/4/1からH27/3/31の入金が提出データの"H26"の欄に該当するということでよいですか。→はい。D1のH26年入金金額の欄になります。
3)H26/3/31以前のデータはありますか。あるとすれば、何件程度ありますか→H26年度からになります。
本当に、申し訳ありません。あまりの情けなさで泣きそうです。
どうぞよろしくお願いいたします・・・。
No.4
- 回答日時:
続けてお邪魔します。
>① 施設番号と名前の重複チェックは白い部分が出てこず連番で最終行まで行ってしまいます。
とは作業列1のコトでしょうか?
ん~~~
数式は前回通りになっているでしょうか?
行の絶対参照「$」マークは前回の数式通りちゃんと入っていますか?
ない場合、補足のようになる可能性があります。
今一度確認してみてください。
>② 年度振り分けのところは年度はH26/4月~H27/3月までで1年カウントなので、!月~3月の部分が
翌年に反映されてしまいます。
について要するに「年度」で表示したいわけですね?前回の数式は単に1~12月までの「平成」の年になります。
作業列2(J2の数式)の数式を
=IF(A2="","",TEXT(EDATE(D2,-3),"e")*1)
としてみてください。
おそらく今年の4月1日~来年の3月31日までは「28」と表示されるはずです。
※ 余談ですが、別シートに表示させるのであれば元データのE~G列は不要のような気がします。
※ >最初のシート1に2行足すところから躓いてしまいました。
この件に関しては敢えて触れませんが、解決済みですよね?
とりあえずはこれで試してみてください。m(_ _)m
No.3
- 回答日時:
No.2です。
細かい検証をしていませんでした。
Sheet2のE2セルの数式を
=IF($A2="","",IF(C2>0,MAX(IF((Sheet1!$A$1:$A$10000=$A2)*(Sheet1!$C$1:$C$10000=$B2)*(Sheet1!$J$1:$J$10000=C$1),Sheet1!$D$1:$D$10000)),""))
に変更してください。
配列数式ですので、やはりCtrl+Shift+Enterで確定です。
おそらく他のセルは大丈夫だと思います。
どうも失礼しました。m(_ _)m
何度もありがとうございますm(_ _)m
本当に、申し訳ないくらいです。
こんなに親切丁寧に教えていただいて、泣きそうです。
gooへの質問投稿も今回が初めてですので
至らないところが沢山ある文章なのに
本当にありがとうございますm(_ _)m
No.2
- 回答日時:
こんばんは!
無理やりやってみました。
↓の画像のように元データはSheet1にあり、Sheet2に表示するとします。
Sheet1のD列にはシリアル値が入っているという前提です。
尚、下準備をこまめにする必要があります。
まずSheet1に作業用の列を2列設けます。
作業列1(これは「施設No」と「氏名」を重複なしに抽出するため)のI2セルに
=IF(COUNTIFS(A$2:A2,A2,C$2:C2,C2)=1,ROW(),"")
という数式を入れます。
次に作業列2のJ2セルに
=IF(A2="","",TEXT(D2,"e")*1)
という数式を入れ、I2・J2セルを範囲指定 → J2セルのフィルハンドルでこれ以上データはない!というくらいまで下へコピー!
(J2セルのフィルハンドルでダブルクリックでも構いません)
次にSheet2のC1~E1セルの表示形式を設定します。
C1セルの表示形式をユーザー定義から
"H"0"入金回数"
同じくD1セルの表示形式をユーザー定義から
"H"0"入金金額"
さらにE1セルの表示形式をユーザー定義から
"H"0"最終入金日"
としておき、C1~E1セルを範囲指定 → E1セルのフィルハンドルで右へ3列ずつ好きなだけコピーしておきます。
そしてC1・D1・E1にはそれぞれ 26 と数値のみを入力すれば↓の画像のような表示になります。
F列以降も同様に 27 や 28 を入力していきます。
A2セルに
=IFERROR(INDEX(Sheet1!$A:$C,SMALL(Sheet1!$I:$I,ROW(A1)),MATCH(A$1,Sheet1!$A$1:$C$1,0)),"")
という数式を入れ隣りのB2セルまでフィル&コピー!
C2セルに
=IF($A2="","",COUNTIFS(Sheet1!$A:$A,$A2,Sheet1!$C:$C,$B2,Sheet1!$J:$J,C$1))
D2セルに
=IF($A2="","",SUMIFS(Sheet1!$E:$E,Sheet1!$A:$A,$A2,Sheet1!$C:$C,$B2,Sheet1!$J:$J,D$1))
E2セルに
=IF($A2="","",MAX(IF(Sheet1!$C$1:$C$10000=$B2,Sheet1!$D$1:$D$10000)))
E2セルだけが配列数式になりますのでCtrl+Shift+Enterで確定!
C2~E2セルを範囲指定 → E2セルのフィルハンドルで右へ3列ずつコピー!
各列の表示形式は適宜変更してください。
最後にA2~最終列の2行目を範囲指定 → フィルハンドルで下へコピー!
これで画像のような感じになります。
※ データが8000行位になるみたいなので極力配列数式は使用したくなかったのですが
「最終日入金日」列のみ配列数式にしてしまいました。m(_ _)m
お返事をありがとうございます!
この短い時間に、ここまでの式を考えてくださって
本当にありがとうございますペコリ(o_ _)o))
このお返事を見ながら、再度入力してみます。
もっともっと、Excelの勉強頑張ります!
本当にありがとうございます!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルの散布図で新たに入力した値のデータラベルが空欄になる現象 1 2022/04/26 09:31
- Excel(エクセル) Excel2016 行間を詰めたい&同じカテゴリなら上位2つだけを表示したい 5 2022/06/03 12:19
- その他(住宅・住まい) 身内の居ない人の高齢者施設入居 4 2022/06/23 20:22
- Excel(エクセル) エクセルでINDEXとMACTHで出てきたデータの数を数えるには? 1 2023/04/25 10:21
- Excel(エクセル) 隣り合っていないセルを まとめて税込表示したい 8 2022/09/25 14:32
- Excel(エクセル) アウトラインの小計のやり方 1 2023/03/20 11:51
- 猫 シニア猫の手術保険について 1 2022/09/06 21:10
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) マクロか関数で処理したいのですが、教えて頂けませんか。 8 2022/10/31 15:18
- Visual Basic(VBA) Excel VBA ユーザーフォーム内のラベルにテキストボックスの小計を出す方法 5 2022/08/17 14:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelはなんで先頭の0を消すん...
-
Excel元に戻す方法を教えてくだ...
-
【Microsoft Office Excel Comp...
-
Excelが固まってしまった。
-
西暦や和暦の表示をyyyymmdd表...
-
Excel 2019 のピボットテーブル...
-
【関数】スペースがいくつ入っ...
-
【Excel】セル内の時間帯が特定...
-
excelの不要な行の削除ができな...
-
Excelのオートフィル
-
別シートからの文字を変更
-
Excelのセルを飛ばして入力する
-
Excel初心者です。 詳しい方、...
-
エクセルの行の抽出について質...
-
Excel初心者です。 詳しい方、...
-
【マクロ】エクセルにかいてあ...
-
EXACT関数とIF関数の組み合わせ...
-
スプレッドシート クエリ関数 1...
-
エクセルで指定した日付、店舗...
-
Excelのグラフ軸について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内にある数字の出現回...
-
Excel関数の先頭に「@」が入っ...
-
エクセルの気味悪い不思議
-
Excel VBAで、実行時にsheet上...
-
表示されている人数だけを数え...
-
他人が作ったマクロの理解
-
Excelの関数について質問です。
-
Excel 集計表
-
エクセル 日時の計算式について
-
Excelの関数に関して質問です。...
-
エクセル:セル内の文字列の下...
-
絞り込み検索
-
エクセルの関数で
-
エクセルの書式設定について教...
-
余分なEXCELファイルに印刷され...
-
VBA 同一シート内での転記の仕方
-
長期休みの関数はありますか
-
Excelの空のセル
-
エクセルで入力してある文を別...
-
Excelのマクロで、セルを結合し...
おすすめ情報
申し訳ありません。やってみたのですが最初のシート1に2行足すところから躓いてしまいましたm(_ _"m)
① 施設番号と名前の重複チェックは白い部分が出てこず連番で最終行まで行ってしまいます。
② 年度振り分けのところは年度はH26/4月~H27/3月までで1年カウントなので、!月~3月の部分が
翌年に反映されてしまいます。