お世話になります。
VBA超初心者です。

同じSheetに二つのテーブル

性別テーブル(名前を付けてます)
顧客ID性別
SA081  男
SA083  男
SA010   女
SA013  女

顧客テーブル(名前を付けてます)
ID氏名   顧客ID 性別
1山田 太郎  SA081
2斉藤 清  SA082
3山本 花子  SA061

です。

顧客テーブルの顧客IDを上から性別テーブルを検索して、あれば顧客テーブルの性別フィールドにその人の性別を記入するには、どうすればいいのでしょうか。

一生懸命考えて作ってはいるのですが、デバックばっかり出て、全然進みません。
Sub Chck()
Dim k As Range, s, i
Set k = Range("顧客テーブル").Range(2, 3).Value

For i = 2 To myTbl.Rows.Count
Set s = Range("性別テーブル").Cells.Find(what:=i, lookat:=xlPart, MatchCase:=False)
If s Is Nothing Then
k.Range("g2").Value 'ここに性別を書きます(ここは顧客テーブル外です。)
Exit Sub
End If
Next
End Sub

宜しくお願いします

このQ&Aに関連する最新のQ&A

A 回答 (4件)

>それとも全部おかしいのでしょうか?



yes・・・。
簡単な動作から覚えましょうw

最初のエラーがk.Range("g2").Valueですよね。
このままだと、k の内容はシートが指定されないといけませんが、
>Set k = Range("顧客テーブル").Range(2, 3).Value
では全く別の値をオブジェクトに設定しています。
この設定にも誤りがあります。

おそらく、"顧客テーブル"と言う範囲を設定したいのでしょう。
この場合、シートのどこかに顧客テーブルという名前の範囲が設定されていれば、Set k = Range("顧客テーブル") と書けますが、Range(2, 3).Valueは余計です。
でも、書かれたソースでは役立たない値です。

>For i = 2 To myTbl.Rows.Count

myTblが何処にも定義されていないので、参照不可でエラー。

>Set s = Range("性別テーブル").Cells.Find(what:=i, lookat:=xlPart, MatchCase:=False)
If s Is Nothing Then

