みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL:複数シートから特定行を一覧化したい

会計簿を作成中です。
4月から12ケ月分の12枚のシートがあります。すべて同じ書式です。
この12枚のシートの「費目」の中から、例えば、「外灯費」だけを自動的に抽出して、一枚の新規シートに一覧表としてまとめたいのです。

これと同じ質問は、すでに、g00ta1a さんが、2011-09-28に投稿されています。これに対する回答の中から、KURUMITOさんの方法を試みました。 内容は理解できていないのですが、見よう見まねで。
   http://okwave.jp/qa/q7038820.html  参照

その結果、下の画像のように、一覧表を作ることができました。
しかし、困ったことに、4月分だけを抽出した時は、特に問題なかったのですが、これに5月分を加えたところ、どうもすべてのセルが文字化されているようで、日付とか、数字が思うように書式変換できなくて困っています。

どうかよろしくお願いします。

状況説明:
 1.環境:
    ・win7 Excel 2010

 2.セルへの入力式:

    1)4月分だけを抽出してみる:
       ・「日付」の下のセルに次式を入力。 以下、横、下方向にドラッグ。
         =IF(COUNTIF(会計4月!$W:$W,$B$4&ROW(A1)),INDEX(会計4月!$J:$Q,MATCH($B$4&ROW(A1),会計4月!$W:$W,0),COLUMN(A1)),"")

       ・この場合は、日付も数字も、あらかじめ設定した書式通りになりました。

    2)4月分に、5月分を追加してみる:
       ・同じく、「日付」の下のセルに次式を入力。 以下、横、下方向にドラッグ。
            =IF(COUNTIF(会計4月!$W:$W,$B$4&ROW(A1)),INDEX(会計4月!$J:$Q,MATCH($B$4&ROW(A1),会計4月!$W:$W,0),COLUMN(A1)),"")&IF(COUNTIF(会計5月!$W:$W,$B$4&ROW(A1)),INDEX(会計5月!$J:$Q,MATCH($B$4&ROW(A1),会計5月!$W:$W,0),COLUMN(A1)),"")

       ・この場合、日付欄は数字のままで、書式も日付になっているにも関わらず日付にならない。
       ・また、数字も、書式は数値なのに、文字化している。

3.今まで試みた対処法:

    1)セルを右クリック。「書式設定」の「表示形式」から」、「日付」、または「数値」にするが応答なし。
    2)リボン「データ」-「区切りの位置」から、次、次、と進み、「G/標準」で完了させるが、応答なし。
  

 以上、エクセル初心者の私には手が負えなくなりました。

投稿日時 - 2012-12-15 11:55:58

QNo.7845914

困ってます

質問者が選んだベストアンサー

>しかし、自動的に「5」を取得させる方法がわからないのです。「会計5月」シートの作業列のすべてに、「5」を入力しておけば何とかなると思ったのですが、うまくいきませんでした。

Excel では、「「一覧表」シート側で「会計5月」シートを「全く」指定することなく「会計5月」に何か入力しただけで「一覧表」にデータが反映されるという数式」は、存在しません。必ず、「一覧表」に「5」なり何らかの情報を入力し、「会計5月」というシート名を特定してあげる必要があります。

まあマクロで転記というのは考えられなくもないですが、それはシート間でのセルのコピペを手作業で行わず自動化しているだけのことですから、シートで数式を使うのとは違う話です。

それでも「5」を入力したくないということなら、やはり 1 本の数式に全 12 シートを指定する関数などを含めるしかないです。たくさんのシートに元データを分けてしまうと、苦労が多いです。また、参照元のシートの構造がどうなっているかも分からないので、残念ですが、こちらでの立式は困難ですね。現時点でも既に、受託業務のような様相を呈していますし…。

そうではなくて、「一覧表」シートに「5」を表示させるんだけれども、その表示を手入力ではなく「「一覧表」シートに入力した数式に行わせる」ということなら、可能なケースは多いです。ただ参照元とする各月のシートの状況が分からないという問題があるのは、この立式においても同じです。


>「""」を削除しただけですが、結果は、修正前の「""」の場合と同じく、文字列セル、空白セルは「#VALUE!"」になってしまいました。

「=(0&0)*1」という数式は、エラーになりません。エラー値の種類が「#VALUE!」だということは多分、2 つの IF 関数のいずれかが「""」の削除後もなお文字列だということでしょうね。

