VBScriptエクセルで最終行と最終列を取得する方法

このQ&Aのポイント
  • VBScriptを使用して、エクセルのシート内での最終行と最終列を取得する方法について教えてください。
  • 現在、複数のシートが含まれるエクセルファイルがあります。項目行は「C6」以降に配置され、項目列は「D5」以降に配置されています。
  • 項目行と項目列には空白のセルが存在しない場合、VBScriptで項目行と項目列の最終位置を取得する方法を知りたいです。
回答を見る
  • ベストアンサー

VBScript エクセル 最終行と最終列取得

今、たくさんのシートがある、エクセルのファイルがあり、「C6」以降が縦の項目行、「D5」以降が横の項目列です。 項目行と項目列には、間に空白のセルは存在しません。 この状態で、項目行、項目列の最終の場所を取得しなければなりません。 そこで、「r = Range("C6").End(-4121).Row」(「-4121」は「xlDown」)、「c = Range("D5").End(-4161).Column」(「-4161」は「xlToRight」)で次々に求めていったのですが、「C6」に縦の項目が1つだけ、「D5」に横の項目が1つだけ、というシートがありました。 すると、そのシートでは、「r」と「c」の値は、エクセルそのものの最大の行数と最大の列数が返ってきてしまいました。 そこで、「D6」にのみ、文字があるサンプルファイルを作り、そのサンプルファイルに対して、「r = Range("D5").End(-4121).Row」と「c = Range("C6").End(-4161).Column)」で求めると、ちゃんと、「r = 6」、「c = 4」という値が返ってきたので、「r」の場合は、1つ上から、「c」については、1つ左から「Range」を設定すればいい、と思って、実際のデータで試すと、他のシートでは、全然うまくゆきません。 結果的に、問題は、「If」文で、ムリヤリ解決させたのですが、「If」文の場合ですと、前もって全シートを確認して、調べておかなければなりません。 何とか、汎用的に項目が1つしかない場合も、その項目のある「行」と「列」が最終行、最終列として取得できる方法はないでしょうか? ただし、項目が「0個」ということはありませんので、そこまで考えて頂く必要はありません。 「VBA」でも結構ですので、よろしくお願いいたします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.1

最終行、列から検索というのではだめでしょうか。下もしくは右に次の何かしらデータがある場合には、それのひとつ手前をRows.CountとColumns.Countに置き換えればいいと思いますが。 Cells(Rows.Count, "C").End(xlUp).Row Cells(5, Columns.Count).End(xlToLeft).Column

Prome_Lin
質問者

お礼

さっそく、ありがとうございます。 そうですね、なぜ、気づかなかったのでしょう。 実は、本当は、実際のデータの最終行と最終列を求めたかったのですが、あまりにもデータがばらばらなので、あきらめて、項目の最終行と最終列を取得することにしました。 データの最終行と最終列の取得のプログラムを考えていたときは、後ろから取得する方法で考えていたのに、項目の時は、空白のセルが間にはさまらないことに、無意識にこだわりすぎていました。 ありがとうございました。

