こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

エクセルで空白以外のセルの値を取りたいのですが

質問させていただきます。

エクセルで下記のようなデータがあるのですが、
A列が製品番号
B列が製品名
C列が分類名
D列からZ列までがC列に入れる名称がひとつだけあります。
2つ以上入ってることはありません。

教えていただきたいのは、D列からZ列までに値があれば自動でC列に反映させる関数です。

例えば、D2にPCとあればC2にPCと反映される。
Z3にTVとあればC3にTVと反映される。
という具合です。
この場合、E2からZ2、E3からY3までは空白になってます。

データの件数が3000件以上あり、週に2回くらいやる作業なのでなるべく作業効率を上げたいと思っております。

よろしくお願いいたします。

投稿日時 - 2009-10-28 00:12:18

QNo.5402281

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

回答2です。
マクロは力ずくの処理をすばやく簡単にやってくれるので、今回のケースも業務の効率化という観点からはマクロ化のメリットは十分にあります。

ちなみにそれなりのマクロを書くには知識と経験が必要ですが、単なるツールとして使用されている方々にはマクロの書き方も効率化(わかりやすい、簡単等)が一番となるでしょう。そういう方たちにとってはマクロ自体についての長たらしい講釈は混乱を招くことが多いため、あまり意味がないと私は考えています。

Sub Macro1()
Dim rw As Integer '行番号
Dim cl As Integer '列番号
For rw = 2 To 5000 '2行目から開始
'A列に製品番号がなければ終了
If Cells(rw, 1).Value = "" Then
Exit Sub
End If
'rw行のD列からZ列まで値を探す
For cl = 4 To 26
If Cells(rw, cl).Value <> "" Then
'D列以降にデータがあれば、C列に値を代入
Cells(rw, 3).Value = Cells(rw, cl).Value
Exit For '次の行へ
End If
Next
Next
End Sub

マクロ実行後、DからZに値の入れなおしがあったらまたマクロを実行する必要があります。
ただ、マクロをまったくご存じないのなら、お勧めはしません。

投稿日時 - 2009-10-29 09:43:05

お礼

ありがとうございます。

マクロは未経験ですので、とりあえずは確実にできるやり方でこなしていこうと思います。

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

投稿日時 - 2009-10-29 21:23:39

ANo.6

#3/4の回答者です。

>D列からZ列はIFとCOUNTIFで作られた関数が入っていて、値に貼り付けなおしてやってみてもだめでした。

#1の方のお礼の部分を読んでみて、D-Zに数式があるなら、話は違いますね。

#4の「それ自体は、数式のそれと同じものです。」というのは、私も、最初 #1の方の回答と同じ数式をイメージから、マクロを作りましたから、#1の数式で出ないなら、それは#3のマクロはうまく行きません。

>E2からZ2、E3からY3までは空白になってます
>D2にPCとあればC2にPCと反映される。
確かに、私の読み違いであろうけれども、正しい情報がなかったとも言えます。私は、後だし条件で大きく内容が変わってしまう場合は、お答えはしないようにしています。

IF とCOUNTIF なら、数値か、文字長0の空白("")があるはずですが、"PC"とは出てこないはずで、一体、そのシートは、どんな状態であるのでしょうか、見当が付きません。

マクロが分からないのはいたし方がないとしても、別の質問で、こんどこそマクロでなくてはならないような質問が出ています。#2の数式で良いというようなスタイルは、マクロの移植は可能だとしても、ワークシートの状態が明らか出ない限りは、あまりメリットはないですから、これ以上はやめておきます。

投稿日時 - 2009-10-29 02:33:43

お礼

お礼が遅くなって申し訳ありません。

IFとCOUNTIFですがD2には、
=if(countif(b2,"*"&"XXXX"&"*"),"PC","")というように特定の文字がB列に入っていればPCという文字を返すという関数が入っておりました。E列からZ列まで同じようにIFとCOUNTIFで違う分類名を抽出していました。

自分が作ったシートでないとはいえ、説明が足りずに申し訳ありませんでした。

投稿日時 - 2009-10-29 21:16:26

ANo.5

#1の者です。

>D列からZ列はIFとCOUNTIFで作られた関数が入っていて
ということなら空白ではないですね。
空白に見えてるだけとか。
IFの条件分岐で、ある条件ならば、"" としてあるのなら別ですが。

IF関数は何(数値or文字)を返すようになってるのでしょうか。
また、D列~Z列は名称とのことですが、COUNTIF関数が入っているというのなら
数値が返ってくるのか、などちょっと
不明点があります。
既回答にもある通り、マクロを使うのが良いとは思いますが、分からないということでしたら、私なら
以下のようにするかもしれません。作業列を使います。