「会計5月」から持ってきているデータがそもそも文字列ということはありませんか?そうであれば、文字列になりそうな「一覧表」シート中の列については、No.8さんのおっしゃるように、「括弧と「*1」を除去」が良いと思います。文字列か否かを判定して「*1」をしたりしなかったりさせる数式は、どうしても長くなってしまいますので。

投稿日時 - 2012-12-16 13:00:56

お礼

これまでも何回かとご指導いただきありがとうございました。
また、これまで多くの方々にご提案をいただき、大変勉強させていただきました。この場で厚く御礼申し上げます。
また、入力画面の画像を同時掲載しなかったことを深くお詫び申し上げます。後からでは画像の追加変更はできませんでした。それだけに、皆様に大変なお手数とご迷惑をおかけしましたことを深くお詫び申し上げます。

最終的に、私の理解不足で、思い通りの結果は得られませんでしたが、ご提案の中でも私が最もよかったと思われる、本回答をベストアンサーとさせていただきました。

当面は、質問で書いた関数式を用い、日付は、Text関数で日付にした列を設け、金額入力の数字は、Value関数で数値化したセルを設けることで、元の不都合なセルを非表示にしてしまうという方法をとりたいと思います。

ありがとうございました。

投稿日時 - 2012-12-16 16:01:23

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(10)

ANo.9

 各月毎のシートのレイアウトを御教え頂けない様ですので、仮の話として、各シートのレイアウトを仮定した上で話を進めさせて頂きます。
 無論、実際のレイアウトとは異なるため、場合によっては正しく動作しない恐れも高いと思われますから、実際のレイアウトに合わせて、各関数を修正して頂く様御願い致します。

 今仮に、各月のシート名が

4月
5月
6月
7月
8月
9月
10月
11月
12月
1月
2月
3月

であるものとします。
 又、各月のシートにおいて、W列に費目が入力されていて、各列の6行目には「日付」や「支出の部」といった大分類の項目名が入力されていて、7行目には「費目」、「内訳」、「現金」、「口座」、「摘要」、「領収」といった大分類の項目名が入力されていて、実際のデータは8行目以下に入力されているものとします。
 同様に、抽出用のシート(ここでは仮にSheet1とします)において、表の左端がB列で、各列の6行目には「日付」や「支出の部」といった大分類の項目名が入力されていて、7行目には「費目」、「内訳」、「現金」、「口座」、「摘要」、「領収」といった大分類の項目名が入力されていて、8行目には年度合計を表示し、実際のデータは9行目以下に表示するものとします。
 又、Sheet2のA列~G列を作業列として使用するものとします。


 まず、Sheet2のA2以下(Sheet2のA2~A13)に「4月」、「5月」、・・・・・「12月」、「1月」、「2月」、「3月」といった抽出する元データが入力されているシートのシート名を入力して下さい。
 次に、Sheet2のB2セルに次の関数を入力して下さい。

=IF(ISNUMBER(MATCH("費目",INDIRECT("'"&INDEX($A:$A,ROW())&"'!W:W"),0)),MATCH(9E+99,INDIRECT("'"&INDEX($A:$A,ROW())&"'!V:V"))-MATCH("費目",INDIRECT("'"&INDEX($A:$A,ROW())&"'!W:W"),0),"")

 次に、Sheet2のC2セルに次の関数を入力して下さい。

=IF(ISNUMBER($B2),SUM($B$1:$B1),"")

 次に、Sheet2のB2~C2の範囲をコピーして、Sheet2のB3~C13の範囲に貼り付けて下さい。
 次に、Sheet2のF2セルに次の関数を入力して下さい。

=IF(ROWS($2:2)>SUM($B:$B),"",LOOKUP(ROWS($2:2)-0.5,$C:$C,$A:$A))

 次に、Sheet2のE2セルに次の関数を入力して下さい。

=IF($F2="","",INDIRECT("'"&$F2&"'!W"&$G2)&"◆"&COUNTIF(E$1:E1,INDIRECT("'"&$F2&"'!W"&$G2)&"◆*")+1)

 次に、Sheet2のG2セルに次の関数を入力して下さい。

=IF($F2="","",COUNTIF($F$1:$F2,$F2)+MATCH("費目",INDIRECT("'"&$F2&"'!W:W"),0))

 次に、Sheet2のE2~G2の範囲をコピーして、同じ列の3行目以下に(「全ての月のシートの行数」の合計数を上回るのに十分な行数となるまで)貼り付けて下さい。

 次に、Sheet1のB9セルに次の関数を入力して下さい。