関連するQ&A

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

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

  • マクロ 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

  • オートフィルタ 最終行を指定する必要は?

    エクセルでVBAでオートフィルタをする場合、 ******************************************* Sub test1() 最終列 = Range("IV1").End(xlToLeft).Column Range(Cells(1, 1), Cells(1, 最終列)).AutoFilter End Sub Sub test2() 最終行 = Range("a65536").End(xlUp).Row 最終列 = Range("IV1").End(xlToLeft).Column Range(Cells(1, 1), Cells(最終行, 最終列)).AutoFilter End Sub ******************************************* どちらでもできるのですが、 test2のように最終行を取得・指定する必要はあるのでしょうか?

  • シート1のC列の最終行をコピーして同じ行に値貼り付けしたい

    シート1のC列の最終行を取得して その行を丸々値貼り付けするマクロを作りたいと思います。 シート3のB18の値をシート1のC列の最終行の1つ下のセルに値貼り付け すると、その行のA、B列に日付が入力される関数が入っています。(下まで) 関数が入ったままだと、うまくいかない時があるので最終行をコピーして値貼り付けしたいのですが、マクロの作り方を教えてください。 シート1の最終行に貼り付け Sheets("Sheet3").Select Range("B18").Select Selection.Copy Sheets("Sheet1").Select Range("C65536").End(xlUp).Offset(1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub 最終行をコピーして値貼り付け Dim 最終行 As Integer 最終行 = Range("C65536").End(xlUp).Row Range("A6:C" & 最終行).Select Selection.Copy Sheets("Sheet1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub このマクロだと、A6からC列の最終行まで全てコピーされてしまうので、C列の最終行のAからC列まで1行だけコピーできないでしょうか?

  • VBAで列を探して最終行までハイパーリンクを付けた

    A列に URL http://oshiete.goo.ne.jp/ http://oshiete.goo.ne.jp/ http://oshiete.goo.ne.jp/ http://oshiete.goo.ne.jp/ http://oshiete.goo.ne.jp/ http://oshiete.goo.ne.jp/ http://oshiete.goo.ne.jp/ http://oshiete.goo.ne.jp/ http://oshiete.goo.ne.jp/ が入ってる場合は、 Sub Sample1() Dim R As Range For Each R In Range("a2:a" & Cells(Rows.Count, "a").End(xlUp).Row) ActiveSheet.Hyperlinks.Add Anchor:=R, Address:=R.Value Next End Sub でハイパーリンクを付けられますが、 URL列がA列じゃない場合の応用の聞かせ方がわかりません。 場合によっては、画像のようにB列であったりC列であったりします。 なので Dim C As Long C = Cells.Find(What:="URL", LookAt:=xlWhole).Column で列番号を取得して、ループさせようと思ったのですが、 For Each R In Range("a2:a" & Cells(Rows.Count, "a").End(xlUp).Row) の部分でどうすればいいのかわかりません。 range表記ではなくcells表記にすればいいような気がしますがどうやって改造すればいいでしょうか? あと、この場合はForEachではなくDoloopやForNextを使った方が良いのでしょうか?

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

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

  • 最終列に入力されている文字を表示する

    エクセルVBAで最終列に入力されている値の表示方法について教えてください。 最終行については表示できるのですが、最終列に入力されているものの表示がうまくいきません。 A列の最終行の値をセル”D1”に表示するについては Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Long r = Cells(Rows.Count, 1).End(xlUp).Row Range("D1").Value = Cells(r, 1).Value End Sub でうまくいきました。 最終行、例えば3列目の10行目に”111”と入力されているときにセル”D1”に”111”と表示するようにはどうしたらよいのでしょうか。 どなたがご指南ください宜しくお願いします。

  • 最終行を探してSUMするには?

    またまたお願いします。 シートT_日計作業にその日の注文データがあります。 金額はC列です。セルC2から始まっていきます。 金額の合計を求めるマクロを書いてますがうまくいきません。 (1) 最終行を求められたのですが、C2から最終行までの   普通、範囲設定でRange("C2:C20").select と書きますよね。   最終行は z = Range("c1").End(xlDown).Rowで求めてあります。   今回の最終行がC20の場合、Z=20 となり   範囲指定は Range("C2:C&Z").Select ????   これがうまくいきません。何か 勘違いしているのでしょか? (2) ActiveCell.FormulaR1C1 = "=SUM(わかりません)"   (1)がクリアーしたとして どう書けばよいのでしょうか? 宜しくお願いします。 Sub 日計注文編() Dim z As Long Sheets("T_日計作業").Select '最終行番号を調べる If Range("c2").Value = "" Then z = 1 Else z = Range("c1").End(xlDown).Row End If 'C2から最終行番号までの合計を求める Range("C2:C&Z").Select ActiveCell.FormulaR1C1 = "=SUM(わかりません)" ・・・・

  • VBA 最終列に入力された値の表示について

    VBAで最終列に入力された値の表示について教えてください。 例えば10行目の10列目(J列)に”123”と入力された値をセル”D1”に表示させたいのですがどのようにすればよいのでしょうか。 A列の最終行については Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Long r = Cells(Rows.Count, 1).End(xlUp).Row Range("D1").Value = Cells(r, 1).Value End Sub でうまく表示できたのですが、最終列についてなかなかうまくいきません。 どなたかご指南ください宜しくお願いします。

  • 列の個数、行の個数を取得することは不可能ですか?

    http://okwave.jp/qa/q7981824.html の続きなのですが A1からD5まで値が入っているのに Sub Sampsle() Dim r As Range Set r = ActiveSheet.UsedRange End Sub で値を格納した場合、 列は全部で4つ 行は全部で5つなのですが ウォッチウインドウで確認すると Column : 1 : Long : Module1.Sampsle Row : 1 : Long : Module1.Sampsle になってしまうのですが、 オブジェクトに格納した値から 列の個数、行の個数を取得することは不可能ですか?

専門家に質問してみよう