[[20150901181455]] 『一番右側を表示したい』(藻琴) ページの最後に飛ぶ

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

 

『一番右側を表示したい』(藻琴)

 1 あか あお あか
 2 あお しろ 
 3 しろ    あか

 であるときに,

 1 あか
 2 しろ
 3 あか

 としたい。
 空白があっても最も右側にある空白以外のセルの内容を取り出したいのです。
 何らかの策はありますでしょうか。

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


 ハードコーディングだけど・・・
 1列目が空白が有るかもしれないので、必要な行数は自分で「j」に入れてください。

    Sub test()
        Dim i As Long
        Dim j As Long
        Dim ans
        j = 3
        ReDim ans(1 To j)
        For i = 1 To j
            ans(i) = Cells(i, Columns.Count).End(xlToLeft).Value
        Next i
        With Sheets.Add
            .Range("A1").Resize(j).Value = Application.Transpose(ans)
        End With
    End Sub

(稲葉) 2015/09/01(火) 19:04


 サンプル表には列番号を明記しましょう。

	A	B	C	D	E	F
1	あか	あか	あお	あか		
2	しろ	あお	しろ			
3	あか	しろ		あか	
4	あお		しろ		あお
     ↑
     結果

 B列からF列にデータ
 A列に求める結果

 A1 =IFERROR(LOOKUP(1,0/(B1:F1<>""),B1:F1),"")

 データが文字列で、空白セルには数式も何も入っていないのなら

 A1 =IFERROR(LOOKUP("ー",B1:F1),"")

 もしかしたらこれでもできるかもしれない。
(笑) 2015/09/01(火) 19:27

 19:47 列数はあるがままにしました。
 20:47 ある行がすべて空白の時、数値の0と表示される不具合を回避。

 ループなしで書いてみました。
 結果は、一番右の列の2つとなりの列に書きこみます。

 Sub Test()
    Dim r As Range
    With Range("A1", ActiveSheet.UsedRange)
        With .Offset(, 1).Resize(, .Columns.Count - 1)
            On Error Resume Next
            Set r = .Cells.SpecialCells(xlCellTypeBlanks)
            On Error GoTo 0
            If Not r Is Nothing Then r.FormulaR1C1 = "=RC[-1]&"""""
            .Columns(.Columns.Count + 2).Value = .Columns(.Columns.Count).Value
            If Not r Is Nothing Then r.Value = Empty
        End With
    End With
 End Sub

(β) 2015/09/01(火) 19:42


 > データが文字列で、空白セルには数式も何も入っていないのなら
 > A1 =IFERROR(LOOKUP("ー",B1:F1),"")

 上記以外に「ー」で始まる文字列がない、という条件もある。

 ↓ の方が無難。
 > A1 =IFERROR(LOOKUP(1,0/(B1:F1<>""),B1:F1),"")
 
 
 本当に3列しかないんだったら
 A1 =IF(D1<>"",D1,IF(C1<>"",C1,IF(B1<>"",B1,"")))
 単純にこんな感じでもいいと思うけどね。

 ところでこれ、VBAの質問だったのかな?
(笑) 2015/09/01(火) 21:12

 >>ところでこれ、VBAの質問だったのかな?

 おそらく、質問者さんの意図は、「関数」での処理でしょうね。

 脱線ついでに、βがアップしたコードの処理を作業でやるなら。

 ・範囲内の空白の任意のセル、たとえば C3 に =B3&"" といれて C3 を選択して Ctrl/c
 ・B列〜データ最終列までを選択してジャンプ機能で空白セルを選択
 ・Ctrl/v
 ★これで最終列に、求める結果がでているので、どこかに値転記
 ・B列〜データ最終列までを選択してジャンプ機能で数式セルを選択
 ・Deleteキー

(β) 2015/09/01(火) 21:44


 みなさま,ありがとうございました。

 > 本当に3列しかないんだったら
 > A1 =IF(D1<>"",D1,IF(C1<>"",C1,IF(B1<>"",B1,"")))
 > 単純にこんな感じでもいいと思うけどね。

 確かにその通りです。
 この列が毎年増えていく表なのです。
 説明不足で申し訳ありません。

 LOOKUPの式で教えてください。以前,
 =IFERROR(LOOKUP(1,1/(C1:G1<>""),C1:G1),"")
 のような式をどこかで見た気がするのですが,
 =IFERROR(LOOKUP(1,0/(C1:G1<>""),C1:G1),"") と
 =IFERROR(LOOKUP(1,1/(C1:G1<>""),C1:G1),"") の違いってなんでしょうか。

(藻琴) 2015/09/03(木) 09:07


 LOOKKUP関数や、VLOOKUP関数で検索の型にTRUEを指定したとき、検索値が検索範囲内の値よりも大きい場合は一番最後の値の位置を
 持ってくる。

 この時、エラー値は無視される。

 0/(C1:G1<>"")
 の結果はセルの値が空白以外の場合は「0」、空白の場合は「#DIV/0!」エラーとなるため最後の空白以外の場所を求めることになる。
 (この時には検索対象が昇順になっていなくても構わない)

 対して
 1/(C1:G1<>"")
 の場合はセルの値が空白以外の場合は「1」、空白の場合は「#DIV/0!」となる。
 「1」の場所を検索することになるが検索対象が昇順になっていないため空白でないセルのどこを持ってくるかは
 不定となり、最後の空白以外のセルを持ってくるとは限らないことになる。

 =IFERROR(LOOKUP(2,1/(C1:G1<>""),C1:G1),"")
 のように検索値が「1」より大きい数値であれば
 =IFERROR(LOOKUP(1,0/(C1:G1<>""),C1:G1),"")
 と同じ結果になるが。
(ねむねむ) 2015/09/03(木) 09:46

 詳しい説明ありがとうございます。
 よく理解しました(と感じてはいます)。
 今後,さまざまな機会に応用してしっかりと理解していきたいと思います。
 ホント,ためになる「学校」ですね。
 ありがとうございました。
(藻琴) 2015/09/03(木) 11:38

コメント返信:

[ 一覧(最新更新順) ]


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