在宅ワークのリアルをベテランとビギナーにインタビュー>>

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

A行は名字で同じ名字は家族です

B行は    名義人は1、同居人は2です

C行は    単身車は1、複数は2

D行は基準年齢より、

               高齢は1か若年は2


E行で家族が

高齢単身     若年単身

高齢複数     若年複数

高齢若年

を判別したいです

「教えて下さい エクセルの関数を教えて下さ」の質問画像

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

  • 有る団地の入居者状況調査の集計です
    A 家族名
    B 名義人、同居者
    D 高齢者、高齢者以外
    C 単身者、同居者有り
    の種別で
    世帯内容を
    高齢単身世帯、高齢複数人世帯
    若年単身世帯、若年複数人世帯
    高齢者若年者同居世帯
    の五個に種別したいです
    同居者の人数は、最高で十人です。

      補足日時:2020/12/28 21:35
  • マクロは、大丈夫です

      補足日時:2020/12/29 11:50
  • ありがとうございます、やってみます。

      補足日時:2020/12/29 14:08
gooドクター

A 回答 (10件)

このご質問の関数での回答を考えるとき、EXCELの知識は当然ですが、ある意味パズルを解く力のようなEXCEL以外の力量が問われているような気がしました。


「若単」「高単」「若複」「高複」「若高」の判別を行うにあたって、当初、他の回答者さんの回答を見ても、単身者世帯の判別は比較的容易だが、若年者および高齢者の複数世帯と高齢者若年者同居世帯の判別がやっかいだと感じていました。
しかし、実際に取り組んでみると、「世帯番号」「世帯人数」を算出すれば関数でも比較的容易に判別できることが判りました。

前提条件は以下のとおりです。
①同姓人は世帯ごとにブロック化されている。
②名義人は世帯プロックの筆頭に記載されている。

判別を行う手順は以下のとおりです。

(1)以下の作業列を用意する
F列に「世帯番号」、G列に「世帯人数」、H列に「D列世帯合計」、I列に「判別記号前部」、J列に「判別記号後部」

(2)以下の数式をそれぞれに記述し、下方向へオートフィル等でコピーする
F2「=COUNTIF($B$1:$B2,1)」
G2「=COUNTIF($F:$F,$F2)」
H2「=SUMIF($F:$F,$F2,$D:$D)」
I2「=IF(($J2="高")+($D2<>1),"若","高")」
J2「=IF($G2=1,"単",IF(($H2=$G2)+($H2=2*$G2),"複","高"))」

(3)判別結果を表示するためE2に以下の数式を記述し、下方向へオートフィル等でコピーする
E2「=$I2&$J2」

これにより、E列に判定結果が表示されます。ただし、入力されているべき項目が「空欄」である等のエラーチェックは行っておりません。

※当然I列、J列は作業列なので必ずしも必要ではなく、E列にいきなり、I列とJ列を結合した数式を記述してもよいのですが、数式が冗長になるので、あえて作業列を使い、後で結合しています。

上記の複数の数式のうち、ポイントはH列に表示する「D列世帯合計」です。
「D列世帯合計」が世帯人数と一致すれば全員若年、「D列世帯合計」が世帯人数の2倍と一致すれば全員高齢という判別が可能という点です。

添付画像を参照してください。
「教えて下さい エクセルの関数を教えて下さ」の回答画像10
    • good
    • 0

NO.4です。

 状況理解が間違っていたのがわかりました。
判別は、各行のデータに基づいてするのではなくて、各住居毎の居住者の状況で住居毎にするのですね。
確かに、マクロでやった方が楽そうな気がします。
12/29に【やってみる】と書かれていますね。 正月休みにでもやってみてください。
年末で時間があったもので、excelで作業領域を作って、無理矢理やってみました。 できないわけではなさそうです。
住居の【名義人が同姓同名】であっても、(B列で住居毎の区切りが分かる⇒住居居住人数も分かる)という考えで、やってみました。
やった結果、DGET関数の使い方で、「こう作業列を使えば、利用可能性が増える」ということがわかりました。
EXCEL関数でもできないわけではないとうためだけに、画像を添付します。
「教えて下さい エクセルの関数を教えて下さ」の回答画像9
    • good
    • 0

No7です。


以下のルールで決定しています。
1.連続した苗字が続く行数を数える。
  1行の場合、単身家族、以外は複数家族とする。
2.区分1、区分2の値は、家族構成の決定には関知しない。
3.単身家族の場合、
  区分3が1なら、高齢単身世帯 高単
  区分3が2なら、若年単身世帯 若単
4.複数家族の場合
  区分3が全て1なら、高齢複数人世帯 高複
  区分3が全て2なら、若年複数人世帯 若複
  上記以外なら、高齢者若年者同居世帯 若高
  とします。
5.以下のケースは正常とします。
  家族人数が10人を超えた場合でも正常とします。
  1つの家族に名義人が複数あっても正常とします。
  単身家族でありながら(苗字が1つの場合)、区分=2、又は、区分2=2のデータが
  あっても、正常とします。
6.以下のデータは不正データとし、処理を行いません。
  エラーの場合、F列にエラーの内容を表示します。
  苗字:空白でないこと
  区分1:1,2のいずれかであること
  区分2:1,2のいずれかであること
  区分3:1,2のいずれかであること
    • good
    • 0

以下のマクロを標準モジュールに登録してください。


Option Explicit

