EXCELの最終列の数値の取得

このQ&Aのポイント
  • EXCELの最終列の数値を取得する方法について教えてください
  • A列に受注目安の1回目を入力し、OKの場合はA列が最終列となりますが、未定の場合はC列の受注目安2に再度入力しており、それが最終列扱いとなります。最終列の値を取得する方法を教えてください
  • 最終列の取得方法について詳しい解説が見つからないので質問しました
回答を見る
  • ベストアンサー

EXCELの最終列の数値の取得

お世話になります。 EXCELにて画像のようなデータがあった場合についてです。 例えばA列には受注目安の1回目を入力する欄が設けられており、それぞれの状態を入力します。 OKの場合はそれ以降入力する必要がないのでA列が最終列となりますが、未定の場合はC列の 受注目安2に再度入力しており、それが最終列扱いとなります。 売上も同じような方法で入力していくのですが、その右側にそれぞれの行の一番最後の値が 最終売上、最終目安に反映されるようにしたいです。 ネットで調べてみて最終行の取得などはあったのですが、入力された最終行の取得について 分かりやすい解説が見つかりませんので質問いたしました。 お手数ですが、解決方法をご教授下さい。 よろしくお願いします。

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

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.9

>売上、原価、確度にそれぞれ日付が入っており、それが一週間刻みで更新されていきます>(W行とX行の間に3行ずつ追加されていくイメージです) >この時、例えば2602行ならば2015/11/5の欄に最終の数字が入っており、それぞれが右端の対応項目に入ります。 >一方、2604行は2015/10/29の欄が最後の入力なので、それらの数値が右端の対応項目に入っております。 >行ごとに一番最後に入力されている売上、原価、確度を転記したく、更に今後3行ずつ挿入をしても同じように反映されているとベターです。  「売上 2015/11/5」がU1セルに入力されていて、3列で1組となっているという事は、最初の「売上」はC1セルに入力されているものと考えて宜しいのでしょうか?  それと念の為に確認しておきたいのですが、最後の「原価 ○○○○/○○/○○」の列には必ず数値データが入力されていて、尚且つ最後の「確度 ○○○○/○○/○○」の列には数値データが入力されている事は絶対に無いものと考えれば宜しいのでしょうか?  もし上記の条件通りであった場合には、Y2セルに入力する関数は次の様なものとなります。 =IF(COUNT($D2:INDEX(2:2,COLUMN()-3)),HLOOKUP(9E+307,$D2:INDEX(2:2,COLUMN()-3),1),"")  同様に、X2セルに入力する関数は次の様なものとなります。 =IF(ISNUMBER($Y2),INDEX($C2:INDEX(2:2,COLUMN()-3),MATCH(9E+307,$D2:INDEX(2:2,COLUMN()-2))),"")  同様に、Z2セルに入力する関数は次の様なものとなります。 =IF(ISNUMBER($Y2),INDEX($E2:INDEX(2:2,COLUMN()-3),MATCH(9E+307,$D2:INDEX(2:2,COLUMN()-4))),"")

boly93
質問者

お礼

遅くなりまして申し訳ありません。 無事ご教示頂いた方法で実現させることが出来ました。 あらためてINDEX関数、MATCH関数の組み合わせ方、ROW関数&COLUMN関数の組み合わせの奥深さを知りました。 素人考えでは思いつかないことも応用によってできてしまうのですね、これから積極的にそういう組み合わせを応用できないか実践していきたいと思います。 kagakusukiさんの回答をベストアンサーに選ばせていただきます。 何度もお答えいただきありがとうございました、また機会が有りましたらぜひよろしくお願いいたします。

その他の回答 (8)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.8

 回答No.2です。 >【質問時】最終売り上げ|最終受注目安 となっていたのですが >【改変後】最終売り上げ|最終原価|最終確度 >と3つの項目に増え、隣を参照するだけということにならなくなりました。  その説明ではどう変わったのかさっぱり解かりません。  「最終売り上げ」、「最終原価」、「最終確度」の3項目は、それぞれ何という列に入力されている様になったのですか?  そして、それらの列にはそれぞれどのような結果を表示させたいと考えておられるのですか?  それに、A列「受注目安1」、B列「売上1」、C列「受注目安2」、D列「売上2」というはターンは同じままなのでしょうか、それとも変わったのでしょうか?  もし変わったのであれば、それぞれ何列にどの値が入力される様に変わったのかという事と、それらの入力値の内、どれとどれが数値になっているのかという事も御説明願います。  上記の点が全て明らかにならない限りは、情報不足のため解決方法を示す事が出来ません。

