下記の表(元データ:シート名「山田」)があります。
----------------------------------------------------------------
   A      B      C      D
1)  名前     A子     B子     C子
2) 退会日   2017/3/7  2017/4/12  2017/4/3
----------------------------------------------------------------

上記より、特定月に退会する人のみの情報を別シートに抽出したいのですが、
どのように数式を組めば良いのか分からず、悩んでいます。
どんな関数を使用すれば良いのか、具体的に教えて頂ければ幸いです。

下記は、抽出する先のシートの様子です。
----------------------------------------------------------------
   A      B      C      D
1)  4月
2)  名前    担当者    退会日
3)
4)
5)
----------------------------------------------------------------

抽出したい退会月は、抽出シートのA1セルに入れています。
(「2017/4/1」と入力したものをユーザー設定で『4月』と表示しています)
元データから抽出したい項目は、A列の名前とC列の退会日なので、
A列の3行目以降、C列の3行目以降に関数を入れて反映したいと考えています。

※元データ:シート名「山田」の場合、
B子さんとC子さんの名前と退会日が抽出できればOK!


また、元データのシート名は「担当者」の名前にしています。
もし、元データのシート名を、抽出シートのB列に反映できる技があれば、
そちらもご教示ください。

よろしくお願いいたします。

A 回答 (3件)

こんばんは!



VBAになりますが、一例です。

↓の画像のように担当者分のSheetが存在していて、各シートとも画像のような配置だとします。
尚、抽出するシート名は「抽出」としています。

標準モジュールにしてください。

Sub Sample1() '//この行から//
Dim j As Long, k As Long, lastRow As Long, wS As Worksheet
With Worksheets("抽出")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 2 Then
Range(.Cells(3, "A"), .Cells(lastRow, "C")).ClearContents
End If
.Range("C:C").NumberFormatLocal = "yyyy/m/d"
For k = 1 To Worksheets.Count
Set wS = Worksheets(k)
If wS.Name <> .Name Then
For j = 2 To wS.Cells(2, Columns.Count).End(xlToLeft).Column
If Month(wS.Cells(2, j)) = Month(.Range("A1")) Then
With .Cells(Rows.Count, "A").End(xlUp).Offset(1)
.Value = wS.Cells(1, j)
.Offset(, 1) = wS.Name
.Offset(, 2) = wS.Cells(2, j)
End With
End If
Next j
End If
Next k
End With
End Sub '//この行まで//

※ 関数でないので
データ変更があるたびにマクロを実行する必要があります。m(_ _)m
「別シートから月(MONTH)で抽出する方」の回答画像3
    • good
    • 0
この回答へのお礼

ご回答頂き、ありがとうございます。
ただ、VBAは勉強不足で理解出来ておりません・・・
折角ご教示頂いたのに、申し訳ございません。
今後、知識が身に付いた時に参考にさせて頂きます。
本当にありがとうございました!

お礼日時:2017/04/17 14:40

B列に担当者(シート名)を表示させるということは、


シート名を指定せずに、月だけの指定でA列・C列を表示させ、更に該当するシート名をB列に表示させたいということですか?
関数で検索するのであれば、少なくともシート名の指定は必要です。
具体的な指定でなくても、シート名一覧(この場合担当者名一覧でも可)が必要です。

シート名一覧の横に、各シートの該当データがいくつあるかを表示させ、
抽出したいセルのデータがどのシートのものであるかを判断し、 ←これがB列に表示するデータです。
そのシートにある該当する番目のデータの列を把握し、
その列にある表示させたい行のデータを抽出する。 ←これがA列・C列に表示するデータです。
という段階を踏まなければなりません。

一覧を用いずにブック全体を検索したいというのであれば、VBAでの回答をお待ちください。
    • good
    • 0
この回答へのお礼

ご回答頂き、ありがとうございます。
質問内容が分かりづらく、申し訳ございません。。。

シート名を指定せずに、A列・C列を表示させたい、という訳ではありません。
B列には、シート名になっている担当者名を反映できれば良いな~と思っていたので、
ついでにB列についても質問させて頂きました。

A列・C列の数値を他のシートから引っ張ってくるのなら、
シート名を指定せずにやることが出来ないことは理解しております。
その上で、特定月に退会する人のみの情報を
別シートに抽出する方法をお教え頂ければ幸いです。

お礼日時:2017/04/17 14:33

元データーに「退会月」を設けて、


退会月=month(退会日)
とすれば、それを検索値とできます。
しかし、前年来年も同じ「退会月」にはなってしまいますが…
    • good
    • 0
