• 締切済み

Excel 空白セルを詰めて表示する方法

<図1>     A     B 1   あいう 2         えお 3   かきく 4         けこ 5   さしす <図2>各行の空白セルを詰めて表示させる     A     B     10  あいう  けこ 11  かきく 12  さしす 13  えお 以前の投稿で以下のようなものはあったのですが、 上記のようにしたい場合、どの様な関数を組めばいいのでしょうか? ------以下,参考にした例------ <図1>     A     B 1   あいう 2         えお 3   かきく 4         けこ 5   さしす <図2>各行の空白セルを詰めて表示させる     A     B     10  あいう   えお 11  かきく   けこ 12  さしす 13 14 【関数】 A10: =IF(ROW(A1)>COUNTA(A$1:A$5),"",INDEX(A$1:A$5,SMALL(IF(A$1:A$5<>"",ROW($A$1:$A$5),""),ROW(A1))))

みんなの回答

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.12

お恥ずかしい限りですね もう解決しているとされる下段の式を書いていましたね、 取り急ぎ 上段用の式を5行表示ではありますが作りましたので お確かめください。 =OFFSET($A$1,MOD(10-LARGE(INDEX(($A$1:$B$5<>"")*(11-ROW($A$1:$B$5))-($A$1:$B$5<>"")*(COLUMN($A$1:$B$5)-1)*5,,),ROW(A1)+(COLUMN(A1)-1)*5),5),TRUNC((10-LARGE(INDEX(($A$1:$B$5<>"")*(11-ROW($A$1:$B$5))-($A$1:$B$5<>"")*(COLUMN($A$1:$B$5)-1)*5,,),ROW(A1)+(COLUMN(A1)-1)*5))/5),1,1) A10に此を入力、 A10:B14にフィルなどでコピーしてください エラー処理はしていませんが イレギュラー時はC1を参照するだけですから そもそもC1がヌルならばエラー処理も要らない… と、いうことで 敢えてしていません。 長くなってしまいましたが致し方ありませんね ところで お示し頂いた式 =IF(ROW(A1)>COUNTA(A$1:A$5),"",INDEX(A$1:A$5,SMALL(IF(A$1:A$5<>"",ROW($A$1:$A$5),""),ROW(A1)))) は、私の環境Excel2003では、動作確認が取れませんでした。 大体IF構文の使い方がめちゃくちゃなので、 はっと見で「ダメダメだ」と解る位の 低い次元の話しなのですが、 確認してみたらやはり駄目ですね。 恐らく2007でも駄目でしょう… 式中に配列数式のIFを使うのは本当に難しいレベル、 私自身避けて通る物ですから、 ね。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.11

済みません、式間違えていました。 お詫びの上訂正します。 誤記 =IF(SUMPRODUCT((A$1:A$5<>"")+0)<ROW(A1),"",OFFSET(A$1,LARGE(INDEX((A$1:A$5<>""),,)*(6-ROW(A$1:A$5)),A1)-1,0,1,1)) 正記 =IF(SUMPRODUCT((A$1:A$5<>"")+0)<ROW(A1),"",OFFSET(A$1,6-LARGE(INDEX((A$1:A$5<>"")*(6-ROW(A$1:A$5)),,),ROW(A1))-1,0,1,1)) A10に記入後 フィルなどでA10:B15にコピーしてください。 失礼しました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.10

最初の列では4行以下になってもよいものとして答えてましたが、4行にとどめたいとのことですね。 その場合にはC1セルに次の式を入力して、式を確定する段階でCtrlキーとShiftキーを押しながらEnterキーを押します。 その後に式をD1セルまで横にドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(COLUMN(A1)=1,IF(ROW(A1)>COUNTA($A$1:$A$5)+COUNTA($B$1:$B$5),"",IF(ROW(A1)<=COUNTA($A$1:$A$5),INDEX($A$1:$A$5,SMALL(IF($A$1:$A$5<>"",ROW($A$1:$A$5),""),ROW(A1))),IF(AND(ROW(A1)<=4,ROW(A1)<=COUNTA($A$1:$A$5)+COUNTA($B$1:$B$5)),INDEX($B$1:$B$5,SMALL(IF($B$1:$B$5<>"",ROW($B$1:$B$5),""),ROW(A1)-COUNTA($A$1:$A$5))),""))),IF(ROW(A1)<=COUNTA($A$1:$A$5)+COUNTA($B$1:$B$5)-4,INDEX($B$1:$B$5,SMALL(IF($B$1:$B$5<>"",ROW($B$1:$B$5),""),ROW(A1))),""))

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.9