boly93
質問者

補足

失礼しました、分かりやすく説明するため再度図を作成し直しました。 http://imgur.com/jdCP170 ご覧いただきます図のように、売上、原価、確度にそれぞれ日付が入っており、それが一週間刻みで更新されていきます(W行とX行の間に3行ずつ追加されていくイメージです) この時、例えば2602行ならば2015/11/5の欄に最終の数字が入っており、それぞれが右端の対応項目に入ります。 一方、2604行は2015/10/29の欄が最後の入力なので、それらの数値が右端の対応項目に入っております。 行ごとに一番最後に入力されている売上、原価、確度を転記したく、更に今後3行ずつ挿入をしても同じように反映されているとベターです。 こちらの説明でうまく伝わりましたでしょうか…? 拙い説明で申し訳ありません、何卒よろしくお願いいたします。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.7

G2に =IF(COUNT(A2:E2),INDEX(A2:E2,COUNT(A2:E2)*2-1),"") 以下コピー F2はG2の応用で出来ますが,別の式で =IF(COUNT(A2:E2),LOOKUP(9E+99,A2:E2),"") とかでも出来ます。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.6

提示の列数が少ないので列数を増やした状態で検証してみました。 最終売上=IF(COUNT(A2:H2),INDEX(A2:H2,COUNT(A2:H2)*2),"") 最終受注目安=IF(COUNT(A2:H2),INDEX(A2:H2,COUNT(A2:H2)*2-1),"")

  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.5

1.質問の画像のように、A~D列にデータを入力してF、G列にデータ取得する場合 F2式 =IF(B2="","",IF(D2="",B2,D2)) G2式 =IF(A2="","",IF(C2="",A2,C2)) 2.目標3、4と今後2列づつ挿入する場合、この場合もF列のひとつ前の列は添付されてるE列のように1列空白列があるものとしています。 F2式 =IF($A2="","",OFFSET($A2,,COUNTA(OFFSET($A2,,,,COLUMN(F2)-2))-1)) G2式 =IF($A2="","",OFFSET($A2,,COUNTA(OFFSET($A2,,,,COLUMN(F2)-2))-2)) 下方へオートフィル

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.4

私の理解が間違っていたらすみません。 この回答は、無視してください。 「A」列~「D」列は、すでに入力してあり(データがすべてそろっていて)、「F」列と「G」列に、その結果を反映させたい。 という理解で、以下のようなマクロを組みました。 Option Explicit Sub Test() Dim c, i As Integer For i = 2 To Range("A1").End(xlDown).Row If Cells(i, 1).Value = "未定" Then c = 3 Else c = 1 End If Cells(i, 6).Value = Cells(i, c + 1).Value Cells(i, 7).Value = Cells(i, c).Value Next i End Sub 失礼ながら、「VBA」の知識が無い方と想定して説明させて頂きます。 (何となく、質問の仕方から、「VBA」の知識はおありのようなのですが、念のため) 目的のエクセルファイルを開き、「Alt+F11」(Alt(「オルト」と読みます)キーを押しながら「F11」キー)を押します。 新しく画面が開きますので、その新しい画面でメニューから「挿入」→「標準モジュール」を選択すると、右側に、白い大きな画面が表示されます。 その白い大きな画面上にカーソルがすでにあるはずですので、上記のマクロを範囲指定して、「Ctrl+c」(コピー・記憶)、エクセルに戻って、白い大きな画面上で、「Ctrl+v」(ペースト・貼り付け)します。 あとは、「F5」を押せば、結果が出ています。 一応、説明致しますと、「A」列を1つずつ読み込んでいって、「未定」かどうかだけで、判断しています。

回答No.3

