• ベストアンサー

,最終行からA1の間に罫線を引く方法は?

お願いします。 罫線を引くマクロを書きました。(下記) 範囲のJ26は最終行です。この表のデータ量は変化します。 最終行がJ26とは限りません。Z5000かもしれません。 その範囲に罫線をひくのですが、マクロ的に最終行を認知してA1 まで罫線を引くマクロをどう記述すればよいのか教えてください。 Sheets("読み込み").Select Range("A1:J26").Select Range("J26").Activate Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With Range("J3").Select End Sub

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

ついでに.... > マクロ的に最終行を認知して 今回の用途では、Find メソッドを利用するのが一番確実でしょう。 ユーザー定義関数や Find メソッド等、初心者にはとっつき難い方法ですが、 最終セルを特定する手法として覚えておいて損はありません。 Sub Sample()   Dim rLastCell As Range      Set rLastCell = FindLastCell(ActiveSheet)   If rLastCell Is Nothing Then     MsgBox "対象セルはありません", vbInformation   Else     Range(Cells(1, 1), rLastCell).Borders.LineStyle = xlContinuous   End If   Set rLastCell = Nothing End Sub ' // シート内の最終セルを求める Public Function FindLastCell(ByVal Sh As Worksheet) As Range     Dim lERow As Long, lECol As Long      On Error GoTo Err_   lERow = Sh.Cells.Find(What:="*", _              LookIn:=xlValues, _              SearchDirection:=xlPrevious, _              SearchOrder:=xlByRows).Row   lECol = Sh.Cells.Find(What:="*", _              SearchDirection:=xlPrevious, _              SearchOrder:=xlByColumns).Column   Set FindLastCell = Sh.Cells(lERow, lECol)   Exit Function Err_:   Set FindLastCell = Nothing End Function 以下は余談まで。 最終セルを調べる方法として一般に良く知られる方法は、  ・End プロパティーを利用する  ・UsedRange を利用する  ・SpecialCells(xlCellTypeLastCell) を利用する などがあります。 上記方法のうち、値のある最終行を確実にとれるのは End プロパティーのみです。 ただし、この方法が有効なのは「この列に最終データがある」ということが、予め 判明している場合のみ。そうでなければ、この方法は不確実です。   ' // A列の最終セルを求める   Msgbox Cells(Rows.Count,"A").End(xlUp).Address その他の UsedRange や SpecialCells の方法では、確かに最終セルがとれるの ですが、多くの場合期待するセルとは異なります。 例えば、次のテストをしてみて下さい。 1. A 列全体を選択し、フォントを太字に設定 2. A1:C5 まで適当なデータを入力 この状況で、次のコードを実行します。 Sub Test1()   MsgBox "Usedrange:= " & ActiveSheet.UsedRange.Address End Sub 結果でわかるとおり、「セルの書式を設定しただけ」で「使用済みセル」となっ ています。SpecialCells(xlCellTypeLastCell) も同様です。  # この特性について、これはこれで用途があります。  # 決して UsedRange や SpecialCells を否定しているわけではありません。

K-19
質問者

お礼

有難うございます。とても細かく書いていただき感謝です。 貴殿のかいている記述を勉強して理解します。 分からなかったらまた投稿します。 有難うございます。

その他の回答 (5)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

> Sheets("読み込み").UsedRange.Selectを > 三行の変わりに入れたのですがデバックしました。 > なぜでしょう? エラーの原因は UsedRange そのものではありません。 1. Activesheet 以外のものを Select しようとするとエラーになります。   つまり、Sheets("読み込み") が非アクティブのとき、このマクロを   実行するとエラーになります。   直前にそのシートを Activate しましょう。   Sheets("読み込み").Activate   Sheets("読み込み").UsedRange.Select   以下略 2. シートに使用済みセルがない場合、UsedRange は A1 セルを返します。   または、使用済みセルが1つしかない場合も単一セルを返します。   この時、      > With Selection.Borders(xlInsideVertical)      のようにセルの内部罫線を設定しようとするとエラーになります。   なぜなら、単一セルには内部罫線をひきようもないからです。   Sheets("読み込み").Activate   Sheets("読み込み").UsedRange.Select   If Selection.Cells.Count=1 Then   ~   End If   のように UsedRange の結果、単一セルであったら条件分岐させて   内部罫線はひかないようにします。

K-19
質問者

お礼

有難うございます。   Sheets("読み込み").Activate で解決しました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

ANo.3さん >それと、いきなりシートを指定して、UsedRange.Select をしたので、エラーが発生したのだろうと思います。 >本当は、そのような使い方は考えられないことなのですが。 私も1つ勉強致しました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >Sheets("読み込み").UsedRange.Selectを >三行の変わりに入れたのですがデバックしました。 当然ですが、マクロは、標準モジュールに書いているものとします。シートモジュールではエラーが出ます。 それと、いきなりシートを指定して、UsedRange.Select をしたので、エラーが発生したのだろうと思います。本当は、そのような使い方は考えられないことなのですが。 それ以外のエラーは、シート名が違っているとかでしょう。 >J26とは限りません。Z5000かもしれません。 それと、質問等に出された条件では、「マクロ的に最終行を認知して」ということは出来ません。UsedRangeでも、SpecialCells(xlCellTypeLastCell) でも、誤作動します。目で見えるものが、必ず、最終行、最終セルではありません。 通常は、End プロパティを使いますが、列も行も決まっていない最終行を取るのは、非常に難しいように思います。 「マクロ的」というのは、VBAのメソッドというように解釈しましたが、最終データを探すメソッドは、厳密にはありません。あくまでも、最終セルは、人為的に操作したセルという意味で、そこにデータがあるとは限りません。 データとしての最終行を1列ずつ、物理的に探さないと不可能なのです。そうでなければ、最終セルを決めるためのルールが必要です。 以下は、あまり良くない見本です。これで試してみれば分かるはずです。最終セルが取れないときがあるはずです。UsedRangeでも同じです。 Sub LineMaking() Dim LastCell As Range   Application.ScreenUpdating = False   With Worksheets("読み込み")     .Select     Set LastCell = .Cells.SpecialCells(xlCellTypeLastCell)     .Range("A1", LastCell).Borders.LineStyle = xlNone     With .Range("A1", LastCell)         With .Borders           .LineStyle = xlContinuous           .Weight = xlThin           .ColorIndex = 1 'black         End With     End With     .Cells(3, LastCell.Column).Select   End With    Set LastCell = Nothing   Application.ScreenUpdating = True End Sub

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

>Sheets("読み込み").UsedRange.Select データがA1から始まっているのなら、 Range("A1").CurrentRegion.Select はどうでしょう?

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Sheets("読み込み").Select Range("A1:J26").Select Range("J26").Activate の代わりに Sheets("読み込み").UsedRange.Select 罫線については参考URLを見てみて下さい

参考URL:
http://www.officetanaka.net/excel/vba/cell/cell07.htm
K-19
質問者

お礼

ありがとうございます。罫線についての細かなサイトで勉強になりました。 Sheets("読み込み").UsedRange.Selectを 三行の変わりに入れたのですがデバックしました。 なぜでしょう?

関連するQ&A