• 締切済み

エクセル 関数 データを並び替えに合わせる

元シートC列にID番号があり、EC列まで受注情報や顧客情報が入っています。 C列のIDは重複、空白が混ざっています。 シートはロックをかけており、マクロのみで行の追加が行えます。 同じ顧客が複数受注することがあるので、マクロで行追加をする際には、選択行の真下に選択行を丸々コピペし、受注内容だけを削除するようにしています。 行の削除は管理者のみが行えます。 並び替えはIDや会社名など数列、マクロで行えるようになっています。 しかし顧客情報を変更する場合は複数行忘れずに変える必要等の不便があるので、別シートに各IDのデータを集めた顧客シートを作成し、そこから読み込むようにしました。 ユーザーフォームで元シートから情報を読み込み、編集は顧客情報の部分は顧客シートへ、受注内容は元シートへ記述します。 現時点では元シートへの直入力もできる状態です。 顧客シートはA列にIDを表示し、 =IF(COUNTIF(元!C$5:C6,元!C6)>1,"",元!C6) をドラッグして、元シートにIDが追加されても重複しないIDを表示し、その隣へ顧客情報を並べています。 ところが、元シートをIDやその他の列で並び替えた時、顧客シートで読み込んでいるIDも並び替わってしまい、その横の顧客情報と一致しなくなってしまいます。 1. 元シートを並び替えた時、顧客シートの情報はIDとマッチさせたままにする 2. 元シートに新規追加した際、IDが空白の場合は、仮IDとして自動で【仮1】などを順に振っていく。後で編集可能 顧客シートは現在A列が元シートから引っ張ってきたIDですが、ID列以降横に顧客情報が並べられれば、A列の前に作業列を数行挿入してもOKです。 新規顧客は初めからIDが無いため、ID無しでその他の顧客情報を記録するところから始まります。 しかし顧客情報はIDを基に管理したいので、ID発行までは仮IDを自動で振りたいと思っています。 どうぞ宜しくお願いいたします。

みんなの回答

noname#208392
noname#208392
回答No.4

#2です。 失礼。間違えて理解していました。 そうしたら、もう一つ中間シートを作ったらどうでしょう。 中間シートは元シートのIDの列をリンク貼り付けしたシートです。どんどん増えていくのですから、空白行でも構わず中間シートに張り付けておくことを想定しています。 顧客シートは中間シートを参照します。 =IF(COUNTIF(中!C$5:C6,中!C6)>1,"",中!C6) 元シートをソートしても、中間シートで見えているレコードの順番は変わらないはずです。でもリンクはもともとリンクされていたレコードを追いかけていくはずです(手もとにエクセルがないんで確認していませんが・・・)。 それで中間シートを参照して顧客シートを作れば、元シートのレコードの順番に影響されない、アイデア通りのシートが得られると思うのです。 うまくいかなかったら恥の上塗りだな・・・・・ごめん、あらかじめ謝っとく。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.3

実際のシートの様子をまだ理解できていませんが(おそらくもっと合理的な管理方法があるような気がします)、たとえば顧客シートのD3セル以下に顧客名が入力されているなら、この列を基準に重複のない番号だけを表示するようにし、重複しない場合はMATCH関数で元シートのたとえばE列の顧客名を検索し、INDEX関数で顧客名に対応するC列の値を求める数式にしてはいかがでしょう。 =IF(COUNTIF($D$3:D3,D3)>1,"",INDEX(元!C:C,MATCH(D3,元!E:E,0)))

noname#208392
noname#208392
回答No.2

