プロが教える店舗&オフィスのセキュリティ対策術

下の表を数式で右(G)のように並べ替えたいのですがご教授お願い致します。

A  B  C         G
1  0  0         1
2  0  0         2
3  1  a         a
4  0  0         3
5  1  b         4
6  0  0         b
7  0  0         5
8  0  0         6
9  1  c         7
10  0  0         8
-------------------------------- c
-------------------------------- 9
-------------------------------- 10

どうしても4の処で引っかかってしまいます。
よろしくお願いいたします。
------- はG列が左に寄ってしまうので書いてます。
無視して結構です。

A 回答 (4件)

ん?…


こちらではきちんと並んだのですが…

D列は上から順に1,2,4,5,7,8,9,10,12,13と表示されてますでしょうか?

G列の
=IF(COUNTIF(AD:AD,ROW())=0,INDIRECT("AC"&MATCH(ROW()-1,AD:AD,FALSE)+1),MATCH(ROW(),AD:AD,FALSE))
は入力ミスなく一致していますね?
aが入力されているのはC3、bはC5、cはC9で、その左は1、B・C列の他の行は0、A列は行番号ですね?

とりあえず中身を分解して確認してみましょう。
表示のずれている3行目の、どの列でもいいので、次の式を入力して、それぞれに表示されるものを教えてください。

=COUNTIF(D:D,ROW())
これはD列にその行番号が含まれている数を算出しています。3は含まれていないハズですので0であれば正解です。

=MATCH(ROW()-1,D:D,FALSE)
これは1つ上の行の行番号がD列の何行目にあるかを表示させる式です。
2行目の2なのでD2で一致し、2が表示されれば正解です。

=INDIRECT("C"&MATCH(ROW()-1,D:D,FALSE)+1)
これは先ほどの2に1を加えて3とし、C3のデータを表示させるものです。
C3はaであるので、aが正解です。

=MATCH(ROW(),D:D,FALSE)
これはCOUNTIFが0でなかった場合の式です。
なので確認する必要はないと思いますが、
そのセルの行番号をD列で検索し、何行目にあるかを表示します。
3はD列にないはずなので、エラーが正解です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
表が1つずつ下がっていました。
上げたら順番通りに並びました。

感激です。
あとは実務に合わせて改良するだけです。

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

お礼日時:2017/04/15 14:38

失礼しました。

説明のみでD列の式が書けていませんでしたね。

D1=ROW()+SUM(B$1:B1)
これを2行目~データのある一番下の行までコピーします。
D列が使えない場合は、好きな列に変更し、
↓の式の3つの『D:D』を、その列に変更してください。

G1=IF(COUNTIF(D:D,ROW())=0,INDIRECT("C"&MATCH(ROW()-1,D:D,FALSE)+1),MATCH(ROW(),D:D,FALSE))
これを2行目~『A列のデータの数+C列の0でないデータの数』行目までコピーします。
具体的に何行目まで必要かは『=MAX(A:A)+SUM(B:B)』とどこかのセルに入力すればわかります。
    • good
    • 0
この回答へのお礼

たびたび、ありがとうございます。
ご指示通りDとGにコピーしたのですが
どうしても3とaの3の方が先に来て3の次にa
となってしまいます。
123a45b・・・
aを先にして
12a34b5・・・
としたいのですが。。

なんか胃が痛くなってきました。(T_T)

お礼日時:2017/04/15 13:00

こんばんは!



規則性がよく判らないのですが・・・
お示しの配置通りになるようにやってみました。
VBAでの一例です。

Sub Sample1()
Dim i As Long, c As Range
Range("A:A").Copy Range("G1")
For i = Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1
If Cells(i, "B") <> 0 Then
Set c = Range("G:G").Find(what:=Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
c.Insert shift:=xlDown
c.Offset(-1) = Cells(i, "C")
End If
Next i
End Sub

※ マクロを実行すると
とりあえず質問文通りの配置になると思います。m(_ _)m
    • good
    • 0
この回答へのお礼

うーん・・・

凄いですね。
ボタンに張り付けて実行したんですが完璧です。
BC列を上下させて変更しても対応出来ています。
ただ、マクロではワンクリックいるので数式でお願いしたいです。
実務ではもっとややこしいので参考にしながら変更しようと思っているものですから。
今の私ではマクロをいじれません。
お宝を前に恐縮です。

お礼日時:2017/04/15 01:34

ぱっと見でどういう並べ方をしたいのかが分かりにくいですが、


C列が0以外の場合はB列が1になっていて、
A列は行番号が表示されている、
G列には、C列に0以外のデータがあった場合に、
「その行の行番号と、その1つ前の行番号の間」にC列のデータを挟み、
上から順に並べたい。
ということでよろしいでしょうか?

D列を作業用として説明します。
D列が他のデータなどで使えない場合は、H列でもZ列でも空いている列に置き換えてください。
D列に、その行の行番号をG列の何行目に表示させたいのかを表示させましょう。
具体的には、その行の行番号に、その行までのB列の合計を足せばいいですね。
(5行目であれば5+2で7、G列の7行目が5ですね)

そして、G列では、そのセルの行番号がD列にあった場合、それが何行目であるかを、
D列になかった場合は、その上のセルの行番号があった行の1つ下の行のC列のデータを、
それぞれ表示すればいいわけです。
C列にデータが連続であったとしても、必ず間に行番号を挟むハズなので。

=IF(COUNTIF(D:D,ROW())=0,INDIRECT("C"&MATCH(ROW()-1,D:D,FALSE)+1),MATCH(ROW(),D:D,FALSE))
先ほど説明した内容を式にしたものです。
"C"&MATCH(ROW()-1,D:D,FALSE)+1 の部分は
"C"&『1つ上のセル』+1 (『1つ上のセル』はセル番地で指定。G2に入力する式であればG1)
としたいところですが、1行目にもデータがあるようなので、
(0行目のセルを指定できないため)1行目だけ式を変換させる必要が生じ、
式を統一するために、あえて同じ内容の式を作り直しています。
(ROW()は入力したセルの行番号を取得するので、-1を加えています)

そのセルの行番号で、対象行全体を検索する式になっていますので、G列全ての式が上記の式そのままとなります。
    • good
    • 0
この回答へのお礼

うーん・・・

早速のご返答ありがとうございます。
優しい文章であるにも関わらず私にはよくわからず只今どうすればいいのか四苦八苦しております。
理解するのに時間がかかります。
もう少しお待ちください。

お礼日時:2017/04/15 01:22

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