[[20180515224030]] 『あるセルが空欄の場合に、特定のセルを参照したい』(イカの木の芽和え) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『あるセルが空欄の場合に、特定のセルを参照したい』(イカの木の芽和え)

お知恵をお貸し頂けませんでしょうか。

下記のようなデータが入ったセルがあります。

【例1】
     A列     B列     C列       D列
1行   山田商店   5月10日   パソコン     10万円
2行          5月15日   スキャナ     5万円
3行                 USBケーブル    1000円
4行   田中商会   5月1日   マウス       2500円
5行   鈴木興業   5月8日   キーボード     18000円
6行                 デジカメ      37000円

ご説明するまでもないかと思いますが、A2とA3が空欄なのは、A1と同じ「山田商店」を省略しているということです。同じように、B3が空欄なのは、B2と同じ「5月15日」を省略しているということです。同様に、A6はA5と同じ「鈴木興業」が、B6はB5と同じ「5月8日」が省略されています。

これを下記のような、省略なしの形に変えたいと思っています。

【例2】
     A列     B列     C列       D列
1行   山田商店   5月10日   パソコン     10万円
2行   山田商店   5月15日   スキャナ     5万円
3行   山田商店   5月15日   USBケーブル    1000円
4行   田中商会   5月1日   マウス       2500円
5行   鈴木興業   5月8日   キーボード     18000円
6行   鈴木興業   5月8日   デジカメ      37000円

現在のところは、
1.A1セルを選択してA2、A3へドラッグ → A2とA3に「山田商店」が入る
2.B2を選択してB3へ Ctrl+ドラッグ → B3に「5月15日」が入る
3.A5とB5を選択してA6、B6へ Ctrl+ドラッグ → A6、B6にそれぞれ「鈴木興業」、「5月8日」が入る
といった処理の仕方をしています。実際にはもっとデータの数が多いので、全部を処理するとなると結構な時間がかかりますので、これを関数で処理したいと考えています。

元データがSheet1に入っているとして、Sheet2に、例えば下記のような関数を入れることで処理できないかと思っています。

Sheet2のA1   「Sheet1のA1に何かデータが入っていれば、それをそのままSheet2のA1に入れる」という処理をしてくれる関数(原則、Sheet1のA1とA2が空欄ということはないので、これは=Sheet1!A1でいいのではないかと思っています)

Sheet2のA2   前記Sheet2のA1と同じ考え方で関数を入れる

Sheet2のA2   「もしSheet1のA2に何かデータが入っていれば、それをそのままSheet2のA2に入れるが、もしSheet1のA2が空欄であれば、Sheet1のA1の値を入れる」という処理をしてくれる関数を入れる

Sheet2のA3   「もしSheet1のA3に何かデータが入っていれば、それをそのままSheet2のA3に入れるが、もしSheet1のA3が空欄であれば、Sheet1のA1の値を入れる」という処理をしてくれる関数を入れる

B列についても、同じ考え方で関数を入れます。

A列やB列のうち空欄のセル(【例1】のA2やA3とかB3とか)がある行が何行続くかは一定していません。【例1】の4行目から5行目のように、空欄のセルがないまま次に続く場合もありますし、空欄のある行が10行以上続くような場合もあります。A列だけが空欄の行が何行続くかとか、A列もB列も空欄の行が何行続くかも一定していません。

前記のやり方に拘るわけではありませんので、何かもっと良い方法があればそれでも大丈夫です。出来ればマクロを使うのではなく、関数で処理したいと思っています。よろしくお願いいたします。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


1)A1セルを選択します
2)Ctrlキー と Shiftキーを押しながら:キーを押します。(これで表全体が選択されるはず)
3)ホームタブ→編集→検索と選択→条件を選択してジャンプ→空白セル→OK
4)そのまま(B1セルがアクティブになっているはず)=A1と入力して、Ctrlキーを押しながらEnterキー
押下で入力確定

これで行けると思いますが、出来ますかね?

(まっつわん) 2018/05/15(火) 23:07