なるほどそういう風にCountIfをつかうのですか。 面白いですね。いや皮肉じゃなく、本当に興味深いと思いました。 ところで、ご質問のようなケースの場合、よく使われるのがVLookUp関数です。 この関数はご存知でしたか?もしご存じだけれどもあえてそれを使わない理由があるのなら、この回答は外していますので読み捨ててください。 もしご存じでなければ・・・・・ この関数はよく使われるので、ググるといろいろな解説が見つかります。 いまググって一番上に出てきたものをご紹介します。 http://allabout.co.jp/gm/gc/297725/ 要するに、こういう風になります。 顧客シートは重複や空白なしの顧客リストです。IDとそれに付随する、名前とか連絡先とか担当者名とかそういうものが書いてあります。 元シートに顧客IDを入力すると、その入力したIDのある行を顧客シートから探してきて、その行の目的のセルの記載内容を吐き出すのがVLOOKUP関数です。 使い方のイメージはこんな風です。 =VLOOKUP(顧客ID,顧客リストの範囲,『顧客名』,FALSE) 『顧客名』のところを、連絡先とか、 担当者名とかに代えて使います。 最後の引数はFALSEにしておくと、新規顧客の場合IDがないのでエラーを返してきます。 どうでしょう。これがご質問の状況でうまい解決策になると思うのですが。 ただ、私自身はVLOOKUPなんか使いません。 それが使いたくなったら、もうACCESSに移してしまいます。 そもそもおつくりになろうとしているのはデータベースです。 ACCESSならデータベース専用ソフトですから、お作りになっているような機能はもっと自然な形で実現できます。 だから、私の一押しのお勧めはACCESSを使うこと。

la-life
質問者

補足

有難うございます。 VLookUpは顧客シートから顧客情報を元シートへ読み込む際に使っています。 基本のIDが元シートにしている点がネックになっているのか、現状ではVLookUpで元シートから顧客シートに顧客情報を読込めません(逆に読み込んでいるので)。 IDと一緒に顧客情報を元シートから一斉に顧客シートへ移し、そこから読み込むようにすれば良いのかもしれませんが、同じ手の受注ファイルが幾つもある上に扱う人間も多数居るため、なるべくデータ移動は避けたかったのです。 Accessだと楽ですが、なにゆえ使う人間のコンピューター全てにそれぞれ購入しなければならないので、残念ながらそのオプションは無しなのです。。。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

>顧客シートはA列にIDを表示し、 =IF(COUNTIF(元!C$5:C6,元!C6)>1,"",元!C6) をドラッグして、元シートにIDが追加されても重複しないIDを表示し、その隣へ顧客情報を並べています。 数式の意味が理解できていないのですが、そもそも上記の他シートを参照する数式は自分のシートを参照する数式になっていませんので、参照先の元データを並べ替えたりすれば、当然のことですがその並び替えた値を基準にデータが表示されることになります。 どのような目的で、顧客シートに上記の数式を使用しているのか(何を表示したいのか)補足説明されると、代替案の数式が提示できると思います。

la-life
質問者

補足

早速のお返事有難うございます。 顧客シートのA列IDは元シートのIDを重複せずに並ばせたく、追加があれば自動的に追加されるようにするための数式でした。 顧客シートには、元シートのIDと顧客情報を重複無しでリストするのが目的です。 元シートには顧客シートから読み込んだ顧客情報が見えるようにしたいからです。 元シートを並び替えたら、顧客シートのIDも並び替わるのはわかりますが、その時に横に並ぶ顧客情報もIDと連動して並び替わるようにしたいです。 元シートに複数リストされているうちの一つを変更したら、同じIDの他の行の受注の顧客情報も同時に変更され、 新しい顧客を追加した場合は仮IDが自動で振られ、それを基に顧客シートの情報も追加、 ID発行後は仮IDから本IDに書き換えれば、顧客シートの情報も変わるようにしたいです。 顧客シートの情報はどんなID順に並んでいようとランダムに並んでいようと構いません。 なのでA列の横に何かワンクッション作業を入れたら、可能になるかな?と思いました。 使用中のデータを使うため、元シートにすべて入っている状態です。重複IDの場合はそれぞれの行に同じ顧客情報を入れています。 データ移動が大変なので元シートのIDベースにできたらいいなと思いましたが、ちょっと有効的ではないかもしれないと思っています。 本来なら顧客データもIDも顧客シートを基にし、元シートへ引っ張れば、元シートで並べ替えようが問題ないですよね。。。 その場合でしたら、空白IDの新規顧客の場合は仮IDを振っていく方法だけで済むかもしれません。