失礼しました、式の使い方説明をし忘れました。 A10に先の式を書き込んで A10:B15の全体に フィルやコピーなどで広げてお使いください。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.8

=IF(SUMPRODUCT((A$1:A$5<>"")+0)<ROW(A1),"",OFFSET(A$1,LARGE(INDEX((A$1:A$5<>""),,)*(6-ROW(A$1:A$5)),A1)-1,0,1,1)) これで行けると思うのですけど… 如何でしょうか? お役に立てていたなら幸いです。 以下お遊び Option Base 1 Sub 抽出ベタ方() Dim カウンタ3 As String, カウンタ2 As Long, カウンタ1 As Long, 目 As Range, レンジ2 As Range, レンジ1 As Range, 字(1 To 5, 1 To 2) As String, 本頁 As WorkSheets   Set 本頁 = ThisWorkBook.ActiveSheets   With 本頁     Set レンジ1 = .Range("A1:B5")     Set レンジ2 = .Range("A10:B15")   End With   For カウンタ1 = 1 To 2     カウンタ3 = 0     For カウンタ2 = 1 To 5       If レンジ1.Cells(カウンタ2, カウンタ1) <> "" _       Then         カウンタ3 = カウンタ3 + 1         Let 字(カウンタ3, カウンタ1) = CStr(レンジ1.Cells(カウンタ2, カウンタ1).Value)       End If     Next カウンタ2   Next カウンタ1   For カウンタ1 = 1 To 2     For カウンタ2 = 1 To 5       レンジ2.Cells(カウンタ2, カウンタ1).Value = 字(カウンタ2, カウンタ1)     Next カウンタ2   Next カウンタ1 End Sub Sub 抽出() Dim レンジ1, As Range, レンジ2 As Range, カウンタ2 As Long, カウンタ1 As Long, 本頁 As WorkSheets   Set 本頁 = ThisWorkBooks.ActiveSheets   For カウンタ1 = 1 To 2     カウンタ2 = 0     Set レンジ2 = 本頁.Range("A1:A5").Offset(0,カウンタ1 - 1).SpecialCells(xlCellTypeFormulas)     If Not レンジ2 Is Nothing _     Then       For Each レンジ1 In レンジ2         カウンタ2 = カウンタ2 +1         Set 本頁.Range("A10").Cells(カウンタ2, カウンタ1) = レンジ1       Next レンジ1     End if   Next カウンタ1 End Sub

kamonekamone
質問者

お礼

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

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

こんばんは! VBAでやれば一発でできそうですが・・・ 関数での方法をご希望だというコトですので、 ↓の画像のようにD・E列を作業用の列とします。 D1セルに =IF(A1="","",COLUMN(A1)*100+ROW()) という数式を入れE5セルまでオートフィルでコピーしておきます。 そしてA10セルに =IF(COUNT($D$1:$E$5)<ROW(A1)+(COLUMN(A1)-1)*4,"",INDEX($A$1:$B$5,MOD(SMALL($D$1:$E$5,ROW(A1)+(COLUMN(A1)-1)*4),100),INT(SMALL($D$1:$E$5,ROW(A1)+(COLUMN(A1)-1)*4)/100))) という数式を入れ、列・行方向にオートフィルでコピーで画像のような感じになります。m(_ _)m

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.6