F2セルへ⇒=IF(ISBLANK(D2),B2,D2) G2セルへ⇒=IF(ISBLANK(C2),A2,C2) 以下オートフィルで下まで下げる 受注目安2が空白であれば受注目安1を取得し、空白でなければ目安2を取得します。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 要するに、A列の値が何であるのかには関係なく、兎に角、数値が入力されている最終列のセルに入力されている数値をF列のセルに表示させ、その最終列の1つ左にある列の値をG列のセルに表示させる様にすると考えれば宜しいのでしょうか?  もしそれで宜しければ、以下の様にされると良いと思います。  まず、F2セルに次の関数を入力して下さい。 =IF(COUNT($A2:E2),HLOOKUP(9E+307,$B2:E2,1),"")  次に、G2セルに次の関数を入力して下さい。 =IF(ISNUMBER($F2),INDEX($A2:D2,MATCH(9E+307,$B2:E2)),"")  次に、F2~G2の範囲をコピーして、F列~G列の3行目以下に貼り付けて下さい。  以上です。

boly93
質問者

補足

ありがとうございます、ほぼ完成系に近い状態になりました。 そしてせっかくお答えいただいた中再度質問となるのですが、 【質問時】最終売り上げ|最終受注目安 となっていたのですが 【改変後】最終売り上げ|最終原価|最終確度 と3つの項目に増え、隣を参照するだけということにならなくなりました。 その際、お教え頂いた関数+OFFSET関数を使うのでしょうか? お手数ですが、再度お教えいただけますと幸いです。

  • aokii
  • ベストアンサー率23% (5210/22062)
回答No.1

A列には最終行までには、ブランクセルがないので、以下の式でいかがでしょう。 =COUNTA(A:A)

boly93
質問者

お礼

ご回答ありがとうございました。 残念ながら、やや式として足りませんでした…

