• ベストアンサー

文字が入力されているセルの位置取得について

セルに文字が入力されている 最左列・最右列・最上行・最下行 を求める場合、 最左列=ActiveSheet.UsedRange.Column 最右列=ActiveCell.SpecialCells(xlLastCell).Column 最上行=ActiveSheet.UsedRange.Row 最下行=ActiveCell.SpecialCells(xlLastCell).Row でよろしいですか? 教えて下さい。

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

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.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 "「最左列・最右列・最上行・最下行」=「" _  & 最左列 & "," & 最右列 & "," & 最上行 & "," & 最下行 & "」"

okayama394
質問者

お礼

お忙しい中、ありがとうございました。 結局、結合されたセルについては、一回結合を解いた上で、 起点と終点を求めることにしました。 文字列検索を行うツールを作成していたのですが、 全体(65536行256列)を対象とすると時間が かかってしまうため、文字列が入力されている範囲のみを 対象にするために、今回の質問をさせて頂きました。 色々、ありがとうございました。

その他の回答 (3)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

>セルが結合している場合、位置が正しく取得できないようです。  原因を存じませんし、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.2

[回答番号: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

okayama394
質問者

お礼

ご回答頂きありがとうございます。 もう1つだけ教えて頂きたいことがあります。 セルが結合している場合、位置が正しく取得できない ようです。 例えば、 (1)2行目において、B列とC列を結合し、文字入力 (2)3行目において、E列に文字を入力 すると、開始位置が2行5列、終了位置が3行5列 となってしまい、開始列が正しく取得できません。 どうすれば良いか教えて下さい。お願いします。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

>セルに文字が入力されている最左列・最右列・最上行・最下行を求める のでしたら、全くだめだと存じます。  例えば、添付画像のように、「セルに文字が入力されている」領域の外側に「網掛け」が施された セル があったりすると、 「最左列・最右列・最上行・最下行」=「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

okayama394
質問者

お礼

お忙しい中、ご回答を頂きありがとうございました。 2点ほど、質問させて下さい。 (1)2行B列と3行C列に各々文字列を入力し、実行したところ  最左行が3、最上行が3となってしまいました。 (2)シート上に文字列が入力されているセルが1つもないかどう  かの判定をどうすればよろしいでしょうか。 お願い致します。

関連するQ&A