回答No2,3,4です。 C1セルには次の式を入力して、式を確定する段階でCtrlキーとShiftキーを押しながらEnterキーを押します。 その後にその式を下方にドラッグコピーします。 =IF(ROW(A1)>COUNTA(A$1:A$5)+COUNTA(B$1:B$5),"",IF(ROW(A1)<=COUNTA(A$1:A$5),INDEX(A$1:A$5,SMALL(IF(A$1:A$5<>"",ROW($A$1:$A$5),""),ROW(A1))), IF(ROW(A1)<=COUNTA(A$1:A$5)+COUNTA(B$1:B$5),INDEX(B$1:B$5,SMALL(IF(B$1:B$5<>"",ROW(B$1:B$5),""),ROW(A1)-COUNTA(A$1:A$5))),"")))

kamonekamone
質問者

お礼

回答本当にありがとうございます。 以下で試したところ     A     B 1   あいう 2         えお 3   かきく 4   けこ 5   さしす     A     B 1   あいう  えお 2   かきく  あいう 3   けこ   かきく 4   さしす  けこ 5   えお   さしす となってしまいます。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.5

そんなややこしいのを関数でやったら、検証もメンテナンスも大変です。 マクロでやってみました。 Sub Sample()   Dim rRange As Range   Set rRange = Range("A1:B5") '対象範囲を設定   nStartRow = 10 '貼り付け開始行   nCount = 4 '何行まで貼り付けるか      nDatRow = nStartRow   nDatCol = 1   For i = 1 To rRange(rRange.Count).Column     For j = 1 To rRange(rRange.Count).Row       If rRange(j, i) <> "" Then         Cells(nDatRow, nDatCol) = rRange(j, i)         nDatRow = nDatRow + 1         If nDatRow >= (nStartRow + nCount) Then           nDatRow = nStartRow           nDatCol = nDatCol + 1         End If       End If     Next j   Next i End Sub

kamonekamone
質問者

お礼

回答ありがとうございます。 事情があってマクロではなく関数で行いたいんです。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

回答No2です。 A列やB列の10行以内にデータが入力されているのでしたらC1セルには次の式を入力しD1セルまで横にドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)>4,"",IF(COLUMN(A1)=1,IF(ROW(A1)<=COUNTIF($A$1:$A$10,"*?"),INDEX($A$1:$A$10,ROW(A1)*2-1),INDEX($B$1:$B$10,(ROW(A1)-COUNTIF($A$1:$A$10,"*?"))*2)), IF(COLUMN(A1)=2, IF(ROW(A1)<=COUNTIF($A$1:$A$10,"*?")-4,INDEX($A$1:$A$10,8+ROW(A1)*2-1), IF(AND(ROW(A1)>COUNTIF($A$1:$A$10,"*?")-4,ROW(A1)<=COUNTIF($A$1:$A$10,"*?")-4+COUNTIF($B$1:$B$10,"*?")),INDEX($B$1:$B$10,(ROW(A1)-(COUNTIF($A$1:$A$10,"*?")-4))*2),""))))) 前回回答2の式でうまくいかなかったのはA列やB列でお示しのデータ以外に下の行の方にデータが入力されていたことによるものでしょう。

kamonekamone
質問者

お礼

何度も回答を入れてくださり本当にありがとうございます。     A     B 1   あいう 2         えお 3   かきく 4   けこ 5   さしす で試したところ (これ以下のセルには一切にデータはありません。) 以下の様になってしまいうまくいきません。     A     B 1   あいう   えお 2   かきく    3   さしす 4   0 5   

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

回答No2です。こちらでは式を入力して正しく表示されることを確認した上で答えています。ご自分で直接セルそれぞれにデータを入力して試験してみてください。A列やB列にはお示しのデータ以外にはないことを確認してください。 C1セルには次の式を入力します。 =IF(ROW(A1)>4,"",IF(COLUMN(A1)=1,IF(ROW(A1)<=COUNTIF($A:$A,"*?"),INDEX($A:$A,ROW(A1)*2-1),INDEX($B:$B,(ROW(A1)-COUNTIF($A:$A,"*?"))*2)), IF(COLUMN(A1)=2, IF(ROW(A1)<=COUNTIF($A:$A,"*?")-4,INDEX($A:$A,8+ROW(A1)*2-1), IF(AND(ROW(A1)>COUNTIF($A:$A,"*?")-4,ROW(A1)<=COUNTIF($A:$A,"*?")-4+COUNTIF($B:$B,"*?")),INDEX($B:$B,(ROW(A1)-(COUNTIF($A:$A,"*?")-4))*2),"")))))