=IF(ISNUMBER(MATCH(IF(B$7="","*?",B$7),INDIRECT("'"&VLOOKUP($B$4&"◆"&ROWS($9:9),Sheet2!$E:$G,2,FALSE)&"'!R7C"&MATCH(INDEX($B$6:B$6,MATCH("*?",$B$6:B$6,-1)),INDIRECT("'"&VLOOKUP($B$4&"◆"&ROWS($9:9),Sheet2!$E:$G,2,FALSE)&"'!R6",FALSE),0)&":R7C"&COLUMNS(9:9),FALSE),0)),INDIRECT("'"&VLOOKUP($B$4&"◆"&ROWS($9:9),Sheet2!$E:$G,2,FALSE)&"'!R"&VLOOKUP($B$4&"◆"&ROWS($9:9),Sheet2!$E:$G,3,FALSE)&"C"&MATCH(INDEX($B$6:B$6,MATCH("*?",$B$6:B$6,-1)),INDIRECT("'"&VLOOKUP($B$4&"◆"&ROWS($9:9),Sheet2!$E:$G,2,FALSE)&"'!R6",FALSE),0)+(MATCH(IF(B$7="","*?",B$7),INDIRECT("'"&VLOOKUP($B$4&"◆"&ROWS($9:9),Sheet2!$E:$G,2,FALSE)&"'!R7C"&MATCH(INDEX($B$6:B$6,MATCH("*?",$B$6:B$6,-1)),INDIRECT("'"&VLOOKUP($B$4&"◆"&ROWS($9:9),Sheet2!$E:$G,2,FALSE)&"'!R6",FALSE),0)&":R7C"&COLUMNS(9:9),FALSE),0)-1)*(B$7<>""),FALSE),"")

 次に、Sheet2のE8セルに次の関数を入力して下さい。

=SUM(E$9:INDEX(E:E,ROWS(E:E)))

 次に、Sheet2のE8セルをコピーして、Sheet2のF8セルに貼り付けて下さい。

 次に、Sheet2のH8セルに次の関数を入力して下さい。

=COUNTIF(H$9:INDEX(H:H,ROWS(H:H)),"○")

 次に、Sheet1のB9セルをコピーして、表内において、B9セルよりも右側にある全てのセル(添付画像の例ではSheet1のC9~H9のセル範囲)に貼り付けて下さい。
 次に、Sheet1の9行目のセルの中で、書式設定が必要なものに対しては、この段階でセルの書式設定を行って下さい。
 次に、Sheet1の9行目をコピーして、10行目以下に貼り付けて下さい。


 次に、「4月」、「5月」、・・・・・「12月」、「1月」、「2月」、「3月」といった各月のシートのにおける、「表が描かれている範囲の右隣の列」の7行目のセルに次の関数を入力して下さい。

=CHAR(32)

 これで準備は完了で、後はSheet1のB4セルに抽出したい費目を入力しますと、抽出結果が自動的に表示されます。

 尚、Sheet1のB9セルに入力する関数がここまで複雑なのは、各月のシートのレイアウトが不明であるのを、少しでも何とかしようとしたためであり、レイアウトが判明していれば、格段に簡略な関数でも事足りる筈です。

投稿日時 - 2012-12-16 04:22:50

お礼

私には、難しすぎて、どう理解してよいやらわかりませんでした。レイアウトも提示できていない状況下で、大変なお手数をおかけし申し訳ございませんでした。

わからないなりにも、ご指示の通り、関数式をコピーペーストして入力していきました。
結果は、何の応答もしませんでした。どこか間違ったところがあるのかもしれません。

折角ここまでご提示いただいたのに、力不足はいかんともしがたく、申し訳なく思っております。
本当にありがとうございました。

投稿日時 - 2012-12-16 15:33:27

ANo.8

1です。
まず・・MarcoRossiItalyさま、フォローありがとうございます。
中途半端にしか読んでいなかったため、言葉が足りなかったようです。
お礼とお詫びを申し上げます。


負け惜しみの強がりと思われても仕方ない言い方ではありますが、
1番で提示申し上げたモノをお試しいただいた際、
> 費目・内訳・適用欄の文字欄、及び、現金・口座欄の空白セルには、
> 「#VALUE」が表示されてしまいました。
との事でしたね。
ここは私の読み違いで「全体を括弧で」としたのがそもそもの原因ではあります。