Set s = Range("性別テーブル").Find(・・・・という書き方が良いでしょう。
でも、検査値が what:=i ではFor文が動かないので、検索しようが無いですね。
動いたとしても数値なので、顧客IDは入っていません。

>k.Range("g2").Value
一巡して、(仮に)Range("g2").Value = 検索値 では、毎回同じ位置に入ってしまいます。

個々の文を正しくしても、目的の通りに動作させることは不可能です。

>Exit Sub
も、うまく動作したとしても1回目の検索で記入が終了してしまいます。

他の方法もあると思いますが下記のような物を書いて見ました。
'Find版
Sub ChckFind()
Dim k As Range
Dim Ct As Integer
Dim s As Range

For Each k In Range("顧客テーブル") '顧客テーブルの全ての値を取得
If InStr(k.Value, "顧客ID") = 1 Then Ct = k.Column '顧客IDが何列目にあるかを記録
If k.Column = Ct And k <> "" Then '顧客テーブルの列で、値が空白以外なら検索を行う
Set s = Range("性別テーブル").Find(what:=k.Value, lookat:=xlPart, MatchCase:=False)
If Not s Is Nothing Then '見つかった場合
'顧客IDの隣のセルに、性別テーブルで見つけた顧客IDの
'隣のセルの値を記入。
k.Offset(0, 1) = s.Offset(0, 1)
End If
End If
Next
End Sub

'Vlookup版
Sub ChckVlookup()
Dim k As Range
Dim Ct As Integer
Dim s As Variant

On Error Resume Next 'エラーがあっても止まらないで実行
For Each k In Range("顧客テーブル")
If InStr(k.Value, "顧客ID") = 1 Then Ct = k.Column
If k.Column = Ct And k <> "" Then
'VLOOKUPを使って性別テーブルの値を取得
s = WorksheetFunction.VLookup(k.Value, Range("性別テーブル"), 2, False)
If s <> "" Then '値が見つかったら記入する。
k.Offset(0, 1) = s
End If

End If
Next
On Error GoTo 0 'エラーが有ったら止まるように設定する。

End Sub

頑張ってくださいね。
    • good
    • 0
この回答へのお礼

有難うございます。
本当に私のと全然違いますね。
For EachステートメントやInStr関数っていうのがあるなんて知りませんでした。
又色々質問すると思いますので、その時も宜しくお願いします。

お礼日時:2005/04/11 22:20

#2です。



書き忘れましたが、元のコードが lookat:=xlPart になってたので、そのままサンプルも書きましたが、xlWhole にしないと部分的に一致する値があった場合、先に見つけた方を拾ってしまいます。
    • good
    • 0
この回答へのお礼

有難うございます。
本を見て勉強しているんですが、難しくって…
又質問すると思いますので、その時も宜しくお願いします。

お礼日時:2005/04/11 22:24

変数の型などを理解されていないようで、かなりの部分がおかしいと思います。



↓kはRange型ですから代入するのであれば
Set k = Range("顧客テーブル").Range(2, 3).Value
     ↓
Set k = Range("顧客テーブル")
のようにしないと成り立ちません。

        ↓myTblってどこから出てきたのでしょう?
For i = 2 To myTbl.Rows.Count

↓最初の i は For の指定だと 2 です。つまり 2 を含むものを探してます。
~.Find(what:=i, lookat:=xlPart, MatchCase:=False)

      ↓逆です。見つからなかった場合になっています。
If s Is Nothing Then

    ↓文法的に変です。
k.Range("g2").Value

'--------------------------------------------------------------------------
上手く動くか解りませんがサンプルです。
試すならテスト環境で。

Sub Test()
Dim tRange As Range, r As Range, fr
Set tRange = Range("顧客テーブル").Offset(, 2).Resize(, 1)
For Each r In tRange
 Set fr = Range("性別テーブル").Resize(, 1).Find(what:=r, lookat:=xlPart)
 If Not fr Is Nothing Then r.Offset(, 1).Value = fr.Offset(, 1).Value
Next r
End Sub
    • good
    • 0

VBAの問題以前に、データベースの作り方に誤りがあるような気がします。


顧客IDというのは一意なもので普遍ですから、これを顧客テーブルのIDに割り当てるべきかと思います。

そうすれば、単純にVLOOKUP関数で処理できます。
顧客ID 氏名     性別
SA081  山田 太郎 =VLOOKUP(~)
 
VBAで処理する必要は何でしょうか?

この回答への補足

早速の回答有難うございます。
確かにそうですね。
何を一生懸命悩んでたんだろう。

ですが、一応勉強の為にマクロでの書き方を教えていただけますか。

k.Range("g2").Value の記述の仕方が間違っているんだと思うんですが。。。
それとも全部おかしいのでしょうか?

宜しくおねがいします。

補足日時:2005/04/10 22:05
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

QTVニュース等でなぜ野球以外のスポーツは扱いが小さい?

サッカー日本×オマーン戦の試合終了が平日深夜1時台にもかかわらず、平均視聴率20%というかなり高い数字を出しました。

しかし、その当日は多少取り上げられたもののやはり野球のゴジラ松井メイン。

小中学校と男女合わせたら意外に一番人気がある思われるバスケも田臥勇太選手が、日本人初NBA選手になった時ですら取り上げるか取り上げないかくらい。
(スラムダンクという漫画でバスケを広めた作者井上さんも最終巻のあとがきでマスコミの扱いが相変わらず小さいと嘆いていらっしゃいました)

今野球はスポーツ界の中でダントツ人気と言うわけでもないのになぜここまで特別扱い、逆に言えばなぜ野球以外のスポーツの扱いがこんなに悪いんでしょうか?
上記に挙げた日本代表は少なくとも視聴率という結果を挙げているのだからもっとイチローの時みたいに特集を組んだりしてもいいと思うし、「バスケを報道しないのは人気が無いからでは?」と思う方もおられるかと思いますが、人気が無いのはマスコミが取り上げないせいも大きいかと思います。

Aベストアンサー

ズバリ、 スポンサーとメディア側の発想が古いからだと思います。  20年ほど現状認識がずれているでしょう。

その業界の人間ではありませんが、どの番組でも制作責任者、或いは番組編成の責任者の年齢は40歳台以上ではないかな、と思います。

この年代の人間は基本的に相撲と野球しか知りません。  それも野球では圧倒的に巨人です。

彼らにとっては、サッカーのW杯予選より、パリーグのプレーオフや日本シリーズの方がはるかに興味あるはずです。

あとはゴルフくらいかな ・・・ 彼らは自分でもやりますからね。

一方、バスケやサッカーの方が注目されるのは30歳前後までの世代ではないでしょうか。

ところで、メディア側の現状認識が20年ほどずれているというのは、スポーツ関連だけではなく、政治面でも同じですよ。

自民党の政策は何をしても全て 「悪」、 野党はどれだけ選挙にボロ負けし、国民にソッポを向かれても 「善」 という扱いが多いと思います。  これは55年体制からの古い発想からメディア自身が未だに脱却していない証拠でしょうね。

もうひとつ。  平成13年に小泉政権が誕生し、新内閣の閣僚人事を決定するときのメディアの取材方法ですが、各派閥の領袖の動きだけを注視するという古来からの方法を踏襲し、その結果、取材現場が大混乱した事がありました。  小泉首相はそれを聞いて、 「構造改革しなければいけないのは、まずマスコミだな」 と呟いたとか ・・・

あと、スポンサーやメディアの担当者とすれば、野球を中心に番組編成をしていれば、役員など年寄り連中には印象がいいでしょうし、仮に低視聴率など問題が発生しても他に責任転嫁しやすいのではないかな、と感じています。  野球関連番組は歴史が長いですからね。

これを、思い切って若い世代に人気の高いバスケやサッカーを中心にして、もし失敗でもすれば、もろに責任がかかってくる制度になってはいないでしょうか。

そうだとすれば、担当者の本心は別でも、野球さえやっていれば、とりあえず安心という事になるんでしょうね。

ズバリ、 スポンサーとメディア側の発想が古いからだと思います。  20年ほど現状認識がずれているでしょう。

その業界の人間ではありませんが、どの番組でも制作責任者、或いは番組編成の責任者の年齢は40歳台以上ではないかな、と思います。

この年代の人間は基本的に相撲と野球しか知りません。  それも野球では圧倒的に巨人です。

彼らにとっては、サッカーのW杯予選より、パリーグのプレーオフや日本シリーズの方がはるかに興味あるはずです。

あとはゴルフくらいかな ・・・ 彼らは自...続きを読む

QVBAで Set wb = Sheets(1).Copyができないわけ?

つい先ほどの質問 4150169 は掲示したコードが抜けておりましたので無視して、こちらにご回答ください。
ほんと抜けた話です。すみません。

以下のマクロtest01はエラーになります。

Sub test01()
Dim wb As Workbook
Set wb = Sheets(1).Copy 'エラー「オブジェクトが必要です」
End Sub

もちろん
Dim wb As Workbook
Sheets(1).Copy
Set wb = ActiveWorkbook
と修正すればエラーにならないことは存じていますが、ふと疑問がわきました。
Sheets(1).Copyの段階であたらしいWorkbookが誕生していますよね。
ならば、そのWorkbookはオブジェクトではないのでしょうか?

Workbooks.Add で誕生したWorkbookは
Set wb = Workbooks.Add
と変数wbにSetできるのに
Set wb = Sheets(1).Copy
ができないのが不思議です。

Set wb = ActiveWorkbook
としないでもSheets(1).CopyをwbにSetする書き方はないのでしょうか?

つい先ほどの質問 4150169 は掲示したコードが抜けておりましたので無視して、こちらにご回答ください。
ほんと抜けた話です。すみません。

以下のマクロtest01はエラーになります。

Sub test01()
Dim wb As Workbook
Set wb = Sheets(1).Copy 'エラー「オブジェクトが必要です」
End Sub

もちろん
Dim wb As Workbook
Sheets(1).Copy
Set wb = ActiveWorkbook
と修正すればエラーにならないことは存じていますが、ふと疑問がわきました。
Sheets(1).Copyの段階であたらしいWorkbookが誕生し...続きを読む

Aベストアンサー

こんばんは。

少し、全体的に考えさせてもらいました。ご質問の最終的な終着点がどういうところにあるのかはあまりはっきりしませんし、私が書いたところで、この手の話は、あまり分かってもらえるという自信はありません。merlionXXさん、ご自身のVBAのコーディングの問題であって、個々の問題ではないからでもあります。

今回の質問は、merlionXX さん自身が、解答した中で考えたことでしょうし、まさか、サブルーチンや特殊なコードで解決をしようと思ったわけではないと思います。

実際のコードとして、

 Set wb = Sheets(1).Copy

というのは出来ないのはご存知なわけですが、なぜ「そうしたいと思った」か、ということがポイントではないでしょうか。出来ないのは、VBAの製作者の恣意的な設計だったのか、それとも、他の要因があったのかと思います。それを、私たちユーザーレベルでは分かりません。

あえて理由を言えば、もともと、Copy メソッドには、戻り値にオブジェクトではない、ということです。

実際に、
ret = Sheets(1).Copy

で返るのは、True です。失敗すれば、実行時エラーが起こります。

質問は、前回のコード( http://oshiete1.goo.ne.jp/qa4138541.html ) から、思いついた事だとは思っていますが、Sheets(1).Copy の時点で、Application側の暗黙的な Workbookのインスタンスの生成を与えてしまっているわけで、そこで、ActiveWorkbook で、オブジェクトを取得することに、なにかしら不自然さを感じていたとしたら、その感覚は正しいのではないかと思います。私も同じように思います。

しかし、その方法で、ブックオブジェクトを取得する方法は、ActiveWorkbook をオブジェクトとして取る方法以外には、新たに Copy メソッド自体から手を加えるぐらいしか、実現する方法はないような気がします。そうすると、その親オブジェクトのSheet のClass 設定から、手を入れなくてはなりません。それは、遥か上級の話だろうし、VBAレベルで可能かどうかさえ分かりません。それに、そんなに難しいコードが、この種のもので必要だと思えません。また、一行、二行の問題で、特別なワザもなく、わざわざFunction プロシージャで取り出すというのは、理屈ではあっても、実務的にはまず考えられません。

VBAは、合理的に出来ているようでいて、はっきりとしないものがいくつもあり、「やって見なければ分からない」としかいいようがありません。本当に単純なコードでも、VBに出来て、VBAには出来ないものがあります。自分は、プロだと豪語している人に限って、こういうところでね凡ミスをするのが常です。VBAのコーディングは、よほど初歩的なこと以外は、戻り値を想定するというような「推測」で済まされるようなことはできません。

ただ、私は全体を通してみて、もし、もう一度、考える余裕があるなら、個々のメソッドやそれに関わるワザよりも、全体のプロセス自体に手を付けたほうがよいのではないか、と思います。

前のコードを、私自身で考えてみました。これは、定番のコードではあるので、私のアレンジあるものの、それ自体がオリジナルというわけではありません。シートモジュールにあるマクロコードをコピーしたいという特例の場合は、以下のコードを少し変更して可能です。これは一例ですが、こういうものは自力で編み出したわけではなく、VBAの入門時に、教わっているものです。6年経っても、そのとき覚えたものは忘れていません。

http://oshiete1.goo.ne.jp/qa4148672.html

----------------------------------------
Sub 保存3()
  Dim orgShCnt As Integer
'  Dim shName As String
  Dim fn As Variant
  'ブックのシートの規定数
  orgShCnt = Application.SheetsInNewWorkbook
  Application.SheetsInNewWorkbook = 1
  With Worksheets("Sheet1")
'    shName = .Name
    .Cells.Copy
  End With
  With Workbooks.Add  '※
    .ActiveSheet.Paste
    Range("A1").Select
    Application.CutCopyMode = False
    '規定数を戻す
    Application.SheetsInNewWorkbook = orgShCnt
    'shName → は、"" になっている
    fn = Application.GetSaveAsFilename("", "Excelブック(*.xls),*.xls", 1, "保存")
    If VarType(fn) = vbBoolean Then
      .Close False
      MsgBox "キャンセルしました。", 48
      Exit Sub
    End If
    .SaveAs fn
    .Close False
  End With
  MsgBox "終了しました。", 64
End Sub


----------------------------------------
※ Workbooks.Add というメソッドで、明示的なブックを生成していればこそ、そのオブジェクトは確実に取得できるわけです。Application の NewBook イベントで、ブックオブジェクトは取得は出来ますが、それは、ひとつのプロセスの中にはありません。

はたして、本当に、Sheets(1).Copy でオブジェクトを捕らえることが必要なのか、と思います。私は、今まで、VBAのコードを2~3千件書いていますが、ほとんど、その方法は、記録マクロを写した程度にしか、そのような方法は出てこないように思います。

失礼な言い方があったら、お許しください。

こんばんは。

少し、全体的に考えさせてもらいました。ご質問の最終的な終着点がどういうところにあるのかはあまりはっきりしませんし、私が書いたところで、この手の話は、あまり分かってもらえるという自信はありません。merlionXXさん、ご自身のVBAのコーディングの問題であって、個々の問題ではないからでもあります。

今回の質問は、merlionXX さん自身が、解答した中で考えたことでしょうし、まさか、サブルーチンや特殊なコードで解決をしようと思ったわけではないと思います。

実際のコードとし...続きを読む

Qexciteニュースへのトラックバックはexcite blog以外からもできるの?

 原則としてexciteニュース(http://www.excite.co.jp/News/)へのトラックバックは、excite会員かつexcite blogサービスからしかトラックバックできないとされていますが、ニュース欄の下にある「この記事へのトラックバック」一覧のリンク先のアドレスを見てみると、Livedoorブログやseesaaブログといった、exciteブログ以外からのアクセスであるケースがあります。

 exciteニュースにおいて、excite blog以外のブログサービスからトラックバックをする方法はあるのでしょうか?

Aベストアンサー

ニュースによってできるものとできないものがあるみたいです。
例えば、
http://www.excite.co.jp/News/bit/00091131288722.html
だと、下の方に
トラックバックURL: http://www.excite.co.jp/News/tb/News/bit/00091131288722.html

が公開されているのでexcite以外のブログからもトラックバックできます。
個人的には全部できるようになったのかと思ったらニュースによってはこれが確認できないときもあるんですよね。

QRangeマクロのオブジェクトの記載について

初歩的な質問で恥ずかしいですが、Rangeのオブジェクトが長いので3行ぐらいにしたいのですが、
Range("AA5:AD5,AP25:BC25,AD26:BC26,AM28:AX28,AM30:AX30,AO50:AY50,AK52:AX53,T56:AB56,N62:U62,I64:U64,K71:U71,AB71:AM71,I72:M72,T80").Select

Aベストアンサー

Union(Range("AA5:AD5,AP25:BC25,AD26:BC26,AM28:AX28"), _
Range("AM30:AX30,AO50:AY50,AK52:AX53,T56:AB56,N62:U62"), _
Range("I64:U64,K71:U71,AB71:AM71,I72:M72,T80")).Select
という方法もあります。

Qわかりやすいニュースのサイト(こどもニュース以外で)

わかりやすいニュースのサイトがあれば教えて下さい。

いぜん、週刊こどもニュースというサイトを教えて頂き、大変分かりやすかったのですが、それ以外のもご存知の方いらっしゃれば、教えて下さい。

Aベストアンサー

>わかりやすいニュースのサイトがあれば教えて下さい。
>いぜん、週刊こどもニュースというサイトを教えて頂き、大変分かりやすかったのですが、
>それ以外のもご存知の方いらっしゃれば、教えて下さい。

田中宇の国際ニュース解説 http://tanakanews.com/

QEXCELによる、顧客データの抽出

いつもお世話になっております。

  A列(担当)  B列(お客様)   C列
2  山本1     後藤       1
3  三山      榎本       2
4  山本2     小島       3
5  高木      大田       4
6  山本1     児玉       5

が入ったデータシートがあります。

他のシートで、A1セルに山本1と入れた場合、
山本1のみを検索してくれるような数式を教えていただけないでしょうか?

  A列(担当)  B列(お客様)   C列
1  山本1
2  山本1     後藤       1
3  山本1     児玉       5
4   ・      ・        ・
    ・      ・        ・
    ・      ・        ・
    ・      ・        ・
    ・      ・        ・

宜しくお願い致します。

Aベストアンサー

次の方法は如何でしょうか。
データシートをシート3、抽出シートシート1として、A3セルに次の数式を設定し、縦横にコピーして下さい。
尚、配列数式としていますので、数式入力完了時、shift+ctrl+enterキーを同時押下して下さい。
=IF(ROW($A1)-1<COUNTIF(Sheet3!$A$1:$A$200,$A$2),INDEX(Sheet3!A$1:A$200,SMALL(IF(Sheet3!$A$1:$A$200=$A$2,ROW(Sheet3!$A$1:$A$200),999),ROW($A1))),"")

Q【暴力団構成員ってニュースにならないだけで日々バンバン死んでいってるんですか?】 それとも以外に長生

【暴力団構成員ってニュースにならないだけで日々バンバン死んでいってるんですか?】


それとも以外に長生き?

Aベストアンサー

ニュースになってる者だけ死んでたら、少子化にはならないでしょ。
バンバンかはシリマセンガ、
死んでいってマスよ。

まぁ、一般人よりかは確率高いでしょうな

QRunMacroメソッドではsubプロシージャーは呼び出せない?

RunMacroメソッドはvbaのsubプロシージャーのマクロ1を呼び出すことはできないのでしょうか?
DoCmd.RunMacro "マクロ1", 2
とするとエラーになってしまいます。
どうしても2回マクロを実行したい場合は
Call マクロ1
Call マクロ1
とするしかないですか?

Aベストアンサー

Excelの場合は「マクロ=モジュール(VBA)」ですが、
Accessの場合は「マクロ」と「モジュール」は別物になります。

で、ご質問の「RunMacro」は、データベースウィンドウ
(=テーブルやクエリなどの一覧が表示される画面)で、
『マクロ』選択時に表示されるもの(「マクロ」オブジェクト)を
実行する際に使用するメソッドです。

ですので、「マクロ1」がSubプロシージャの実行には
使用できません。
(実行すると、マクロオブジェクトから「マクロ1」を探すものの、
 見つからないのでエラーを返す、と)

Subプロシージャを指定回数実行する場合は、例えば
以下のように、「For Next」構文などを使用します。


'フォーム上の「コマンド1」ボタンのクリック時イベント
Private Sub コマンド1_Click()

  '回数カウント用の変数を宣言
  Dim i As Integer

  '「i」が「1」から「2」になるまで(=2回)反復
  For i = 1 To 2
    Call マクロ1
  Next

End Sub

・・・以上です。


~~~~~~~~~~~~~~~~~~~~~~~~~~

hana-hana3さんへ:
RunMacroメソッド及び「マクロの実行」アクションでも
実行回数の指定は可能ですので、参考まで:
(下記サイトはAcc2007のヘルプですが、この辺りはAcc97から
 仕様変更はなかったはずです:それ以前は使用経験なし)
http://office.microsoft.com/ja-jp/access/HA012262831041.aspx

Excelの場合は「マクロ=モジュール(VBA)」ですが、
Accessの場合は「マクロ」と「モジュール」は別物になります。

で、ご質問の「RunMacro」は、データベースウィンドウ
(=テーブルやクエリなどの一覧が表示される画面)で、
『マクロ』選択時に表示されるもの(「マクロ」オブジェクト)を
実行する際に使用するメソッドです。

ですので、「マクロ1」がSubプロシージャの実行には
使用できません。
(実行すると、マクロオブジェクトから「マクロ1」を探すものの、
 見つからないのでエラーを返す、と...続きを読む

Q時々、犬や猫が自分の子以外の子犬子猫を育てるニュースなどがありますが・

時々、犬や猫が自分の子以外の子犬子猫を育てるニュースなどがありますが・・・

あれってやっぱり個性によって他人(?)の子犬子猫(時には子猿なども)でも分け隔てなく可愛がって世話をする個体と、自分の子以外は絶対に世話しない個体というように性格が現れるものでしょうか?
 それとも子供を生んだ直後の母性というのは反射的に小動物を「なんでもかんでも自分の子」と認識してしまう”逆刷り込み”みたいなのがあるのでしょうか?

詳しい方、経験のある方、お願いします。

Aベストアンサー

母親と子供の両方の相性だと思います。

出産経験のないネコが、飼い主が新たに飼いだしたハムスターを見て、
ハムスターに鼻を噛じられながらもゲージに近づく例があるそうです。
そして気がつくと、想像妊娠していてお乳が出始めていたとか。

動物行動学によると、哺乳類の赤ちゃんの可愛らしさは全哺乳類に可
愛らしさを感じさせるようです。赤ちゃんを産んで母性が強くなって
いるときに、その可愛らしさを見ると受け入れる母親はあるようですね。

可愛らしさは赤ん坊が生きるための武器です。
可愛らしくない赤ん坊は幾ら母性が強い母親にでも受け入れられないで
しょう。

ある程度知性のある猿や類人猿、ゾウなどは子どもが死んでも死体を離
したがらない個体もいますが、多くは可愛らしい容姿、子どもらしい動
作を取らないものは興味を失うようです。
子供も母親に可愛がってもらうためにあの手この手で一生懸命です。

「刷り込み」も動物行動学用語ですが、これはある種の鳥が卵からか
えって最初に動いたものを見たら、それを母親と思ってしまうもので、
母親や他の種類では無い現象です。小さな脳味噌に母親をはっきりさせ
る効率のよい仕組みと言えるようです。

母親と子供の両方の相性だと思います。

出産経験のないネコが、飼い主が新たに飼いだしたハムスターを見て、
ハムスターに鼻を噛じられながらもゲージに近づく例があるそうです。
そして気がつくと、想像妊娠していてお乳が出始めていたとか。

動物行動学によると、哺乳類の赤ちゃんの可愛らしさは全哺乳類に可
愛らしさを感じさせるようです。赤ちゃんを産んで母性が強くなって
いるときに、その可愛らしさを見ると受け入れる母親はあるようですね。

可愛らしさは赤ん坊が生きるための武器です。
可愛らしくな...続きを読む

Q売上日性別売上施設交通機関年齢単価

売上日性別売上施設交通機関年齢単価
1月7日男売店電車801000
1月6日女喫茶店車702000
1月5日男休憩室電車603000
1月4日女売店車504000
1月3日男休憩室電車405000
1月2日女喫茶店車306000
1月1日男売店電車207000
2月1日女休憩室車108000
2月1日男部屋電車09000
2月2日女お土産屋車4010000
2月3日男喫茶店電車3011000
2月4日女売店車3012000

エクセル2007で上記のような表を作りました。

この後、売上施設ごとの単価を一発で出したいのですが、関数(IF関数とか)で処理すれば早いか
ピボットテーブルで処理するのが早いか、迷っています。

性別ごとの単価を見たいとか、月ごとに単価を見たいと思えば、やはりピボットのほうがいいのでしょうか。

初心者ですいません。お願いします。

Aベストアンサー

作業列を作って関数のみで表示させるようにしてはどうでしょう。
例えばお示しの表で1行目は項目名でA1セルの売上日からF1セルの単価まで入力されており2行目から下方にそれぞれのデータがあるとします。
施設ごとの単価の場合には施設が仮に5施設まであるとしたらG列からK列までを作業列にします。なお、売上施設、交通機関、性別、売上日など単価を調べたい項目の見出しはL1セルに入力することとして、仮にL1セルに売上施設と入力した場合にそれぞれの施設の名称はM1セルに売店、N1セルに喫茶店、O1セルに休憩室などと入力することにします。
また、L1セルに売上日と入力した場合にはM1セルに1月、N1セルに2月、O1セルに3月などと入力することにします。
さて、作業列ですがG2セルには次の式を入力してK2セルまでオートフィルドラッグしたのちに下方向にもオートフィルドラッグします。

=IF(OR($A2="",$L$1="",M$1=""),"",IF($L$1="売上日",IF(MONTH($A2)=SUBSTITUTE(M$1,"月","")*1,MAX(G$1:G1)+1,""),IF(INDEX($A:$E,ROW(A2),MATCH($L$1,$A$1:$E$1,0))=M$1,MAX(G$1:G1)+1,"")))

そこで単価をM列から右の列を使って表示させるのですがそのためには次の式をM2セルに入力した後でQ2セルまでオートフィルドラッグしたのちに下方向にもオートフィルドラッグします。

=IF(OR(M$1="",ROW(A1)>MAX(G:G)),"",INDEX($F:$F,MATCH(ROW(A1),G:G,0)))

このようにすることでご質問の内容のすべてを解決できるように思います。一度お試しください。

作業列を作って関数のみで表示させるようにしてはどうでしょう。
例えばお示しの表で1行目は項目名でA1セルの売上日からF1セルの単価まで入力されており2行目から下方にそれぞれのデータがあるとします。
施設ごとの単価の場合には施設が仮に5施設まであるとしたらG列からK列までを作業列にします。なお、売上施設、交通機関、性別、売上日など単価を調べたい項目の見出しはL1セルに入力することとして、仮にL1セルに売上施設と入力した場合にそれぞれの施設の名称はM1セルに売店、N1セルに喫茶店、O1セ...続きを読む


人気Q&Aランキング

おすすめ情報