• ベストアンサー

空白セルを詰めたい

皆さん宜しくお願いしますm(_ _)m。次のような事をスマートに実現できるような方法を探しています。良い方法をご存じの方、お知恵をお貸し下さい。 【ExcelWorkSheet】     A       B      C  1  2 第1項目  第1項目  第1項目  3 第2項目          第3項目  4 第3項目  第3項目  第4項目  5 第4項目  第4項目  第6項目  6 第5項目  7 第6項目  第6項目 1.まずA列が開始データで、これは不動とします。 2.次にB列へ情報を条件付きで転記します。例えば=IF(条件,"",A2)ですね。 3.これをC列の様に、空白を詰めて表示したいのです。  2.の段階の条件は多様で、他の項目が空白になることもあり得ます。どの項目が空白になっても、結果としてC列には隙間無く詰まった状態にしたいのです。項目が数字の場合は割と簡単に実現するのですが、上記の様に文字列だと困ります(^^;)。  B列の第1項目~第6項目を一度1文に繋いで、それをC列の各セルに分解するという(^^;)強引な方法は思いついたのですが、もっとスマートな方法で実現させたいのです。  宜しくお願いしますm(_ _)m。

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

  • ベストアンサー
回答No.7

#3、#6で回答した者です。 何度もすみません。(回答者の皆様にもご迷惑おかけします。) 2行目からでしたね。 C2セル =IF(B2="","",ROW()) D2セル =IF(ISERROR(SMALL($C$2:$C$7,ROW()-1)),"",OFFSET($A$2,SMALL($C$2:$C$7,ROW()-1)-2,0)) にして下さい。 B列の条件式で、=IF(条件,"",A2)と入力してあるのを =IF(条件,"",ROW())とすれば C2セルに上記D2セル($C→$Bに変更)を入れて、 3列で出来るのではないかと思います。

OKWeb-O
質問者

お礼

3列で実現ですね(^^)。更に華麗な話に(笑)。頑張ってマスターします、より完璧なお答えをありがとうございましたm(_ _)m。

その他の回答 (7)

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.8

こんにちは。 OKWeb-Oさんが目指しているのは、入力規則でドロップダウンリスト(一般的にいうコンボボックス)がせっていしてあり、リストの内容を動的に変化させたい、ということではないのでしょうか? 入力規則機能を使うより、VBAのユーザーフォームを勉強されてみてはいかがでしょうか? 条件によって変化するコンボボックスなど、ある程度動的な処理も可能ですよ。

OKWeb-O
質問者

お礼

ありがとうございます(^^)。僕の説明が出来ていなかったのですが、VBAは配布時に問題が出るので採用出来ないという制約があったのです。Excelの基本機能だけでなんとかしないといけないので大変です(笑)。ありがとうございました。

回答No.6

#3で回答した者です。 #5さんの回答を見て私の方法も間違っている事に気が付きました。 (条件式も*で拾ってしまいました) 急いで考えたので大丈夫か少し心配ですが、こちらを試してみてください。 (1)C列にB列が[""]以外ならば行番号-1を表示する   C1セル =IF(B1="","",ROW()-1)   C2セル以降C1セルをコピー (2)D列にC列の小さい番号から順に表示する   D1セル =IF(ISERROR(SMALL($C$1:$C$6,ROW())),"",OFFSET($A$1,SMALL($C$1:$C$6,ROW()),0))   D2セル以降D1セルをコピー でどうでしょうか?(他にも書き方があると思いますが、思い付きませんでした。) こちらも間違えていたらすみません。

OKWeb-O
質問者

お礼

うおぉ、今度はROW関数が(^^;)。やはり普段使わない関数も、動作をモノにしておく必要がありますね。しかも今回のはエラーが表面化しない分、綺麗です。やはり日数が経過して構成を忘れると、エラー表示が心配になってしまう物ですから。折角機会に恵まれたので、前回の動作もマスターします(^^)。ありがとうございました。

回答No.5

ごめんなさーい。m(_ _)m B列は、条件式で入ってるんですよね。 No4の方法では、A列も並び替わってしまいます。 よく読んでなかったことに反省。。。 No3の方法でできると思います。

OKWeb-O
質問者

お礼

ありがとうございます(^^)、僕の質問文が判りにくいというのが大きな問題だったと思います(笑)。お手数おかけしてスミマセンでした。嬉しかったです(^^)。

回答No.4

次の通りに行ってください。 (1)B列を選択する。 (2)上のバーの中の[データ]の中の[並び替え]を選択する。 (3)[並び替えの前に]のウィドウの中から、  [現在選択されている範囲を並び替える]を選択し、  [並び替え]ボタンを押す。 (4)[並び替え]のウィンドウがでるので、  [OK]ボタンを押す。 以上でできます。

回答No.3

1行、使用してもよければ、 (1)C列にB列で空白でない行番号をセットする   C1セル =MATCH("*",$B$1:$B$7,0)   C2セル =MATCH("*",OFFSET($B$1,C1,0):$B$7,0)+C1   C3以降はC2をコピーする (2)D列にC列の行番号を使用しB列のデータを表示する   D1セル =IF(ISNA(C1),"",OFFSET($B$1,C1-1,0))   D2以降はD1をコピーする (3)C列を非表示にする でどうでしょうか? おかしな所やわからない所があれば補足してください。

OKWeb-O
質問者

お礼

ありがとうございます(^^)。MATCH関数もOFFSET関数も使った事のない僕にとって、これは新鮮でした(^^ゞ。今、セルに教えて頂いた構成を再現して上手く動作する事を確認、目下ヘルプ等でアルゴリズムを解析中です。これは華麗な方法です、ありがとうございました(^^)!

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

VBAになりますが、指定範囲内で、行を保存しつつ、左詰するには、一例として Sub test01() Dim c As Range cl = Selection.Columns.Count For Each c In Selection If c.Value = "" Then i = c.Row j = c.Column For k = j + 1 To cl If Cells(i, k) <> "" Then c = Cells(i, k) Cells(i, k) = "" Exit For End If Next k End If Next End Sub 少数例でテスト済み。 A列を特別に空白でも詰めないならB列より右列を範囲指定してください。 ------ 但し#1お礼の「最後のC列を入力規制で「項目可変式プルダウン」化しています(^^ゞ。なので、削除等の編集行為を行わずに自動的に変化させる事が大きな目標なんです。」の意味を充分理解できませんが、VBA以外で、まず関数式その他では無理でしょう。 ------ エクセルは一般的にやり方は(1)操作(2)関数式(3)ウイザードやAddInソフト(4)VBA(5)データベース機能の参照(6)条件付書式などありますが、関数式では、自分自信のセルの値を聞く=IF()関数など入れると、自分の値が壊れるので、無理でしょうし、ネストもやたら深くなるでしょう。関数式を入れた自分以外のセルへ値を送りこむことが関数式では出来ませんから。

OKWeb-O
質問者

お礼

ありがとうございました(^^)。VBAについては考慮できないという前提があったのを書き忘れていました、スミマセン。でも、凄く参考になりました。VBAが許されたら、こちらにしてみたいと思います(^^)。

  • jun9031
  • ベストアンサー率42% (51/120)
回答No.1

C列にオートフィルで「空白」をかけて、 その行をすべて削除すれば間隔はうまりますよ。 こんなんではどうでしょ? 一番単純かとおもいますが・・・。

OKWeb-O
質問者

お礼

早速のお答えありがとうございます(^^)。言葉が不足していましたが、最後のC列を入力規制で「項目可変式プルダウン」化しています(^^ゞ。なので、削除等の編集行為を行わずに自動的に変化させる事が大きな目標なんです。