まっつわん 様

ご回答を頂き、大変にありがとうございました。

質問文のデータでご教示頂いた方法を試してみたところ完璧でした。「4)そのまま(B1セルがアクティブになっているはず)」のところは、アクティブになったのはA2でしたが、A2に「=A1」を入れてCtrlキーを押しながらEnterキー押下で入力確定したところ、期待どおりの結果になりました。

ただ、大変申し訳ないのですが、最初の質問文では説明の便宜上実際のデータを簡略化して書いたため、実際のデータで試した場合には、残念ながら期待していた結果は得られませんでした。

実際のデータでやってみた結果は、同じことをやっているにもかかわらず、何回か試しているうちに途中から異なる動きになりました。初めの数回は、4)の段階でB1セルがアクティブにならずに1行目の最初の空欄セル(N1)がアクティブになりましたが(N列は質問文のデータでは省力した列の1つです)、どういうわけか、その後は質問文のデータのB3に該当するセルがアクティブになるようになりました(同じ作業をしているのに、何故異なった動きになるのでしょうね?)。N1がアクティブになった時にN1に「=A1」を入れてCtrl+Enterで確定した時には、空欄セルの全部に「#VALUE」のエラー・メッセージが出ました。B3がアクティブになった時にB3に「=B1」と入れてCtrl+Enterで確定した時には、質問文のデータのA2A3に該当するセルに「山田商店」、A6に該当するセルに「鈴木興業」、B3に該当するセルに「5月15日」、B6に該当するセルに「5月8日」と入ったところまでは良かったのですが、質問文のデータで言えば6行目以下に該当するデータを入れたいのではないセルにも6行目と同じデータがずーっと続いてしまいました。恐らく、質問文のデータでは省略した別の列に1000行ほど関数が入っている列があるため、その関数が入っている行の全部を範囲として選択したのだと思います。

せっかくご回答を頂いたのに、大変申し訳ありませんが、ご教示頂いた処理に要するステップ数と更に質問文のデータで言う6行目以下に当たる行に入ったデータを削除する手間を考えると、これまでやっていた方法でかかる手間とあまり変わらないような気がします。

A列やB列に何か関数を入れておくのであれば、D列以降にも何列か列が続いていてもそれが影響してくることはないのではないかと思いますし、特に処理の手数をかけなくてもSheet1にデータを入力しただけで自動的にSheet2の方の処理が終わってしまうので、手間的にはこが一番楽です。何か良い方法はありませんでしょうか。引き続き、皆様のお知恵をお貸し頂けませんでしょうか。よろしくお願い致します。

(イカの木の芽和え) 2018/05/16(水) 08:48


 例示の表でしか考えてません。

 A1 =IF(Sheet1!A1="","",Sheet1!A1)

 ↑ D1までコピーし、C1とD1を下へコピー

 A2 =IF($C2="","",IF(Sheet1!A2="",A1,Sheet1!A2))

 ↑ B2へコピーし、A2とB2を下へコピー

 こういうこと?
(笑) 2018/05/16(水) 11:25

Private Sub Worksheet_Activate()
'Sheet2のシートモジュール
    Dim c As Range
    Cells.Clear
    For Each c In Sheets("Sheet1").UsedRange
        Cells(c.Row, c.Column).Value = IIf(Trim(c.Value) <> "", c.Value, c.End(xlUp).Value)
    Next c
End Sub
(mm) 2018/05/16(水) 14:04

笑 様

ご回答を頂き、有り難うございます。

正に望んでいたとおりの結果が得られました。感謝致します。ありがとうございました。

(イカの木の芽和え) 2018/05/16(水) 15:07


Mm 様

ご回答を頂き、有り難うございます。

マクロは今の私には少し荷が重いので(「マクロの記録」の機能くらいしか使えません)、教えて頂いた方法は、ゆっくり時間をかけて試してみたいと思います。ありがとうございました。

(イカの木の芽和え) 2018/05/16(水) 15:08


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.