D~Z列に何か一つしか入ってなくて(or 入ってないように見えて)、それを拾うと言うのなら、その拾いたいセルのデータの文字数は
その行の中で最大と考えて、

1) AD2セルに、 =LEN(D2)  と入れて、AZ2セルまで右に引っ張る。また、データがある最終行まで下に引っ張る。
・・・D~Z列の各セルの文字数を出しています。

2)AC2セルに、 =MATCH(MAX(AD2:AZ2),AD2:AZ2,0) と入れて、最終行まで下に引っ張る。
・・・文字数が最大のセルは何番目にあるかを出しています。

3)C2セルに、  =INDEX(D2:Z2,1,AC2)  と入れて、最終行まで引っ張る。
・・・最大文字数のセルの内容を引いてきています。


ご意向にそぐってるか分かりませんけどご参考まで。
私の知識ではこんな感じです。
っていうか、#2さんの方法でOKならそっちのがシンプルですね。

投稿日時 - 2009-10-29 00:39:36

お礼

ありがとうございます。

業務の関係で皆さんのアドバイスを全て確認する時間がないのが申しわけないです。

じっくりやってる時間がないので、とりあえず一番簡単にできる方法でということにさせていただきました。

投稿日時 - 2009-10-29 20:55:06

ANo.4

>マクロはさっぱりわからないので申し訳ありません・・・

D~Z に値を入れたときに、同じ行のC列に値が入るという仕組みになっております。それ自体は、数式のそれと同じものです。ただ、D~Z の間に2つの値をさせないとか、数字でも文字でも可能にするとか、エラーを出さないようにと、可能な限りの工夫はしてあるのですが、それが体験できないなら、残念ながら無理にはお勧めしません。

投稿日時 - 2009-10-28 22:02:38

ANo.3

こんにちは。

マクロで処理するのはいかがでしょうか。

マクロの取り付け方
マクロを実行しようとするワークシートのシートタブ(下部のSheet1,Sheet2 ...)を右クリックすると、「コードの表示(V)」というメニューがありますから、それをクリックしてください。そして、開いた画面に、以下のコードを貼り付けて、Alt + Q で閉じれば設定は完了です。

数字・文字の区別はありません。2つ入れられません、ということですから、もう一度別な場所に入れると、同じ行の前のデータは消えます。
'-------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)
Dim buf As Variant
If Target.Row = 1 Then Exit Sub 'タイトル行は除外
If Intersect(Target, Columns("D:Z")) Is Nothing Then Exit Sub 'D~Zの範囲
If Target.Count > 1 Then Exit Sub 'データは1つのみ
  Application.EnableEvents = False
  If Target.Value = "" Then
    Cells(Target.Row, 3).ClearContents
  '2つは入れられない
  Else
   If Application.CountA(Columns("D:Z").Rows(Target.Row)) > 1 Then
    buf = Target.Value
    Columns("D:Z").Rows(Target.Row).ClearContents
    Target.Value = buf
    Cells(Target.Row, 3).Value = buf
   Else
    Cells(Target.Row, 3).Value = Target.Value
   End If
  End If
  Application.EnableEvents = True
End Sub

投稿日時 - 2009-10-28 10:09:58

お礼

ありがとうございます。

これはALT+Qでマクロの画面を閉じたら自動でc列に値が入るということなのでしょうか?
昼休みに試してみたら特にc列には何も入らなかったので・・・

マクロはさっぱりわからないので申し訳ありません・・・

投稿日時 - 2009-10-28 21:18:22

ANo.2

>2つ以上入ってることはありません。
でしたら力ずくですが、
=D2&E2&・・・&Z2
という方法もあります。必要なら全体にTrimをするとか。
ご参考まで。

投稿日時 - 2009-10-28 07:42:20

お礼

なるほど!

意外と簡単にできるものなんですね。

とりあえずはこれで問題なくC列に値が入りました。

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

投稿日時 - 2009-10-28 21:20:35

ANo.1

C2セルに以下をいれて下に。


=INDEX(D2:Z2,1,MATCH("*",D2:Z2,0))

セルの右下端の黒い小さな■をダブルクリックでもいいです。
どうでしょうか。

投稿日時 - 2009-10-28 00:35:13

お礼

ありがとうございます。

昼休みに試してみたところ、D列に値があるものはC列に反映されますが、E列からZ列に値がある場合はC列に反映されませんでした。

D列からZ列はIFとCOUNTIFで作られた関数が入っていて、値に貼り付けなおしてやってみてもだめでした。

ちょっと原因がわかりません・・・

投稿日時 - 2009-10-28 21:23:44

あなたにオススメの質問