Public Sub 家族構成()
Dim sh As Worksheet 'ワークシート
Dim maxrow As Long '最大行数
Dim wrow As Long '処理中の行
Dim kbn1 As Variant '区分1
Dim kbn2 As Variant '区分2
Dim kbn3 As Variant '区分3
Dim ectr As Long 'エラーカウンター
Dim emsg As String 'エラーメッセージ
Dim name As String '苗字
Dim prev_name As String '前回苗字
Dim st_row As Long '家族の開始行
Dim en_row As Long '家族の終了行
Set sh = ActiveSheet
maxrow = sh.Cells(Rows.Count, 1).End(xlUp).row 'sheetの最大行取得
If maxrow < 2 Then Exit Sub
sh.Range("E2:F" & maxrow).Value = ""
ectr = 0
'データのチェック
For wrow = 2 To maxrow
emsg = ""
kbn1 = sh.Cells(wrow, "B").Value
kbn2 = sh.Cells(wrow, "C").Value
kbn3 = sh.Cells(wrow, "D").Value
If sh.Cells(wrow, "A").Value = "" Then
emsg = "苗字空白 "
End If
If kbn1 <> 1 And kbn1 <> 2 Then
emsg = emsg + "区分1 "
End If
If kbn2 <> 1 And kbn2 <> 2 Then
emsg = emsg + "区分2 "
End If
If kbn3 <> 1 And kbn3 <> 2 Then
emsg = emsg + "区分3 "
End If
If emsg <> "" Then
sh.Cells(wrow, "F").Value = emsg
ectr = ectr + 1
End If
Next
If ectr <> 0 Then
MsgBox (ectr & "行分のデータが誤っています")
Exit Sub
End If
'データの処理
prev_name = ""
For wrow = 2 To maxrow
name = sh.Cells(wrow, "A").Value
'前回と苗字が異なる場合
If name <> prev_name Then
'最初でないなら家族構成を出力
If prev_name <> "" Then
Call output(sh, st_row, en_row)
End If
prev_name = name
st_row = wrow '家族の開始行記憶
End If
en_row = wrow '家族の終了行記憶
Next
'家族構成を出力
Call output(sh, st_row, en_row)
MsgBox ("処理終了")
End Sub

Private Sub output(ByVal sh As Worksheet, ByVal st_row As Long, ByVal en_row As Long)
Dim dctr As Long
Dim msg As String
Dim wrow As Long
Dim highP As Long
Dim lowP As Long
'高齢者と若年者をカウントする
highP = 0
lowP = 0
dctr = en_row - st_row + 1
For wrow = st_row To en_row
If sh.Cells(wrow, "D").Value = 1 Then
highP = highP + 1
End If
If sh.Cells(wrow, "D").Value = 2 Then
lowP = lowP + 1
End If
Next
'単身家族の場合
If dctr = 1 Then
If highP = 0 Then
msg = "若単"
Else
msg = "高単"
End If
'複数家族の場合
Else
If highP = 0 Then
msg = "若複"
ElseIf lowP = 0 Then
msg = "高複"
Else
msg = "若高"
End If
End If
'家族の人数分、構成をセット
For wrow = st_row To en_row
sh.Cells(wrow, "E").Value = msg
Next

End Sub
    • good
    • 0

世帯人数が1名の場合、例ではA列がbのケースです。


区分1=1(名義人)、区分2=1(単身)になるはずですが
区分1=2(同居者)とか
区分2=2(同居者有)のケースは、エラー扱いするのですか、
それとも、正常扱いにするのでしょうか。
    • good
    • 0

マクロで良いなら提供可能ですが、いかがでしょうか。


あなたのパソコンのexcelがマクロが実行可能になっていることが必要です。
そして、マクロの登録方法を理解していることが必要です。
下記URLを読んで、OKなら、その旨、補足してください。
https://www.tipsfound.com/vba/01004
    • good
    • 0

a家=2名、b家=1名、c家=2名、d家=1名、e家=5名 で、


区分2の[未婚独身、(未婚独身)ではない]と、区分3の[高齢、若年]とで判定して、判別結果を出すのですね。
区分1は判定や判別には使わないのですね。
名字も判定や判別には使わないのですね。

⑦⑧⑨⑩⑪の「若高」は、どういう判定なのかが分かりません。
②が「高復」と、⑨⑪「若高」とが、分かりません。
⑧⑩に、「高」が付くのが分かりません。
「教えて下さい エクセルの関数を教えて下さ」の回答画像4
    • good
    • 0

=CHOOSE(D2,"高","若")&CHOOSE(C2,"単","複")



あくまでも、例示の通りならですが。

>高齢若年
こんな判定になることあるんですか?書いている条件とは合わないようですが。

それと、アルファベットは「列」です。
    • good
    • 0

すいません。

回答では無いので、興味が無ければ読み捨てて下さい。

同じ名字で、一人は”単身”といい、もう一人は”複数”と言い張るような家族はいないんですよね?
そういう意味で、C列って必要ですか?同一名字の行数を数えた方が確実のような気がしますが・・・。

同じ名字で、名義人が複数いるとかも出てきそうで、何となく心配です。事前に整合性のチェックとかした方がよさそうですね!!
    • good
    • 0

判定するための条件を一つずつ書き出してみましょう。


それができれば、あとはその条件を……
 ・一つずつ検査させるか、
 ・まとめて検査を少なく行うか、
になります。

そんなわけで、まずは条件を明確にしてください。
(ここは「代わりにやってくれる場所」ではなく「自力で解決できるアドバイスを貰う場所」です)
    • good
    • 0

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

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

gooドクター

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

このカテゴリの人気Q&Aランキング