が、これは素晴らしく簡単に解決出来ます。
> 費目・内訳・適用欄の文字欄、及び、現金・口座欄の空白セルには、
この「文字列が返る事が想定されたセル(列)」から
私が提示した「全体に括弧し、*1」を消せば良いだけです。
これだけで、#VALUE!エラーは解消できるでしょう。
作業列を作り、非表示にする手間は要らないと思いますよ。

ちなみに、補足中にVALUE関数を使う手法を書いていらっしゃいましたが、
それをごく簡易にこなすやり方が「()*1」だと思っていただいて構わないと思います。
ただし、括弧内が文字列だった場合にはエラーが返るので、ここだけ注意が必要です。
これはVALUE関数でも同様です。



さて、連なる回答・補足でのやり取りを拝読させていただきました。
その上で、失礼ついでに「苦言」を一つ発することをお許しください。

> VBAは私自身、まったくわからないので、関数で何とかしたいのです。
> 12か月分の関数式はものすごく長くなりますが、現在の関数式では、
> コピペでつないでいくだけですし、それに、この一覧表に限ってのことですから、
> 関数式の入力はさほど苦にはなりません。
と言う一文が引っかかります。
端的に理由を申し上げると、
「この手のモノで一番のネックとして出てくるのは、メンテナンスの問題」
と言う考え方が私には根強いからです。

ご自身で「初心者」「知識はこの程度」と繰り返していらっしゃいますが、
この「この程度の知識の初心者」が情報を寄せ集め、
意味が解らないままコピーして作った計算表を渡されて、
トラブルが起きたときにはだれがどのように対処するのでしょうか。
逆に、あなたがそれを渡されて、安心して使っていけると思うのでしょうか。

複雑な表は、メンテナンスも複雑になりがちです。
ご自身で作って、ご自身で使うなら、何の問題もありません。
ですが、コレは「他人さまに渡して使ってもらうモノ」なのですよね。
少なくとも、ご自身が表中で使った関数や計算式の意味だけは、
しっかり自分なりに噛み砕いて消化してから、他人さまに渡さなくちゃいけません。
その上で、トラブルがあった時は対処してあげないといけません。
当然の話ですが、それが「開発者」の義務です。


そんな厳密なモノではない、余計な世話、と思われるでしょう。
スルーしてくださっても、それでもかまいません。
私も個人的に言いたいことを言ってみただけですので。




言うまでも無いですが、
INDEX関数・MATCH関数は非常に便利ですが、
個人的には「初心者」の手に負える関数では無いと思っています。

初心者に一番作りやすい・使いやすい収支表の作り方は、
・一年分を1シートにまとめる
・必要に応じて月別にフィルタを掛け、コピー貼り付けして使う
申し訳ないですが、コレだと思いますよ。

投稿日時 - 2012-12-15 21:11:44

お礼

いろいろとご助言をいただきありがとうございました。

さて、ご提示いただいた、次の方法を試みましたが、私の理解不足で思うようにはできませんでした。

> 費目・内訳・適用欄の文字欄、及び、現金・口座欄の空白セルには、
この「文字列が返る事が想定されたセル(列)」から
私が提示した「全体に括弧し、*1」を消せば良いだけです。
これだけで、#VALUE!エラーは解消できるでしょう。

確かに、費目・内訳・適用欄の列では、「()*1」を消せば解消します。
しかし、日付の欄は、データがないセルにはすべて「#VALUE!」が表示されます。もっとも、会計簿で入力されれば、ちゃんと反映されますが。

特に、金額欄の空白セルに表示される「#VALUE!」を解消するための、
「文字列が返る事が想定されたセル(列)」から「()*1」を削除する方法がわからないため、相変わらず、「#VALUE!」のままです。もっとも、後付けで、「()*1」を削除していけば消えるのですが。

今のところ、私には、手間はかかるものの、作業列をつくり、元の列を非表示にする方法が一番確実な方法になっております。
空白セルが予測される列には、例えば「=IF(F16="","",VALUE(F16))」で対応しております。

大変なお手数をおかけしたことにお礼を申し上げます。

投稿日時 - 2012-12-16 13:41:20