関連するQ&A

  • エクセル2007 データ抽出(関数)について

    教えてください。エクセルシートにて郵便番号と住所が重複しているデータを抽出したいのです。 例)ある顧客の情報として、シート1のA列に、1から10までの新規顧客の氏名、B列には生年月日が入力されています。C列,D列は空白で、E列には全ての顧客(新規顧客を含みます)の氏名、F列には生年月日、G列には郵便番号、H列には住所が入力されています。このふたつの情報の中から、新規顧客データと全ての顧客データの氏名、生年月日が重複している顧客のみ、C列にその郵便番号、D列に住所を表示させたいのです。 OSはXP エクセル2007です。 困っています。よろしくお願いします。

  • エクセル関数2

    シート(1) A B C D 作業列    コード    顧客名     金額 3        300001     A 10,000 3        300002   B 15,000 3        300003   C 20,000 3        300004   D 25,000 3        300005   E 30,000 4        400001   F 35,000 4        400002   G 40,000  4 400003 H 45,000 4 400004 I 50,000 4 400005 J 55,000         シート(2) A B C D E F 「1」 「2」 「3」 「4」 「5」 「6」 10,000 35,000 15,000 40,000 20,000 45,000 25,000 50,000 30,000 55,000 ※ シート(1)にコード、顧客名、金額を入力すると、シート(2)にあるように該当するコードの先頭行の列に表示するようにしたいと思っています。 シート1で作業列を作りその作業列を基にシート2でVLOOKUP関数を使い‥シート2の10,000のセルの場合、 VLOOKUP(C$2,sheet1!$A$3,$D$12,4,false)として、下にコピーすると同じ金額になってしまいます。 セルが空白にならず、シート1の金額が上から順番にシート2に表記されるようにするにはどうしたらよいでしょうか。マクロはできませんので、関数で詳しく教えて下さい。宜しくお願いします。

  • エクセル関数について

    お世話になります。 過去の質問と重複していたらすみません。 受注をまとめた表から、空白セル(受注0)以外の数値を抽出して 伝票を作成したいと考えています。例えば下記のように、 顧客1の例) A1   10 B1   5  C1   空白 D1   空白 E1   7 という受注の場合、別シートの伝票フォーマットに B2   10 B3   5  B4   7 B5   空白 B6   空白 と入力させたいのですが、 B2~B6にはどのような関数を入れたらよいのでしょうか。 説明不足かもしれませんが、ご回答頂ければ幸いです。 よろしくお願いします。  

  • Excel 2003 関数 教えてください

    使用するのはExcel 2003です。 マクロは使用せず関数で実行したいです。 お詳しい方教えてください。 1シート目に元となる表があります。 B列~D列までにあらかじめクライアント情報が入っており、クライアント情報の数の分、行数があります。 A列には、担当者名の入力欄を設け、入力規則のリストで担当者1~5まで選択できるようにしておきます。    A         B              C             D    担当者名    クライアント企業名   クライアント部署名   備考   1            ○○○          △△△          ***    2            ○○○          ◇◇◇          +++      3            ×××          ■■■          ---    2シート目以降、各シートは担当者1~5別のシートになっています。 2シート目 担当者1 3シート目 担当者2 4シート目 担当者3 5シート目 担当者4 6シート目 担当者5 こちらのシートには、1シート目と同じ項目がA~D列まで並んでいます。 A列にはあらかじめそのシートの担当者名が入っています。 全シート、1行目が項目、2行目から下がデータ欄です。 1シート目のA列で担当者名を選択すると、選択された担当者シートのクライアント情報欄(B~D列)に、1シート目該当行のクライアント情報が、反映されるようにしたいです。 その際、2行目から空白行を作らずに反映していきたいです。 作業用の列やシートを作成しても構いません。 マクロを使用したくない理由は、この表を配布する先の使用者のExcelが2003と2013で混在しているためです。 どなたかお知恵をお貸しいただけると助かります。 どうぞよろしくお願いいたします。

  • エクセル関数について

    質問です。下記のようなデータ管理をしているものがあり 集計を出したいのですが、うまくいきません。 1行目 A列   B列  C列 2行目 商品ID  商品名 商品名2 3行目 111   りんご   4行目 222   みかん  愛媛 5行目      すいか   6行目 222   みかん 7行目 444   いちご  熊本 8行目 空白予備列 9行目 空白予備列 10行目 空白予備列 条件:C列商品名2が入っていないもので A列商品IDが入っているものだけの数もしくはA列商品IDが入っていないものの数をカウントしたいのですが全セルを指定すると、空白予備列の空白までカウントされてしまいます。なので、条件としてはB列商品名が入っていてA列商品IDが入っているものだけの数もしくはA列商品IDが入っていないものの数をカウントしたいのですが、 何か良い方法はありますか? 色々やってみたんですがなかなかうまくいきません。 空白予備列を作っているのは今後どんどん増えていくので その為にいちいち範囲指定を行うのは面倒なので、 上記で出来る方法があればその方法でやりたいです。 どうか御願いします。

  • Excel検索等関数

    Excelのデータで同じ列の中に番号が重複している値を探し出しなおかつ任意の行数に出す関数はありますか? Sheet1   |Sheet2   A  B |   A  B        1 あ 10 | 1 あ  10 2 あ 11 | 2 あ  11 3 い 21 | 3 い  21 4 う 22 | 4      ←A4:b4は、「い」が2行ないので空白        | 5 う  22        | 6      ←A6:b6も、「う」2行ないので空白 このように、縦の重複したセルを検索して、指定行数内の場合は、空白となる関数式があればお教えください。

  • EXCELの関数を教えてください。

    シート1 A列には1と2 B列には名前 C列には備考1(入力のあるセルもあればないセルもあり)が入力されたシートがあるとします。行は無限です。 シート2への表示を A列に1が入力されていた時のみC列の備考欄に入力されている文字をかえし、空白の場合は空白にしたいのです。 A列に2が入力されている場合は全部が空白です。 IFとISBANKの組み合わせみたいな感じなんですがよく分かりません。宜しくお願いします。

  • エクセルの関数

    エクセルの関数ですが、 シート1の1行目は見出しが入っています。 C2~C267まで、あ店~け店までの9店舗の店名がランダムに入っています。 D2~D267まで、個人名が入っています。 いろんなデータが2行目から各列に入っています。 シート1のデータは日々更新します。 シート2にシート1のデータを反映したいのです。 シート2の1行目は見出し、 シート2のA2は あ店と入っています。A3~A54は空白(シート1に入っている あ店の個人は53人だという事でA3~A54は空白空白なっています。 A55に   い店  A56~A73は空白。 A74に   う店  A75~A93は空白。 A94に   え店 A95~A144は空白。 A145に  お店 A146~A161は空白。 A162に  か店 A163~A179は空白。 A180に  き店 A181~A212は空白。 A213に  く店 A214~A228は空白。 A229に  け店 A230~A254は空白。 シート2の  C列に シート1のM2から入ってる数値 0以下の人の名前をシート2のB2~B54までに データが0以下の人を入れ込みたいのです(よって、もし 0以下の人が10人だったら、B2~B11まで個人名が入って、B12~B54は名前は入らないて事になります) よって、シート2のB2~B54は、シート1の あ店のM列の 0以下の人を反映して表示したいのです 同じ要領で、シート2のD列にシート1のX列の数値の 1以上の人         シート2のE列にシート1のI列の数値の 1以上の人         シート2のF列にシート1の列の数値の 1以上の人 を反映して表示させたいのです このシート1は日々更新します シート2に随時反映するような関数を教えてください 宜しくお願いいたします

  • エクセル 関数を使わずにデータを取りたい

    EXCELを使ってデータ入力をしたいです。 下の図のように、シート1のA列にコードを入力すると、シート2のテーブルから値を引っ張ってくるようにしたい。 たとえば、シート1のA1に"C001"を入力したら、B1に"赤"が自動入力されるようにしたい。 シート1 A列 B列 行1 C001 シート2 A列 B列 行1 C001 赤 行2 C002 青 行3 C003 黄色 ただし、シート1のB列の値は、入力後に編集するため、ここには計算式を入れたくないのです。 なので、通常ならばB列にVLOOKUP関数を使えばすむことですが、計算式を入れずに上記を実現する方法を教えてください。

  • Excel VLOOKUPで複数の関数

    どなたかわかる方教えて下さい!! わかりにくい説明かと思いますが、よろしくお願い致します。 Aシートにコードが入力されています。 Bシートにコード、文字列、数値が入力されています。 AシートのコードでVLOOKUPを使い、Bシートから数値を呼ぶことはできるのですが、 数値が空白の場合は、空白にする。B列の文字も検索したい場合はどのようにすればよろしいでしょうか? 例 Aシートには、コード001が入っています。 Bシートから、コード001、「あ」の行を検索し、数値をもってきて、空白の場合は空白にしたいです。     A列   B列   C列   D列 1行  001   あ   10   空白 2行  001   い   20   30 3行  002   あ   30   空白

専門家に質問してみよう