- ベストアンサー
文字が入力されているセルの位置取得について
セルに文字が入力されている 最左列・最右列・最上行・最下行 を求める場合、 最左列=ActiveSheet.UsedRange.Column 最右列=ActiveCell.SpecialCells(xlLastCell).Column 最上行=ActiveSheet.UsedRange.Row 最下行=ActiveCell.SpecialCells(xlLastCell).Row でよろしいですか? 教えて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
[回答番号:No.2] の 最後の4行を使いたくなったので、もう一つ。 例3) Dim 最左列, 最右列, 最上行, 最下行 ActiveSheet.Copy Cells.ClearFormats 最左列 = ActiveSheet.UsedRange.Column 最右列 = Cells.SpecialCells(xlLastCell).Column 最上行 = ActiveSheet.UsedRange.Row 最下行 = Cells.SpecialCells(xlLastCell).Row ActiveWorkbook.Close SaveChanges:=False Debug.Print "「最左列・最右列・最上行・最下行」=「" _ & 最左列 & "," & 最右列 & "," & 最上行 & "," & 最下行 & "」"
その他の回答 (3)
- DOUGLAS_
- ベストアンサー率74% (397/534)
>セルが結合している場合、位置が正しく取得できないようです。 原因を存じませんし、MS社のサイトにも芳しい説明を発見できませんでしたが、[Find メソッド] は「結合セル」をスルーするようです。 振り出しに戻りますが、というか、そういう特殊な ケース は、正に、 >okayama394 さんの目の前にある ワークシート に則した コーディング をされることが勉強に繋がると存じます が、「ヤリ方」は色々あろうかと存じます。 例1) Dim 最左列, 最右列, 最上行, 最下行 Dim i As Long Dim MyRng As Range Set MyRng = Cells.SpecialCells(xlCellTypeLastCell) For i = 1 To MyRng.Column If Application.CountA(Columns(i)) > 0 Then 最左列 = i: Exit For Next For i = MyRng.Column To 1 Step -1 If Application.CountA(Columns(i)) > 0 Then 最右列 = i: Exit For Next For i = 1 To MyRng.Row If Application.CountA(Rows(i)) > 0 Then 最上行 = i: Exit For Next For i = MyRng.Row To 1 Step -1 If Application.CountA(Rows(i)) > 0 Then 最下行 = i: Exit For Next Debug.Print "「最左列・最右列・最上行・最下行」=「" _ & 最左列 & "," & 最右列 & "," & 最上行 & "," & 最下行 & "」" 例2) Dim 最左列, 最右列, 最上行, 最下行 Dim MyRng As String Dim MyAdd As Variant Dim i As Long Dim MyRow() As Long Dim MyCol() As Long MyRng = Union( _ Range(Cells.SpecialCells(xlCellTypeConstants, 23).Address), _ Range(Cells.SpecialCells(xlCellTypeFormulas, 23).Address)).Address MyRng = Replace(MyRng, ":", ",") MyAdd = Split(MyRng, ",") ReDim MyRow(UBound(MyAdd)) ReDim MyCol(UBound(MyAdd)) For i = 0 To UBound(MyAdd) MyRow(i) = Range(MyAdd(i)).Row MyCol(i) = Range(MyAdd(i)).Column Next 最左列 = Application.Min(MyCol) 最右列 = Application.Max(MyCol) 最上行 = Application.Min(MyRow) 最下行 = Application.Max(MyRow) Debug.Print "「最左列・最右列・最上行・最下行」=「" _ & 最左列 & "," & 最右列 & "," & 最上行 & "," & 最下行 & "」"
- DOUGLAS_
- ベストアンサー率74% (397/534)
[回答番号:No.1] の DOUGLAS_ です。 前回答に「たとえば、・・」と書きましたのは、参考URL を参照して、そこから広げて考えていただきたかったのですが...。 >(1)2行B列と3行C列に各々文字列を入力し、実行したところ >最左行が3、最上行が3となってしまいました。 この場合「ActiveSheet.UsedRange」が「B2:C3」になりますが、[Find メソッド] の ヘルプ をご覧いただくと、引数 [After] の項に 検索は指定したセルの次から始まるので、指定したセル自体は、検索が範囲全体を一度検索して戻ってくるまで検索されません。この引数を省略すると、対象セル範囲の左上端のセルが検索の開始点となります。 とあります。 >(2)シート上に文字列が入力されているセルが1つもないかどう >かの判定をどうすればよろしいでしょうか。 以上、2件を踏まえて、前回答のままで手直しすると、 If Cells.Find("*") Is Nothing Then 最左列 = 0 最右列 = 0 最上行 = 0 最下行 = 0 Else With Cells If Range("A1") <> "" Then 最左列 = 1 最上行 = 1 Else 最左列 = .Find("*", , xlFormulas, , xlByColumns, xlNext).Column 最上行 = .Find("*", , xlFormulas, , xlByRows, xlNext).Row End If 最右列 = .Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column 最下行 = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row End With End If というようなことになりますが、いずれにせよ、いろいろな方法がありますので、参考URL に書いてあることをよくお読みになって、okayama394 さんの目の前にある ワークシート に則した コーディング をされることが勉強に繋がると存じますよん。 例えば、 最左列 = ActiveSheet.UsedRange.Column 最右列 = Cells.SpecialCells(xlLastCell).Column 最上行 = ActiveSheet.UsedRange.Row 最下行 = Cells.SpecialCells(xlLastCell).Row
お礼
ご回答頂きありがとうございます。 もう1つだけ教えて頂きたいことがあります。 セルが結合している場合、位置が正しく取得できない ようです。 例えば、 (1)2行目において、B列とC列を結合し、文字入力 (2)3行目において、E列に文字を入力 すると、開始位置が2行5列、終了位置が3行5列 となってしまい、開始列が正しく取得できません。 どうすれば良いか教えて下さい。お願いします。
- DOUGLAS_
- ベストアンサー率74% (397/534)
>セルに文字が入力されている最左列・最右列・最上行・最下行を求める のでしたら、全くだめだと存じます。 例えば、添付画像のように、「セルに文字が入力されている」領域の外側に「網掛け」が施された セル があったりすると、 「最左列・最右列・最上行・最下行」=「2,13,3,11」 となってしまいます。 たとえば、 With ActiveSheet.UsedRange 最左列 = .Find("*", , xlFormulas, , xlByColumns, xlNext).Column 最右列 = .Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column 最上行 = .Find("*", , xlFormulas, , xlByRows, xlNext).Row 最下行 = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row End With のようにすると 「最左列・最右列・最上行・最下行」=「4,10,5,9」 となります。 お使いの ワークシート の構成に大いに左右されますので、下記をご参考に...。 ●No.8 ワークシートの最終行、最終列を取得する http://www.niji.or.jp/home/toru/notes/8.html ●Excel(エクセル) VBA入門:セル範囲の指定方法 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html
お礼
お忙しい中、ご回答を頂きありがとうございました。 2点ほど、質問させて下さい。 (1)2行B列と3行C列に各々文字列を入力し、実行したところ 最左行が3、最上行が3となってしまいました。 (2)シート上に文字列が入力されているセルが1つもないかどう かの判定をどうすればよろしいでしょうか。 お願い致します。
お礼
お忙しい中、ありがとうございました。 結局、結合されたセルについては、一回結合を解いた上で、 起点と終点を求めることにしました。 文字列検索を行うツールを作成していたのですが、 全体(65536行256列)を対象とすると時間が かかってしまうため、文字列が入力されている範囲のみを 対象にするために、今回の質問をさせて頂きました。 色々、ありがとうございました。