>しかも、何個入るかわかりません。したがって、必要行数を読むことはできません。ということで、私の理解不足かもしれませんが、どうも私の考えているようにはならないようです。

行数は今のところ、問題にならなさそうです。

分かりづらくて失礼しましたが、No.2 では B13 セルに入力する数式を 2 案、示しましたね。2 本目の数式をもう一度ご覧ください。J 列に「5」(5 月の 5)を入力する場合の数式、としておりますね。つまり 4 月が何行になろうとも、4 月のレコード(行)には 4 を、5 月のレコードには 5 を全ての行に入力すれば、それぞれの行で該当するワークシートを読みに行くということになりますね。

まずはお試しになってからご感想をお願いいたします。


>逆に、……、「#VALUE」が表示されてしまいました。

おっしゃるとおり、その点も問題でしたね、すみません。空文字列「""」に「1」という数値を掛けてしまうと、エラーになってしまいます。

例えば、こうしてみてはいかがでしょう。No.1さんの式中、2 箇所ある「,""」を「,」と修正します。そうすると COUNTIF がゼロとなるケースでは、数式全体も空文字列ではなくゼロを算出するようになります。

ゼロをそのまま表示してもいいですが、したくない場合は、ゼロのときだけセルの書式で非表示にできます。具体的には、該当のセル範囲を選んだ状態で右クリックなどから「セルの書式設定>表示形式タブ>ユーザー定義>種類ボックス」に進み、「G/標準;-G/標準;」とか「[=0]"";G/標準」などと入力するだけです。ゼロでないデータについては、この書式が設定されていても表示されます。


ところで、No.2 の説明で一部、あまり適切でない表現がありました。次のとおり修正させてください。

× 2 つのうちいずれかの IF は、COLUMN が返す数値を返すと言っています

○ 2 つのうちいずれかの IF は、(COLUMN の値に応じて)INDEX が返す値(参照元が数値のときは数値)を返すと言っています

投稿日時 - 2012-12-15 19:39:29

お礼

ご迷惑をおかけしております。
回答No2の中で、二つの案が提示されていたのにもかかわらず、あれやこれやと迷っている間につい忘れてしまいました。申し訳ございませんでした。

今回、ご提示の二つの案の結果についてご報告いたします。