関連するQ&A

  • 何列の何行目が最終行なのか取得するコードはありますでしょうか?

      A列  B列  C列 1  ○   ○ 2        ○ 3               ○ これは最終行が3行目と言うのがぱっと見でわかりますが もっと列も行も多い場合、 シート内の何列の何行目が最終行なのか取得するコードはありますでしょうか? Cells(65536, ?).End(xlUp).Row を行ないたいのですが 毎回何列の行が一番下かを取得する方法があれば教えてください。 よろしくお願い致します。

  • 文字の場合でもA列の最終行の行番号を取得するには

    A列の最終行の行番号を、 =MATCH(10^10,A:A) を使えば取得できますが、 これはA列にの最終行が数値の時だけで、文字列が最終行の場合は無視されるようです。 文字列でも取得する方法はありますか? 10^10の部分を変更すればいいと思いますが、どうすればいいですか?

  • 列最終行を取得し別列に貼付け

    VBAでA列最終行を取得しB列にその行の値を貼付けることができますか宜しくお願いします。

  • VBAで最終行を取得する方法

    最終行を取得する方法について教えていただきたいです。 例えば以下のようなデータがあった場合 (A列~D列、3行までデータがある状態) -------------------------------- 田中 24歳 生命保険 営業 山口 47歳 銀行   営業 大野 36歳 IT    SE -------------------------------- ここで最終行を取得する際に、 Range("A1").End(xlDown).Rowをすれば取得できました。 しかしデータが以下のような場合 (A列が空白) -------------------------------- 田中 24歳 生命保険 営業    47歳 銀行   営業    36歳 IT    SE -------------------------------- この場合に上記と同じ取得方法をすると、オーバーフローになります。 そこで他の取得方法を調べたのですが、 ActiveSheet.UsedRange.Rowを試したところ、最終行として取得できたのは「1」でした。 A列が空白の状態でも、今回の場合だと「3」という最終行を取得するにはどうすれば良いでしょうか。

  • エクセルVBAでデータ最終行取得方法

    エクセルVBAでデータ最終行取得方法で良い方法を教えてください。 データの行数、列数は不定。 最多のデータ行の列も不定。 この条件で、データ最終行を取得するにはどうすればよいでしょうか? lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row では、A列の最終行に限定されます。 lastrow = ActiveSheet.Cells(1, "A").SpecialCells(xlLastCell).Row では、列の限定はありませんが、一旦データ入力後、削除した部分まで入ってしまいます。 lastrow = ActiveSheet.UsedRange.Rows.Count では、データ入力後、削除した部分まで入ってしまい、かつ、1行目など上部が空白の場合、不正確になります。

  • マクロで最終行を取得した列とは別の列の書式設定をしたい

    エクセルのマクロの組み方を教えて下さい A列にデータが入っているとします たとえばA8:A50までとします(変動します) A列の最終行50行目を取得したら、 S列8行目から、S列の、A列で取得した最終行目まで罫線を引きたいのです (開始が8行目は決定しています) どうしてもS列すべてに罫線が引かれてしまい、困っています 罫線の設定はこちらで組めるので、そこまでの例を出していただきたいのですが…… 今日昼まで仕上げなければならないので、回答よろしくお願いします

  • エクセルの関数で最終行の文字を取得したい

    エクセルの関数で、シート2のA1に、シート1のA列の最終行に入力されてる文字を取得したいのですが、どのような関数になるでしょうか?

  • EXCEL VBAによる列番号の取得

    a行のx列まである色で塗られている. 色の塗られている範囲で,最終列にあたるセルの 列番号を取得したい. このような場合,どのようにVBAを記述したらよいのでしょうか? どうぞよろしくお願いいたします.

  • エクセルVBAで最終行取得ができない

    エクセルVBAでたとえばC列にどこまでデータが入力されているかを調べるとき、通常は r = Cells(Rows.Count, "C").End(xlUp).Row などでできます。 しかし添付画像のような入力フォームが出来上がっており、かつC列に最初から何らか(画像では〒マーク)の入力がされているので、そこに回答者が途中まで入力された場合、これでは最終行は取得できません。 逆に上からEnd(xlDown)でやろうとしても、途中に空白セルがあってお手上げです。 余分な〒マークを元データから削除してしまいたいのですがそれでは入力されているところのマークまで消えてしまいます。 このようなファイルが何百もあり、それを1枚のシートにまとめようとしているのですが、この最終行取得でつまずいてしまいました。 どのような方法があるでしょうか? 画像はエクセル2013ですが、実際にマクロを動かすのは2010です。

  • マクロ CSVファイル取込 最終行、最終列の取得

    マクロでCSVファイルを取込むプログラムを作成しております。 最終行を取得するソースまではできたのですが、最終列を取得する処理ができておりません。 教えて頂けないでしょうか。 処理概要 (1)ボタンを押したら、Sheet2にCSVファイルがインポートされる (2)Sheet2に出力されたA2行~A8行とA2行~A8行の最終列までをSheet1のD4行~D10行、D4行~D10行の列にコピー  (3)Sheet2に出力されたA9行目はコピーしない (4)Sheet2に出力されたA10行以降とA10行以降の最終列までをSheet1のA13行以降の最終列までにコピー 現在のソースは(2)、(4)の最終列を取得するソース以外はできています。 (2)、(4)の最終列を取得し、コピーする方法を教えて下さい。 現在のソースです。 Sub READ_TextFile() Dim LoadFileName As String Dim LR As Long '選んだcsvファイルをSheet1に読み込む LoadFileName = Application.GetOpenFilename("CSVファイル(*.csv),*.csv", 1, "読み込むcsvファイルを選んで下さい", False) If LoadFileName = "False" Then Exit Sub Workbooks.Open LoadFileName Cells.Copy ThisWorkbook.Sheets("Sheet2").Range("A1") ActiveWorkbook.Close False 'Sheet2のA2:A8をSheet1のD4を先頭セルとする範囲にCopy Worksheets("Sheet2").Range("A2:A8").Copy Worksheets("Sheet1").Range("D4") 'Sheet2のA列のデータのある最終行を取得しLRという変数に入れる LR = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row 'Sheet2のA10からA列の最終行までをSheet1のA13を先頭セルとする範囲にCopy Worksheets("Sheet2").Range("A10:A" & LR).Copy Worksheets("Sheet1").Range("A13") End Sub

専門家に質問してみよう