• ベストアンサー

ロータス機能のエクセルでの実現について

 ロータス123では、データベース関数の条件式をデータベース内のデータ個別に変更することが可能(データベース関数の条件式がデータ個別に変更可能)でしたが、エクセルでは条件式をセルで表現しなければならないので、困っています。  例  1000人分の生年月日が入力されたセルがあり、現在年齢を算出し、ある年齢のデータ数を数える。  このような場合、123ではデータテーブルに一切触らずに1セル1行の関数で計算できたのに、エクセルでは別に1セルを年齢計算結果として使用せざるを得ず、テーブルの様式やシート構造を変更できないデータの場合困っています。  123の例 DSUM関数の条件式にDGET関数とDATEDIFF関数を組み込む  今のところ、全てVBAで組んでいます(VBAで年齢計算し、セル書き出し)が、後々の担当者のことを考えるとできたら関数で表現したいのですが、どなたかお分かりの方がいらっしゃったらお教えください。

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

  • ベストアンサー
  • O_Denwa
  • ベストアンサー率26% (46/172)
回答No.5

>エクセルの方が遅れているのでしょうか。 どーでしょうね。 普及率から良くとExcelの天下ですし、機能も充実してますから。 そのぶん。わかりにくい関数の動きは採用されないのかもですね。 >条件範囲がシート上に残ってもかまわないのです。 なら、条件範囲を入力用と実際に使う用。二箇所用意し、 入力部分には、年齢をそのまま入れて、 それを実際使う用の条件範囲部分で、入力年齢ぶん昔の日付に置き換える。 (ある年齢。で求めるなら、その年齢ぶん昔の本日から、その1年後のフタツの日付が必要) っで、置き換えた日付を条件として使い、リストからカウント。 とかだめでしょうか? 平たく言うと、年齢から、誕生年月日を求めて、 それをつかい、生年月日リストを数えるって事です。 ややっこしそうですけど(汗

wedge
質問者

お礼

 それだあ!  ありがとうございます。  年齢を出して比較するのではなく、最初から年齢から逆算した範囲と生年月日とを比較すればいいんのだなんて、思いつきもしませんでした。  目からうろこがとれた思いです。ありがとうございました。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

#1,#2で補足要求したものです。 #1では補足解答では「Criteria」の部分を、 #2では「中間結果的データの列」が邪魔だと、別の答えになっているように思います。どちらが一方ですか両方ですか。 「Criteria」のセルも、表上に残るから、見る方が見やすいのであって、デメリットではないと思う。 「Criteria」に関しては、各行ごとにC1:C2 、D1:D2、E1:G2、・・・と使い分ければ出来そうだが、それでは不可ですね。 D   E    F   G 年齢  年齢   年齢  性別 >40 >35  >30 2  「テーブルの様式やシート構造を変更できないデータの場合」でも余白範囲は使ってもいいのではないですか。あるいは別シートにコピーして、仕事してますよ。 ●DGETそのものやその他一時的配列(ベクトル?)に蓄えられるような方法があるか勉強してみます。 エクセルにもDGETがありますが、普通の使い方では、やはりCriteriaの範囲はシート上に要るようです。

wedge
質問者

補足

 回答ありがとうございます。  条件範囲がシート上に残ってもかまわないのです。  (実際、条件が極めて複雑なため、現在の集計用シートではEH列まで使って条件セルを生成しています。)  でも、データベーステーブルは一切いじれないのです。5年間に及ぶ自動化の努力により、多数のアプリが追加された結果、さまざまなアプリが参照しており、このエクセルのデータも他のアプリが参照する結果、1列増やすだけで、膨大な修正個所の検索が必要になってしまいます。実際は、どこを修正してよいか分からなくなっている状態です。  また、人事異動の結果、使用する職員がまったくの初心者(マウスすら握ったことがない)である場合が多く、他の部署にいる私が、いつまでも面倒を見ることはできません。関数ぐらいなら理解してもらえると思います。  エクセルファイルのLOADが発生したときに、データ数を数え、他のシートにコピーし、そのシートで1列余計に使うというような動作をすれば解決するとは思いますが、そうするとまたVBAでスクリプトを書くこととなってしまいます。そうなると初心者の理解は不可能でしょう。  質問の解決は、無理でしょうか。自分なりにいろいろトライアルしたのですが・・

  • O_Denwa
  • ベストアンサー率26% (46/172)
回答No.3

>1000人分の生年月日が入力されたセルがあり、現在年齢を算出し、ある年齢のデータ数を数える。 A1に”生年月日”というタイトルが入るとして、 A列のA2以降に生年月日が入っている状態だとしたら、 123なら、その状態で別セルに @DCOUNT(A1..A65536,"生年月日",@DATEDIF(A2,@NOW,"y")=ある年齢) とすれば、リストから「ある年齢」の人の数が求まりますよね。 DSUMやDGETというのを使用しているところを見ると、ちょっと違うのかもしれませんけど。 ※「ある年齢」は、当然ですけど、年齢を示す数字。 これをExcelの関数で表現するには。。。。 別のセルへそれぞれの年齢を出して数えるくらいしか思いつきませんでした(汗

wedge
質問者

補足

この場合、実際に使用した記述は、 @DCOUNT(データベース範囲,"生年月日",@DATEDIFF("生年月日",@NOW,"y")=ある年齢#AND#他の条件......) としていました。 エクセルの方が遅れているのでしょうか。 123が失われて苦労しています。 エクセル長所は、ソートが1000倍くらい早いことと、アクセスなどとの連携がスムースなこと以外思いつきません。(ToT)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

質問はこう言うことですか。例えばA1からA10まで 生年月日 1964/2/13 1984/5/31 1942/10/29 1985/12/20 1943/1/31 1942/9/11 1967/7/13 1956/12/31 1993/1/25 とし、B1に年齢、B2に演算式「=DATEDIF(A2,TODAY(),"y")」をいれ、B10まで複写する。 B列はB1からB1まで 年齢 38 18 59 16 59 59 35 45 9 となる。 C1からC2に 年齢 >40 と入れ、(例えば)C7に「=DCOUNT(A1:B10,B1,D1:D2)」 とすると、C7は「4」になる。 ●この場合B列が必須なのが邪魔である。B列を使わないで、同じ結果を(演算式で)出来ないかと言うことでしょうか。

wedge
質問者

補足

 そうです、下記の補足をお読みください。  1列増やせれば問題などないのですか゛・・  123ではいとも簡単だったのに・・・

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

下記表現個所に当たる関数式の実例1,2で挙げていただけませんでしょうか。やり方を教えてくれる方が出るかもしれないと思います。 (1)条件式がデータ個別に変更可能    セル内容のリテラルで書きこめるって事ですか。 (2)1セル1行の関数で計算できたのに、エクセルでは別に1セルを年齢計算結果として使用せざるを得ず (3)DSUM関数の条件式にDGET関数とDATEDIFF関数を組み込む ●一般的には下記が出来るので大きな差はないはず。(私見では123が先生格で、エクセルも追いついている部分が関数の 数などに見えると思いますが、)下記では対処できないケース なんでしょうか。   ・関数式のネストが可能。   ・通常は数値文字列を入れるところへ関数式を入れられる   「ケースがある」。   ・一般的には数値やA1表現A1:A10表現や範囲名   、セル名表現が可能です。   ・先ほど解答した別件質問のINDIRECTのように    間接的に出来るが故のメリットもあります。範囲などを    むしろ間接表現をもっと認めて欲しいぐらいです。

wedge
質問者

補足

 説明不足でもうしわけありません。  エクセルのDSUM関数は、Criteriaにセル範囲を指定しなければなりません。  この条件は、外部表現形式が文字列式であれば、内部保持形式がどのようなものてあっても条件として認識します(数値でもtext関数などで文字に変換し、+"<"などを付加する文字列式化しても、表現形式が文字列式であれば条件認知が可能)ですから、条件式を変化させることはできますが、データごとに条件式を変更することができません。データベース関数と条件は1:1でしかありません。  たとえば、DSUMがデータベーステーブルをサーチしている場合に、今まさにサーチしているデータを元に計算された結果を条件式とすることは、セル範囲を条件としている以上、できないと考えます。  たとえば、生年月日データがある場合に、その生年月日から計算された年齢により、条件式を変化させるなどは、データの数だけ条件セルを設けるか、別途1列を設けて、年齢計算結果を収納することになります。  条件セルに「<15」15歳以下とした場合に、別にセルを設けないとした場合、比較対照先の年齢はどこで計算するのでしょうか。(別途1列を設けて、年齢計算結果を収納していれば、単にそれとの比較ですみますが・・・)  一方、123では、DSUMの条件式にデータベース関数を組み込むことができ、データごとに条件式を変化させることができます。DSUM条件は、関数内に直接記述しますから、このような問題が発生しないこととなります。  たとえば、現1サーチデータについて、年齢計算し、それを条件比較対照とすることができます。DSUM(,,DATEDIFF(DGET()))  このように、条件比較対照を、セル列の増加なくデータごとに計算式化できないかということです。