1.「=IF(COUNTIF(indirect("会計"&$J13&"月!"&"$W:$W"),・・・」の方法

ご指示の通り、K13に「5」を入力すると、うまくいきます。
「0」になったセルも、書式設定のユーザー定義から、空白になりました。
4月の欄には「4」をいれればばっちりできます。
この数字(4とか5)は、別の作業列に置いても(式中J13は変更)ちゃんとできました。

さて、ここから私の理解が及ばない点がでてきました。
上記の結果は、後から、「5」を入力するか、あらかじめ「5」と入力しておけばよかった結果です。

しかし、自動的に「5」を取得させる方法がわからないのです。
「会計5月」シートの作業列のすべてに、「5」を入力しておけば何とかなると思ったのですが、うまくいきませんでした。

2.回答No1の式中の2か所の「,""」を「,」に修正する方法

「""」を削除しただけですが、結果は、修正前の「""」の場合と同じく、文字列セル、空白セルは「#VALUE!"」になってしまいました。

以上、私の理解できた範囲での結果は上述の通りでした。
いろいろとお手数をおかけして申し訳ございませんでした。

投稿日時 - 2012-12-16 09:50:41

ANo.6

結果を表すシートの書式は添付の図からわかりますが、4月から12月まであるシートの書式がどのようになっているのかを示していただかないことには答えようが有りませんね。

投稿日時 - 2012-12-15 16:06:40

お礼

ご回答ありがとうございます。

回答No4のお礼の中でも述べましたが、画僧の追加方法を模索中なので、ご容赦ください。

これまでのご指摘の限りでは、私の思うようにはできそうもありません。そこで、一応、現在の関数式でも文字列の一覧表は作れますので、苦肉の策として、まわりくどい方法ですが、次の方法を考えております。

B列「日付」の左のA列に同じ日付欄を設け、「=Text()」で「日付」に変換する。そして、B列は非表示にしてしまう。

同様に、金額入力以降の、E,F,G,H列と同じ表を、H列の右側に作る。そして、I列,J列には「=Value()」で文字列を数値に変換する。K,M列には「=()」でコピーする。

以上の下準備をしてから、E,F,G,H列を非表示にしてしまう。

うまくいけばよいのですが。

ご指摘ありがとうございました。

投稿日時 - 2012-12-15 18:16:27

ANo.5

こんにちは!
直接の回答ではないのですが・・・

1か月・2か月程度なら関数でなんとか対応できるとおもいますが、
Sheetが12か月分(12Sheet)あるとかなり難儀な作業だと思います。

そこで一案です。
とりあえず入力用として一つのSheetに月に関係なくどんどん羅列していき、
必要項目でオートフィルタをかけ表示されたものだけを別Sheetにコピーするのが一番簡単だと思います。

どうしても12Sheetに分けなければならない!となればVBAが一番手っ取り早いのですが、
具体的なレイアウトが判らないので、ここでコードを記載してもあまりお役に立てないと思います。

この程度で、ごめんなさい。m(_ _)m

投稿日時 - 2012-12-15 15:12:39

お礼

早速の回答ありがとうございます。
会計簿を作る目的の説明が不足しておりました。

会計簿の利用者は、自治会の会計担当者です。そのため、エクセルに詳しくない人でも、数字の入力だけできれば、決算報告書、明細書、月別集計表、費目別一覧表がすべて自動で別シートにできあがっている(途中経過も見れる)という目的で作っております。
そのこともあって、入力画面は12か月に分けています。そうすることによって、初心者の私にとっては、月別集計表が作りやすいからです。

したがって、自分だけなら、ご指摘いただいたように、月ごとのデータをコピーペーストし、別シートに入力画面の一覧表を作り、あとはオートフィルタで出来上がりということになるのですが、この手作業をなくしたいのです。

VBAは私自身、まったくわからないので、関数で何とかしたいのです。
12か月分の関数式はものすごく長くなりますが、現在の関数式では、コピペでつないでいくだけですし、それに、この一覧表に限ってのことですから、関数式の入力はさほど苦にはなりません。

ありがとうございました。

投稿日時 - 2012-12-15 16:31:32

ANo.4

 それは、4月シートに関する表示を行う部分と5月シートに関する表示を行う部分を「&」で結んでいる事が原因です。
 解決方法に関してですが、元となる各月のシートがどの様なレイアウトになっているのかを示していただかない事には、効率の良い方法とするためにはどの様な関数とすれば良いのかを考える事が出来ません。

投稿日時 - 2012-12-15 14:19:15

お礼

ご回答ありがとうございます。
問題の原因が「&」であることは理解できました。

私は、今日、OKWaveに登録して、質問を初めてさせていただきました。そのため、質問の要領がつかめず申し訳ありませんでした。
質問では一枚の画像しか添付できないように理解しましたので、結果の画像だけしか示しませんでした。

シートのレイアウトも示したいのですが、「補足入力」や「お礼入力」から、画像の添付はできないようなので、どうしたら追加の画像を提示できるのか、模索中です。

ご指摘、ありがとうございました。

投稿日時 - 2012-12-15 17:48:30

No.2 です。No.1のtsubuyuki様、たいへん失礼しました。よく見ないで、括弧が付けられているのに、付いていないとか No.2 の最後で書いてしまいました。

ですから No.1 にお示しの数式できちんと数値になるはずです。申し訳ございませんでした。

投稿日時 - 2012-12-15 14:17:08

式中のセル参照の参照先がどうなっているかとか分からないので、全容は不明ですが、とりあえず見て分かることだけ書きますね。お示しの数式は、こうなっていますね。

=if(countif,index(参照,行番号,COLUMN),"")&if(countif,index(参照,行番号,COLUMN),"")

COUNTIF 関数の返す値がゼロでない限り、2 つのうちいずれかの IF は、COLUMN が返す数値を返すと言っています。ゼロの場合は、文字列(空文字列「""」)とするそうです。

したがって COUNTIF がゼロでなくて、なおかつセルに入力されている IF が 1 つのみである場合は、結果が数値であるため、日付などの書式によって、日付が正しく表示されると思います。

ところが上式では「=if&if」という形になっています。「&」は、複数の値(文字列、数値など)どうしをつなげた 1 つの文字列を生成するための演算子です。だから上式は、IF の返す値が何であれ、全体では文字列となってしまいます。その場合、セルの書式設定がたとえ「標準」などになっていても、値そのものが必ず文字列なのです。

試しに A1 セルに「1」、B1 に「2」、C1 に「=a1&b1」とか入力してみてください。結果は「12」になりますが、セルを右揃えに設定していなければ、左揃えで表示されるはずです。つまり数値ではなく、文字列の「12」だからです。

ですから「&」は使わず、次式に差し替えてみればうまく行くかもしれませんね。(行列番号などが適切でないかもしれないので確認してください)

B13 =IF(COUNTIF(会計5月!$W:$W,$B$4&ROW(A5)),INDEX(会計5月!$J:$Q,MATCH($B$4&ROW(A5),会計5月!$W:$W,0),COLUMN(A5)),"")
   あるいは
   =IF(COUNTIF(indirect("会計"&$J13&"月!"&"$W:$W"),$B$4&ROW(A5)),INDEX(indirect("会計"&$J13&"月!"&"$J:$Q"),MATCH($B$4&ROW(A5),indirect("会計"&$J13&"月!"&"$W:$W"),0),COLUMN(A5)),"")  ……「一覧表」シートの J13 セルに「5」(全角/半角の区別なし)と入力されている場合


なお No.1さんの方法ですが、残念ながらお示しのままの形では失敗しそうな気がします。けれど、簡単な修正で、成功する形にできると思います。つまり「「=(if&if)*1」」というふうに、括弧でくくってみてください。上に示した例においても、「=(a1&b1)*1」は数値になります。または「=--(a1&b1)」とか「=value(a1&b1)」とか、いろいろ書けますが。

ただ、この数式では問題だと感じる人も中にはいるかもしれないのは、2 つの IF がともに空文字列を返すケースの場合、数式全体がエラーとなるという点です。また、12 か月分を「&」でつなげるとすごく長くなりそうなので、そういう数式を用意するかどうかですね。

投稿日時 - 2012-12-15 14:12:04

お礼

ご回答ありがとうございます。

「=if&if」の形式が文字列を生成するための演算子であることを、平易に教えていただき、勉強になりました。私の知識は、この程度しかありません。だから丸のみで入力しております。

ご提案の、5月分の式を、B13に入力すれば、5月度の一覧表は問題なくできます。
この場合、各月毎に入力行数がわかっている場合には、4月度の終わりの行に続けて5月度の関数式を入力しておくということもできるでしょう。
画像では結果だけしか示さず説明不足でしたが、実際は費目の欄は、「外灯費」以外にも多くの費目が入ります。しかも、何個入るかわかりません。したがって、必要行数を読むことはできません。
ということで、私の理解不足かもしれませんが、どうも私の考えているようにはならないようです。

また、回答No1の方の方法を試みましたが、お礼の欄で書いた通り、思わしくありませんでした。

なお、会計簿の作成目的を、回答N05のお礼のなかで補足させていただきましたので、ご一読していただければ幸いです。

ご丁寧なご説明感謝いたします。

投稿日時 - 2012-12-15 17:33:37

ANo.1

サンプルを用意するのが面倒でしたので、
とりあえず、一つ試しに提案です。
上手くいけば万歳、上手くいかなかったら失笑してください。

=(IF(COUNTIF(会計4月!$W:$W,$B$4&ROW(A1)),INDEX(会計4月!$J:$Q,MATCH($B$4&ROW(A1),会計4月!$W:$W,0),COLUMN(A1)),"")&IF(COUNTIF(会計5月!$W:$W,$B$4&ROW(A1)),INDEX(会計5月!$J:$Q,MATCH($B$4&ROW(A1),会計5月!$W:$W,0),COLUMN(A1)),""))*1

こんな感じで、全体に「*1」をして、数値にしてみると上手くいくかもしれません。

投稿日時 - 2012-12-15 13:42:37

お礼

早速ご回答いただきありがとうおございました。
全体を()でくくり、*1で数値に変換してみました。

結果、今度はすべてのセルが数値になり、日付欄と、現金・口座欄の数字があるセルが日付に変わりました(現金・口座欄の日付は数値に変換可能)。

逆に、費目・内訳・適用欄の文字欄、及び、現金・口座欄の空白セルには、「#VALUE」が表示されてしまいました。
これを、書式設定から文字列にしてみましたが、応答なしです。また、「区切りの位置」から「文字列」に変換したところ、数式の文字になってしまいました。

現時点では、自分の考えているようにはできませんでした。
ありがとうございました。

投稿日時 - 2012-12-15 14:36:03

あなたにオススメの質問