No.11ベストアンサー
- 回答日時:
No.10の式の一部の再度の修正
私がNo.9で提示した式
=IF(COUNTA($M2:$FU2),INDEX($M$1:$FU$1,MAX(INDEX(($M2:$FU2<>"")*(COLUMN($M2:$FU2)-COLUMN($L1)),0))),"")
COUNTAの範囲がA列からになっていました。
添付画像の数式バーのものも同じ間違いのままでした。
検証するときに修正するのを忘れていました。
この回答へのお礼
お礼日時:2017/02/14 11:09
enunokokoroさん
何度も丁寧に回答してくださり、ありがとうございました。おかげで今後、作業がとても効率よく進めることができます。
No.12
- 回答日時:
続けてお邪魔します。
enunokokoroさんの回答で解決済みだと思っていましたが・・・
なかなか思い通りにならないみたいですね?
とりあえずこの画面から↓の数式をドラッグ&コピー → 表示したいセルを選択 → 数式バー内に貼り付け → そのまま(編集可能なまま)
Ctrl+Shiftキーを押しながらEnterキーで確定 → フィルハンドルで下へコピーしてみてください。
=IF(COUNTA(M2:FU2),INDEX(M$1:FU$1,MAX(IF(M2:FU2<>"",COLUMN(M2:FU2)-12))),"")
尚、
>実は1行目の実際のデータは日付なので・・・
というコトですので、シリアル値で昇順(右側列が新しい日付)になっている!という前提であれば
↓の数式でも大丈夫だと思います。
=IF(COUNTA(M2:FU2),MAX(IF(M2:FU2<>"",M$1:FU$1)),"")
この数式も配列数式ですので、Ctrl+Shift+Enterで確定します。
これでもまだお望みどおりにならないでしょうか?m(_ _)m
No.10
- 回答日時:
私がNo.9で提示した式
=IF(COUNTA($A2:$FU2),INDEX($M$1:$FU$1,MAX(INDEX(($M2:$FU2<>"")*(COLUMN($M2:$FU2)-COLUMN($L1)),0))),"")
No.3さんが提示した配列数式
{=IF(COUNTA(M2:FU2),INDEX(M$1:FU$1,,MAX(IF(M2:FU2<>"",COLUMN(M1:FU1)-COLUMN(L1)
))),"")}
上記の式を使って検証しているのですか?
私の式にてエラー「#VALUE!」が出るのは、IF(COUNTA(行の範囲)の
式を追加していなかったときの式のときだけだと思います。
上記式に変更すればエラーは出ないと思いますよ。
No.3さんが提示した配列数式も値がない場合にM列の値が出るのは、
IF(COUNTA(行の範囲) の式を入れないでINDEXからの式のみにした
場合の結果だと思います。
COUNTA関数での範囲に空白しかない場合にはFalseになるので、""で
指定した結果が出るはずなので。
添付画像の一部に間違った書き方があるので修正です。
M6列 → M6セル
M7列からFU7列まで → M7セルからFU7セルまで
No.9
- 回答日時:
No.4の回答者です。
Excelについての回答をするようになったのが最近なので、回答内容が
不足気味でしたね。
私がした回答内容では、行ごとのデータにおいて全くデータがない行を
考慮していませんでした。
No.3の回答者さんのように、考慮した回答にて数式を提示していれば、
質問者さんを混乱させないようにできたかもしれませんね。
=IF(COUNTA(行の範囲),条件の数式,"")
を使えば、空白行がある場合に""にしてエラーを出さないようにできる
ので、これを組み合わせることで対応できるますね。
No.3の回答者さんの数式がスマートだと思いますから、私が提示をした
数式は参考程度と思ってくださいね。
さて、追加補足の疑問について、私なりに追加説明しますね。
私の回答にある「配列数式」は、[ Ctrl+Shift+Enter ]キーの配列数式
の意味ではなく、「配列のある数式」という意味で使ってしまいました。
混乱させる回答で御免なさい。
No.6でのNo.3さんの修正をした数式と私の数式の違いについてですが、
IF関数を使わなければ結果は同じものになります。
{=INDEX(M$1:FU$1,,MAX(IF(M2:FU2<>"",COLUMN(M1:FU1)-COLUMN(L1)
)))}
のように配列数式にすれば、結果はM1の情報「あ」になります。
エラー「#VALUE!」が出るか出ないかの違いは配列数式にするかどうか
によるものだと思います(違っていたら御免なさい)。
> (INDEX(($M2:$FU2<>"")*(COLUMN($M2:$FU2)-COLUMN(L1)),0)
における最後の0の意味は、INDEX関数の引数を省略できないので、
特定の列を指定しないという意味で0を使うようです。
(INDEX(($M2:$FU2<>"")*(COLUMN($M2:$FU2)-COLUMN(L1)),) の
ようにカンマ後ろの0を記載しないでも、範囲における指定行で特定列を
指定しないようになるので、結果的に(範囲内での)行全体という結果を
得ることができるのだと思います。
以下はデータのない行を考慮した私の最終的な修正の数式です。
=IF(COUNTA($A2:$FU2),INDEX($M$1:$FU$1,MAX(INDEX(($M2:$FU2<>"")*(COLUMN($M2:$FU2)-COLUMN($L1)),0))),"")
参考程度に利用してみてくださいね。
No.8
- 回答日時:
No.4の回答者です。
修正すべき数式の一部が間違っていましたね
> ヘッダーだと思ったのでINDEX($M$1:$FU$1)にして
あっていますよ。私のほうが修正間違いをしていました。
=INDEX($M$1:$FU$1,MAX(INDEX(($M2:$FU2<>"")*(COLUMN($M2:$FU2)-COLUMN(L1)),0)))
が正しいです。
No.7の回答者のアドバイスで基本的なことが書かれていますね、
内容が重複しますが、私なりのアドバイスをしますね。
数式を修正するコツですが、COLUMN関数のことを理解することが重要
です。
=COLUMN(A1) →1
=COLUMN(M1) →13
=COLUMN(FU1) →177
になることはすでにアドバイスされているので理解できますね。
これがCOLUMN関数で得られる列番号です。
https://dekiru.net/article/4452/
COLUMN($M2:$FU2)-COLUMN(L1)
は配列数式として利用したもので、
=COLUMN($M2)-COLUMN(L1) ~ =COLUMN($FU2)-COLUMN(L1)
を求めるための式になります。値のみにした場合
=13-12 ~ =177-12
までの値を出して、範囲指定した列内の何番目なのかを取得します。
($M2:$FU2<>"")はTRUEまたはFALSEを出すもので、範囲内のセルが
空白かどうかを判定して、空白だった場合はCOLUMN関数で得た値と
乗算した結果がFALSEなので0になります。
MAX関数において最大値を得るときに空白セルは最小となります。
最大はFU2セルに値があった場合の
=177-12=165となり、M列から165番目が最大になります。
FU2セルが空白の場合は、その前のセルが最大になることは理解する
ことができると思います。
INDEX関数では、
=INDEX(範囲,行番号,列番号)
を指定するものですが、行が1行分しかない範囲の場合には行番号を
省略できるので、
=INDEX(範囲,列番号)
で範囲内の列番号を指定すれば、その列の値を取得できます。
この場合の列番号は何番目なのかを指定するものなので、
=INDEX(範囲,何番目なのかを指定)
ということになります。
このことから、
=INDEX(1行目の範囲の値,MAX(INDEX((指定行の範囲<>"")*(COLUMN(指定行の範囲)-開始列の前の列番号),0)))
のようにすることで、指定行の指定範囲での空白以外の最大の列番号
(何番目)を取得したものから、INDEX関数で1行目の指定範囲の最大
の列番号の値を取得しているのです。
なので、
①については何番目なのかを得るための計算式の方法ですね。
②はM列から開始した場合は12を引かないとならないために
=COLUMN(L1)で得られる列番号の値のみが必要で、オートフィルを
した場合でも修正する必要はありません。(常に12を得ればよいだけ)
③はヘッダー部分なので絶対参照にする必要があります。私の書いた
ものが修正途中で消してしまったことによる間違いでした。
No.6の添付画像での数式バーでは正しい数式になっていますよね。
No.7
- 回答日時:
No.3です。
No.6さんがすでに数式の修正をしていただいているので・・・
数式の説明を少しだけ!
基本はINDEX関数です。
INDEX関数で範囲指定した「何番目」を返すか?というコトになります。
↓の画像で説明します。
FU列まで画像をアップすると小さくて判りにくいと思いますので、適当な範囲でやめています。
INDEX関数の範囲はM1~T1の範囲となり、M1が1番目・N1が2番目・・・となります。
2行目、M2セルに
=COLUMN()
という数式を入れ右へコピーすると単純に列番号が表示されます。
5行目、M5セルには
=M4<>""
という数式を入れこれも右へコピーすると、空白セル以外は「TRUE」となり、空白セルは「FALSE」(=0)となります。
この「TRUE」の列の最大の列番号を返したいのですが
単純に列番号を掛け算してしまうと
画像の場合は「19」というとんでもない数値が返ってきます。
INDEX関数の範囲には「19番目」がないので当然エラーになってしまいます。
そこでU4セルには
=INDEX(M$1:T$1,,MAX(IF(M4:T4<>"",COLUMN(M4:T4)-COLUMN(L4)))
(配列数式です)
としています。
>COLUMN(M4:T4)-COLUMN(L4)
のようにM列が「1番目」になるように列合わせが必要になってくるわけです。
INDEX関数の範囲指定の最初の列がM列と判っているのであれば
>COLUMN(M4:T4)-12
としても同じ結果になります。
列数がいくら増えても同じ理屈です。
以上長々と書きましたが
この程度でご理解いただけたでしょうか?m(_ _)m
No.6
- 回答日時:
No.4の回答者です。
COLUMN関数は列番号を取得するものなので、参照する範囲の指定が
A列からでないと取得した値が違ってきます。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/kansu …
補足の例だとM列から開始しているので、
COLUMN($M2:$FU2)-COLUMN($L2)
のように、列の値がM列からL列分を引いたA列になるようにしておいて
計算するようにします。
( COLUMN($M2:$FU2)-COLUMN($M2)+1でも同じ )
それと、MAX関数の中にある参照範囲は行単位で指定してください。
なので、以下のように数式を修正します
=INDEX($M1:$FU1,MAX(INDEX(($M2:$FU2<>"")*(COLUMN($M2:$FU2)-COLUMN(L1)),0)))
これで2行目の最終列の1行目の文字列が取得できます。
3行目以降は、その数式をオートフィルでドラッグすれば、参照する行が
ずれてくれます。
http://www.eurus.dti.ne.jp/yoneyama/Excel/input_ …
No.3の数式も同じで参照範囲の指定が間違っていますので修正。
{=IF(COUNTA(M2:FU2),INDEX(M$1:FU$1,,MAX(IF(M2:FU2<>"",COLUMN(M1:FU1)-COLUMN(L1)
))),"")}
COLUMN関数では列番号の値を取得するだけなので、以下の数式でも
結果は同じです。
=INDEX($M1:$FU1,MAX(INDEX((M2:FU2<>"")*(COLUMN(M1:FU1)-COLUMN(L1)),0)))
No.5
- 回答日時:
№2です。
=VLOOKUP($M$1,$M1:$FU1,SUMPRODUCT(((M2:FU2)>0)*1,(COUNTBLANK(INDIRECT(ADDRESS(ROW(),COLUMN(M2:FU2),4)&":FU"&ROW()))=COLUMN(FU2)-COLUMN(M2:FU2))*1,COLUMN(M2:FU2)-COLUMN(N2)))
でどうでしょうか?
No.4
- 回答日時:
A列からY列までなら、こちら↓のような式でも1行目の値が出ます。
=INDEX($A$1:$Y$1,MAX(INDEX(($A2:$Y2<>"")*COLUMN($A2:$Y2),0)))
添付画像ではA列からO列までで1行目の値を出しています。
No.3
- 回答日時:
こんばんは!
Z2セルに
=IF(COUNTA(A2:Y2),INDEX(A$1:Y$1,,MAX(IF(A2:Y2<>"",COLUMN(A1:Y1)))),"")
配列数式ですので、Ctrl+Shift+Enterで確定!
Z2セルのフィルハンドルで下へコピーしてみてください。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Visual Basic(VBA) Excel vbaについて知恵もしくは、コード教えて下さいm(__)m ① 表にあるデータをコピー、 2 2022/09/01 23:57
- Visual Basic(VBA) エクセルVBAで『A列』に新規で数値を入力し『B列』から右方向の空白セルにその値を貼り付ける方法 4 2022/11/05 08:37
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 1 2023/02/27 22:21
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【関数】スペースがいくつ入っ...
-
西暦や和暦の表示をyyyymmdd表...
-
【Microsoft Office Excel Comp...
-
Excelはなんで先頭の0を消すん...
-
Excelのセルを飛ばして入力する
-
別シートからの文字を変更
-
エクセルの行の抽出について質...
-
Excelのオートフィル
-
Excel 2019 のピボットテーブル...
-
スプレッドシート クエリ関数 1...
-
excelの不要な行の削除ができな...
-
Excel初心者です。 詳しい方、...
-
【Excel】セル内の時間帯が特定...
-
Excel初心者です。 詳しい方、...
-
EXACT関数とIF関数の組み合わせ...
-
Excelのグラフ軸について
-
スマートな関数を教えて下さい。
-
Excelで全角を半角にしたいので...
-
【マクロ】エクセルにかいてあ...
-
Excel:一部のフォントでセルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内にある数字の出現回...
-
Excel関数の先頭に「@」が入っ...
-
エクセルの気味悪い不思議
-
Excel VBAで、実行時にsheet上...
-
表示されている人数だけを数え...
-
他人が作ったマクロの理解
-
Excelの関数について質問です。
-
Excel 集計表
-
エクセル 日時の計算式について
-
Excelの関数に関して質問です。...
-
エクセル:セル内の文字列の下...
-
絞り込み検索
-
エクセルの関数で
-
エクセルの書式設定について教...
-
余分なEXCELファイルに印刷され...
-
VBA 同一シート内での転記の仕方
-
長期休みの関数はありますか
-
Excelの空のセル
-
エクセルで入力してある文を別...
-
Excelのマクロで、セルを結合し...
おすすめ情報
みなさんありがとうございます。せっかく回答いただいたのに、うまく加工ができないでおります。
>enunokokoroさん
実際には取得したいデータは(今回は)M列からFU列なので、
AをM YをFUに変えたら ずれた結果になったり(たとえばCO列なのにDA列を取得)場所によっては#REF!となってしまいました。今回の範囲だったらどのように加工すればよいか教えてください。
=INDEX($M$1:$FU$1,MAX(INDEX(($M2:$FU5<>"")*COLUMN($M2:$FU5),0)))
>tom04さん
enunokokoroさんと同じ結果になりました。ずれた結果になったり(たとえばCO列なのにDA列を取得)場所によっては#REF!となってしまいました。今回の範囲だったらどのように加工すればよいか教えてください。
{=IF(COUNTA(M2:FU2),INDEX(M$1:FU$1,,MAX(IF(M2:FU2<>"",COLUMN(M1:FU1)))),"")}
No3さんの分も含めてご丁寧に説明いただきありがとうございます。こんなにするすると解けたら気持ちがいいだろうにと思います。本来じっくり一つ一つの関数を調べるべきだと思いますが、これを取得した後の作業がメインでして、ほかの作業にもおわれてまして、今の状態をクリアしなければならず、初歩的な質問ばかりですがご容赦ください。
①列の値がM列からL列分を引いたA列になるように
というのが理解できていないかもしれません。MからLを引いたAとはどういうことなのでしょうか。AからL「まで」を引くという覚え方でよいでしょうか。毎回取得範囲が異なるので・・・。取得したい列-1つ前の列を「-COLUMN($?2)」?の場所に当てはめればよいでしょうか。
②COLUMN($M2:$FU2)-COLUMN($L2)
のようにとあるのですが、その下の式は
=INDEX($M1:$FU1,MAX(INDEX(($M2:$FU2<>"")*(COLUMN($M2:$FU2)-COLUMN(L1)),0)))
とあります。下の式は「-COLUMN($L2)」に直せばよいでしょうか。
③この式をオートフィルでコピーしたら#VALUEになってしまったので見てみると、
=INDEX($M2:$FU2,MAX(INDEX(($M3:$FU3<>"")*(COLUMN($M3:$FU3)-COLUMN(L3)),0)))
に代わっていました。「INDEX($M1:$FU1」の部分はヘッダーだと思ったのでINDEX($M$1:$FU$1)にしてみたんですけどあってますでしょうか。
enunokokoroさん tom04さん
丁寧に教えていただき、ありがとうございます。すみません。最後にもう少し教えてください。これでもネットで調べてみたんですがやっぱりわからなくて。
①配列というものを理解していなかったので、enunokokoroさんの説明に「配列」とあったのですが式はそのままセルに貼り付けておりCtrl+Shift+Enterで{}で囲っていません。囲うと1件もデータがない行は#VALUE!と出ていたところが、M1の情報「あ」がセットされてしまいました。同じ配列でも{}で囲うのと囲わないのがあるのはなぜでしょうか。
②(INDEX(($M2:$FU2<>"")*(COLUMN($M2:$FU2)-COLUMN(L1)),0) の最後の0につまづいています。配列で行番号や列番号に0を指定すると行全体・列全体の情報が一気に取得できるという説明を見つけましたが、この例でいくと行を指していますか?「行全体を取得」というのはこの式では具体的には何を意味しているのかが今一つぴんとこないのです。教えてください。
>enunokokoroさん >tom04さん
何度もありがとうございます。お二人の回答を合わせてみているので、まとめての質問になってしまいますがお願いします。
データがあるときだけ1行目の値がほしいので、「あ」がセットされてしまうと困るのです。本当に「あ」の列にデータがあった場合と区別がつかなくなってしまうからです。
「参考程度に」とのことですがせっかく教えてくださったので試してみたところ、#valueのままでした。
データがなければなにも表示しない「""」か「"なし"」をいれたいです。実は1行目の実際のデータは日付なのでこの関数をいれるセルも日付型にしているため「0」をセットすると1900/1/0になってしまうからnullか文字列をいれるしかないのかなと思っています。if関数だから加工してみたのですが#valueのままで、>tom04さんのは「あ」を取得してしまいます。
>enunokokoroさん >tom04さん ほかにも回答くださったみなさま 本当にありがとうございました。特にこのお二人ともベストアンサーに選びたかったのですが一人なので、回答くださった回数で>enunokokoroさんにさせていただきました。