kamonekamone
質問者

お礼

再度回答ありがとうございます。 確かに     A     B 1   あいう 2         えお 3   かきく 4         けこ 5   さしす の場合はうまくいきます。 説明が不足し申し訳ございません。 空セルの位置は可変となります。 つまり     A     B 1   あいう 2         えお 3   かきく 4   けこ 5   さしす の場合は     A     B 1   あいう 2   かきく 3   けこ 4   さしす 5   えお       の様に空セルの位置関係なく詰めて表示したいのです。

関連するQ&A

  • Excel 空白セルを詰めて表示する方法

    <sheet1>にある表をオートフィルタを使用せず,関数で<sheet2>のように空白を詰めた状態にしたいと思っています。 <sheet1>    A    B   C 1 100 -100 2 100 -100 3 -200 100 100 4 5 <sheet2>    A    B   C 1 100 -100 -100 2 -200 100 100 3 100 4 以前に似た質問があり,それを参考にやってみたのですがどうもうまくいきませんでした。文字列と数値では式も変わるものなのでしょうか?参考にした例もあげておきます ------以下,参考にした例------ <図1>     A     B 1   あいう 2         えお 3   かきく 4         けこ 5   さしす <図2>各行の空白セルを詰めて表示させる     A     B     10  あいう   えお 11  かきく   けこ 12  さしす 13 14 【関数】 A10: =IF(ROW(A1)>COUNTA(A$1:A$5),"",INDEX(A$1:A$5,SMALL(IF(A$1:A$5<>"",ROW($A$1:$A$5),""),ROW(A1))))

  • EXCEL関数 空白セルを詰める関数

    図1の表を図2のようにオートフィルタを使わず表示させる関数で下記を見つけましたが、実際使うときには、番地がA1からの位置ではなくAA60ぐらいの位置でこの関数を実行すると表示されません。 どの部分をその番地にあわせるとよいでしょうか? <図1>     A     B 1   あいう 2         えお 3   かきく 4         けこ 5   さしす <図2>各行の空白セルを詰めて表示させる     A     B     10  あいう   えお 11  かきく   けこ 12  さしす 13 14 【関数】 A10: =IF(ROW(A1)>COUNTA(A$1:A$5),"",INDEX(A$1:A$5,SMALL(IF(A$1:A$5<>"",ROW($A$1:$A$5),""),ROW(A1)))) Ctrl + Shift + Enterキーで式を確定します。 右と下にコピーします。

  • エクセル 空白を消す関数 IF?

    エクセル2002を使っています。 A1のセルに「あい うえお」 A2のセルに「かきく けこ」 A3のセルに「さ しすせそ」…と200行入力してあります。 空白(スペース)を消したいのですが、スペースが入っている位置はまちまちなので、リプレイス関数は使えません。 何とか関数を使って、空白を消す事は出来るのでしょうか? 私が思いついたのはIF関数で、『もしA1のセルに空白があったら空白を消す』と命令できるかも・・・と思ったのですが、式がどのようになるのか分からないし、もっと簡単な、もしくは別の関数があったらぜひ知りたいです。

  • 空白セルのとき0表示を消す方法(エクセル2003)

    例えば、      A     B     C     D・・・・・・ 1    10    20    0     30 2                   0 ・ ・ D1に、=A1+B1+C1 D2に、=A2+B2+C2の計算式が入っている時 A2,B2、C2が空白セルのとき、D2に0を表示したくない(空白セルにしたい)です。 過去の質問より、IF関数を使えばよいとわかったのですが、いまいちよくわからないため質問させて頂きました。 よろしくお願いします。

  • エクセル VLOOKUP関数で、あてはまるものをすべて表示させる方法はありますか?

    VLOOKUP関数で、式を入れると 選択した範囲の中で、一番最初の行に入力されているものが値として出てきます。 これをあてはまるもの、すべて表示されるようにはできないのでしょうか?     A     B      1  ゆり    100 2  ばら    150 3  きく    120 4  ばら    180 5  きく    160 6  きく    125 このような元データーがあったとして A100に  きく と入力するとします。 =VLOOKUP(A100,b1:c6,2,0) といれた場合、一番最初のきくのデーター、120のみが表示されますが、これをきくのデーターすべて、120.160.125と表示されてほしいのです。 できれば1つのセル内に表示したいのですが、これはエクセルでは不可能でしょうか? どうぞよろしくお願いします。

  • エクセル関数で空白および「””」を調べる方法?

    たとえば、式=""が入っているセルは、表面上何も見えませんがCOUNTAやCOUNTBLANKでは空白の扱いにはなりません。 これを空白と見るにはどうすればよいのでしょうか? 今、一定の範囲内で各行に、一箇所でも入力があればTRUE、なにもなければFALSEの判定をしたいのですが、式で「""」が表示されている(つまり表面上表示がない)セルは「空白」として扱いたいのです。 よろしくお願いします。

  • エクセルの空白を求めたいのですが。

    エクセルの空白を求めたいのですが。 例えば、 ・・A B C D E 1 4 2 3 8 4 5 6 4 7 8 9 2 10 A列の数字入力があるセルから、次のセルの入力値まで の空白の個数を関数で出来ますでしょうか? A9~A6 は空白が2個となります。 A6~A3 は空白が3個となります。 A列の 各行 には他のセルで計算された値を出しているので、 各行に現れる数値は、その時によって違います。(現れる数値は整数です) わかる方いましたら、宜しくお願いします。

  • 空白セルを非表示に

    A1:B50の範囲にデータが入っています。A1:A50までに空白のセルがあれば、その行を非表示にするマクロを組みました。 Dim rw As Integer Application.ScreenUpdating = False For rw = 1 To 50 If Range("A" & rw) = "" Then Rows(rw).EntireRow.Hidden = True End If Next Application.ScreenUpdating = True これをA1:B50の範囲でどちらか入っているデータの多い方に合わせて非表示にするときはどうなるのでしょうか。説明がヘタですみません・・・ たとえばデータの入っているセルが、 A列がA1:A10まで、B列がB1:B:15までで以下空白の場合、今のマクロではA列でしか空白を判定しませんよね?なのでA11以下は空白にされてしまい、B12:B15までのデータも一緒に非表示されてしまいます。 どうしたらよいか教えて下さい。

  • エクセル 文字が表示されたセルを抽出したい

    エクセルの関数を教えて下さい。    A     B     C     D   1 りんご              りんご 2       プリン        プリン 3             紅茶   紅茶 4 バナナ              バナナ 5      6             緑茶   緑茶 上記のような表があります。(A~は列、1~は行番号です) A1~C6までは、IF関数で、条件にあった場合に“りんご”などを表示、そうでない場合には空白と なるような式が入っています。 そして、D列のように、それぞれの行に表示されている文字を抽出、何も表示されていない場合は空白としたいのです。 D列にはどういった式を入れればよいかを教えて下さい。 ※各行に表示されるのは1つのセルのみで、例えばA1のセルとC1のセルに文字が表示される ことはありません。A1に文字が表示されている場合は、必ずB1・C1のセルは空白です。 宜しくお願い致します。

  • 空白セルを作りたい

    お世話になっています。 A1+A2+A3の合計をB1に表示させるとします。 A1、A2、A3には、それぞれ数字が入る場合も、未入力(空白)の場合もあります。 1、A1空白、A2空白、A3空白の場合、B1に空白。 2、A1空白、A2 数字、A3空白の場合、B1はA2の数字(空白を除いて足し算した値を返す)の式を作りたいと思い、B1に =IF(A1="","",IF(A2="","",IF(A3="","",SUM(A1+A2+A3))))としましたが、1はできますが、2ができません。A1、A2、A3どれかひとつでも空白セルがあると、B2は空白で帰ってきてしまいます。 足し算した値を返してもらうにはどうすればよいでしょうか。 関数のご指導お願いいたします。

専門家に質問してみよう