この回答へのお礼

ご回答頂き、ありがとうございます。
参考にさせて頂きます。
本当にありがとうございました!

お礼日時:2017/04/17 14:23

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QExcel2013 VBA A列とB列の文字をA列とB列とC列に移動させる方法

A列とB列に文字が入っているのですが、下記のようにA列とB列とC列に文字を移動させたいです。
(A列の数字は必ず奇数のA列に入っています。)
VBAのコードを教えて下さい。

例えば
A1 1  B1 cat
A2 空白 B2 猫
A3 空白 B3 dog
A4 空白 B4 犬
A5 2  B5 whale
A6 空白 B6 クジラ
A7 3  B7 rabbit
A8 空白 B8 ウサギ

とデータがある場合

A1 1  B1 cat  C1 猫
A2 空白 B2 dog  C2 犬
A3 2  B3 whale  C3 クジラ
A4 3  B4 rabbit C4 ウサギ

としたいです。

実際、データは、A5196まであります。

Aベストアンサー

No.1です。

>実際、データは、A5196まであります。

前回のコードは一つずつカット&ペーストしていますので
かなりの時間を要すると思います。
↓のコードに変更してみてください。

Sub Sample2()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
Application.ScreenUpdating = False
With Range(Cells(1, "C"), Cells(lastRow, "C"))
.Formula = "=IF(MOD(ROW(),2)=1,B2,"""")"
.Value = .Value
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
Application.ScreenUpdating = True
MsgBox "完了"
End Sub

少しは短縮できると思います。m(_ _)m

No.1です。

>実際、データは、A5196まであります。

前回のコードは一つずつカット&ペーストしていますので
かなりの時間を要すると思います。
↓のコードに変更してみてください。

Sub Sample2()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
Application.ScreenUpdating = False
With Range(Cells(1, "C"), Cells(lastRow, "C"))
.Formula = "=IF(MOD(ROW(),2)=1,B2,"""")"
.Value = .Value
.SpecialCells(xlCellTypeB...続きを読む

QA列とB列の重複を抽出したいのですがA列とB列の値は一部だけ同じ文字です。ご教示お願いします。

エクセル初心者です。重複を見つけるのが仕事です。いろいろやってみたのですがうまくできません。
お知恵をお貸しください。

A列には企業名が入力されています。
B列にも企業名が入力されていますが全く同じ文字ではないのです。

たとえばこういうことです。
A1 (有)雪見酒      B1  雪見
A2 株式会社豪雪地帯   B2 (株)豪雪地帯
A3 ゆきかき本舗     B3 (有)ゆきかき本舗

A列にある企業名とB列にある企業名が同じであればセルを塗りつぶすか○を表示させるように
したいのです。
重複を見つけるのが目的なので、ほかの方法でもかまいません。
すみません、A列のセルとB列のセルが全く同じ名前ならば重複が見つけられたのですが
ここから先がどうしてもわからないのです。。。
申し訳ありませんがどうか教えてください。。。

Aベストアンサー

No4です。以下のマクロを標準モジュールへ登録してください。
--------------------------------------------------
Option Explicit
Public Sub 重複チェック()
Dim maxrow1 As Long
Dim maxrow2 As Long
Dim row1 As Long
Dim row2 As Long
Dim nameT1() As String
Dim nameT2() As String
Dim t1, t2 As Variant
t1 = Time
maxrow1 = Cells(Rows.Count, "A").End(xlUp).row '最大行取得
maxrow2 = Cells(Rows.Count, "B").End(xlUp).row '最大行取得
ReDim nameT1(maxrow1)
ReDim nameT2(maxrow2)
Range("C1:" & "D" & maxrow2).Value = ""
Call makeTable(nameT1, "A", maxrow1)
Call makeTable(nameT2, "B", maxrow2)
For row1 = 1 To maxrow1
For row2 = 1 To maxrow2
If Cells(row2, "C") = "" Then
If Mymatch(nameT1(row1), nameT2(row2)) = True Then
Cells(row2, "C").Value = "○"
Cells(row2, "D").Value = row1
End If
End If
Next
Next
t2 = Time
MsgBox ("チェック完了 処理時間=" & Minute(t2 - t1) & "分" & Second(t2 - t1) & "秒")
End Sub
'余分な文字を削除した結果をテーブルに格納する
Private Sub makeTable(ByRef nameT() As String, ByVal col As String, ByVal maxrow As Long)
Dim row As Long
Dim ary As Variant
Dim name As String
Dim i As Long
ary = Array("㈱", "(株)", "株式", "(有)", "有限", "会社")
For row = 1 To maxrow
name = Cells(row, col).Value
For i = 0 To UBound(ary)
name = Replace(name, ary(i), "")
Next
nameT(row) = name
Next
End Sub
'企業名が一致かどうか判定する
Private Function Mymatch(ByVal name1 As String, ByVal name2 As String) As Boolean
Mymatch = False
Dim pos As Variant
pos = InStr(1, name1, name2, vbTextCompare)
If pos > 0 Then Mymatch = True
End Function
-----------------------------------------------------
一致の精度が悪ければその旨補足してください。
(一致すべきものが一致しない、一致してはいけないものが一致している)
100%解決できる保証はありませんが、多少のチューニングは行います。

No4です。以下のマクロを標準モジュールへ登録してください。
--------------------------------------------------
Option Explicit
Public Sub 重複チェック()
Dim maxrow1 As Long
Dim maxrow2 As Long
Dim row1 As Long
Dim row2 As Long
Dim nameT1() As String
Dim nameT2() As String
Dim t1, t2 As Variant
t1 = Time
maxrow1 = Cells(Rows.Count, "A").End(xlUp).row '最大行取得
maxrow2 = Cells(Rows.Count, "B").End(xlUp).row '最大行取得
ReDim ...続きを読む

Q「2017」シートのC列と「全国」シートのB列を「ある」「なし」で照合させたいのですが、下のような

「2017」シートのC列と「全国」シートのB列を「ある」「なし」で照合させたいのですが、下のような COUNTIF の式を作りましたがうまくいきません。

=IF(COUNTIF(全国!B63:B5581,'2017'!C2006:C3205,"あり","なし")

全国を'全国’としたほうがいいですか?
終わりのカッコはどのようにすればいいですか?どこが間違ってるのでしょうか。よろしくお願いします。

Aベストアンサー

とりあえず、IFの中にCOUNTIFが入っているはずなのに"("は2個")"は1個でおかしい、
IFは条件式が正しければA、正しくなければB、とする感じの式ですが、条件式が見当たらない。
(COUNTIFだけでは数を数えているだけであり、その数がどうであればどうするのかを書かなければならない)
そして、COUNTIFで数えるデータがきちんと選択されていない。

順番に説明しましょう。
=IF(COUNTIF(~)=0,"なし","あり")
これで、COUNTIFの計算結果が0であった場合は"なし"、そうでなければ"あり"を表示する。という式になります。
一致するものが1回しか出ないと確実に分かっている(入力ミス等もない)ならば、
=IF(COUNTIF(~)=1,"あり","なし")
としても良いですが、まぁCOUNTIFの結果が2以上であった場合にどうするかで使い分けてください。

=COUNTIF(A1:B2,C3)
これで、A1~B2の範囲にC3と同じデータがいくつあるかを計算します。
今回の場合であれば、
=COUNTIF(全国!B$63:B$5581,2017!C2006)
をC3205に対応する行までコピーする感じでしょうか。

両方組み合わせて
=IF(COUNTIF(全国!B$63:B$5581,2017!C2006)=0,"なし","あり")
を1199行下までコピーですかね。

とりあえず、IFの中にCOUNTIFが入っているはずなのに"("は2個")"は1個でおかしい、
IFは条件式が正しければA、正しくなければB、とする感じの式ですが、条件式が見当たらない。
(COUNTIFだけでは数を数えているだけであり、その数がどうであればどうするのかを書かなければならない)
そして、COUNTIFで数えるデータがきちんと選択されていない。

順番に説明しましょう。
=IF(COUNTIF(~)=0,"なし","あり")
これで、COUNTIFの計算結果が0であった場合は"なし"、そうでなければ"あり"を表示する。という式になりま...続きを読む

QエクセルのワークシートAの1列目(A列)の日付と、ワークシートBの1列

エクセルのワークシートAの1列目(A列)の日付と、ワークシートBの1列目(A列)の日付を一致させて1つのワークシートに纏める方法を探しています。

2つの時系列データがあるのですが、データA(為替データ)とデータB(株式データ)のデータ管理方法が下記のように異なっています。

データA(為替データ)・・・1週間のうち6日間(月曜から土曜まで)
データB(株式データ)・・・1週間のうち5日間(月曜から金曜まで)

おのおのワークシートのA列に日付が入っています。

データAは月曜から土曜までなので、1週間に6行要します。データBは月曜から金曜なので1週間に要するのは5行です。従って、単純にこの2つのデータを張り合わせるだけでは(データBをデータAのシートに張り合わせた時)、1週間に要する行数が違うので1行ずつずれてしまいます。

1週間に要する行数の違いだけでなく、マーケットが休みの日はデータそのものがないため日付が存在しません。(マーケットの休みもおのおの別の日でバラバラです。)

これらの理由により、ただ単に張り合わせるだけだとずれが広がるばかりです。

そこでデータAの日付とデータBの日付を認識して一致させる関数を教えて欲しいと思います。

データAの構成はA1=日付、B1=始値、C1=高値、D1=安値、E1=終値で、データBの構成も同じです。
データAのF1にデータAのA1と同じ日付のデータBの行を貼り付るように設定したいと思っています。

説明が分かり辛い場合は補足しますので、その際はご指摘下さい。

宜しくお願いします。

エクセルのワークシートAの1列目(A列)の日付と、ワークシートBの1列目(A列)の日付を一致させて1つのワークシートに纏める方法を探しています。

2つの時系列データがあるのですが、データA(為替データ)とデータB(株式データ)のデータ管理方法が下記のように異なっています。

データA(為替データ)・・・1週間のうち6日間(月曜から土曜まで)
データB(株式データ)・・・1週間のうち5日間(月曜から金曜まで)

おのおのワークシートのA列に日付が入っています。

データAは月曜から土曜までなので、1...続きを読む

Aベストアンサー

誤記がありましたね。ごめんなさい。

シートCのA2に
2010/1/1
を置いて下向けにえいやっとオートフィルドラッグ,365日の日付を並べておいて
B2:為替
=IF(COUNTIF(為替!$A:$A,$A2),VLOOKUP($A2,為替!$A:$E,COLUMN(B2)),"")
を右に下にコピー。
F2:株式
=IF(COUNTIF(株式!$A:$A,$A2),VLOOKUP($A2,株式!$A:$E,COLUMN(B2)),"")
を右に下にコピー。

これでマーケットの開いてなかった日付がエラーになることもありませんので,追加のご質問も解消でしょうか。

Qエクセルの関数を教えて下さい。 例 シート3 11月の売上集計 A 列 B列 C列 D列 1行 い

エクセルの関数を教えて下さい。

例 シート3 11月の売上集計
A 列 B列 C列 D列
1行 い ろ は
2行 りんご 3 2 4‥
3行 累計 15 12 13‥
4行 みかん 2 5 6‥
5行 累計 12 14 16‥
と売上の集計が続いています。
この時、2行目と4行目は手入力してます。
B3は=B2+10月シートB3となります。
C3はC2+10月シートC3となります。
5行目も同様です。
このシートをコピーして12月分を作った時、
B3は=B2+10月シートB3の10月を11月に
変更してます。
自動的に変更できる方法はないですか❓

Aベストアンサー

11月の
>シートをコピーして12月分を作った時、
>B3は=B2+10月シートB3の10月を11月に
>変更してます。
>自動的に変更できる方法はないですか❓
…と言う事ですか?
ならば月の数字をいじれば良いだけですので、CELL関数でシート名を取得して、それを加工しましょう。

 =CELL("filename",A1)
これで、このCELL関数が使われたシート名を含んだ文字列を取得できます。
 C:\Users\あさご\Documents\Excel_file\[売り上げとか.xlsx]12月の売上集計
のような値が返ってきますので、ファイル名の後ろにある「 ] 」の位置をFIND関数で見つけて、その次の文字から最後の文字までをシート名としてMID関数などで切り出し、
”月の売上集計”をSUBSTITUTE関数で削除する(空欄に置き換える)か、得られたシート名の先頭から「月」の文字の前の文字までを別途切り出す。
これで月の数字の部分を得ることができます。
あとはこの数字を足したり引いたりしてINDIRECT関数に入れて参照したいシート名にすればよいです。
1月には12月のシートを参照したいという事になるでしょうから、そのあたりも考慮して作りましょう。
(MOD関数を使うと良いかもしれない)

11月の
>シートをコピーして12月分を作った時、
>B3は=B2+10月シートB3の10月を11月に
>変更してます。
>自動的に変更できる方法はないですか❓
…と言う事ですか?
ならば月の数字をいじれば良いだけですので、CELL関数でシート名を取得して、それを加工しましょう。

 =CELL("filename",A1)
これで、このCELL関数が使われたシート名を含んだ文字列を取得できます。
 C:\Users\あさご\Documents\Excel_file\[売り上げとか.xlsx]12月の売上集計
のような値が返ってきますので、ファイル名の後ろ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報