アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

マクロでA列からU列まで罫線を引いています。

行の指定は8行目から任意の最終行までで、
今のところ最下段のコードで罫線を引いております。

VBA上級者の方ならお気づきだと思いますが、
1列づつ8行目から最終行まで取得する方法はわかるのですが、
この形式でA列からU列まで指定するコードの書き方がわかりません。

実用上このコードでも問題ないのですが、
もっと能率よくコードを書く方法があると思います。
なので、すいませんが、詳しい方、説明の上手な方、
コードで直接説明出来る方、

8行目から任意の最終行までで、かつ、A列からU列まで罫線を引くための
効率の良いコードの書き方を教えて下さい。

お手数ですがよろしくお願いします。

---------------------------------------------
Sub 罫線を引く()

n = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行まで
For i = 8 To n

Cells(i, "A").Borders.LineStyle = True
Cells(i, "B").Borders.LineStyle = True
Cells(i, "C").Borders.LineStyle = True
Cells(i, "D").Borders.LineStyle = True
Cells(i, "E").Borders.LineStyle = True

Cells(i, "F").Borders.LineStyle = True
Cells(i, "G").Borders.LineStyle = True
Cells(i, "H").Borders.LineStyle = True
Cells(i, "I").Borders.LineStyle = True
Cells(i, "J").Borders.LineStyle = True

Cells(i, "K").Borders.LineStyle = True
Cells(i, "L").Borders.LineStyle = True
Cells(i, "M").Borders.LineStyle = True
Cells(i, "N").Borders.LineStyle = True

Cells(i, "O").Borders.LineStyle = True
Cells(i, "P").Borders.LineStyle = True
Cells(i, "Q").Borders.LineStyle = True
Cells(i, "R").Borders.LineStyle = True

Cells(i, "S").Borders.LineStyle = True
Cells(i, "T").Borders.LineStyle = True
Cells(i, "U").Borders.LineStyle = True

Next i

End Sub

質問者からの補足コメント

  • うれしい

    みなさんご解答ありがとうございます。

    急に多忙になったので夜以降にゆっくり読ませて頂きます。

    すいませんがお礼や補足が遅れると思いますが、
    ちゃんと読みますのでしばらくお待ちください。

    いつもご解答ありがとうございます。

      補足日時:2017/03/17 15:10

A 回答 (5件)

こんにちは



すでに回答は出ていますが、手作業と同じように対象セル全体をまとめて選択しておいて罫線を引けば良いということはご存知と思います。

変数nの行までの範囲を取得する方法としては、ANo1様が回答されている方法以外にも、

'左上と右下のセルで範囲を指定
 Range(Cells(8, 1), Cells(n, 21))

'最初の1行の範囲を必要な行数分に拡張
 Range("A8:U8").Resize(n - 7)

'左上のセルから必要な行・列数分に拡張
 Range("A8").Resize(n - 7, 21)

などでも、同じセル範囲を取得することが可能です。

個人的には最後のものが利用しやすいと感じています。
ご参考まで。
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

いろいろ解答して頂きありがとうございます。
僕の感覚では最初のものがわかりやすいです。

2番目のものは
とりあえずA8からU8までを選択範囲として決めてしまい、
そこからn行までリサイズして行くということですよね。

この方法の要点は、そのままリサイズすると
最終行(n行)はいいとして、最初の行が1行目から始まってしまうため、
「-7」で、1行目から7行目までを削除するというところが
この方法の要点ですよね。

3番目も同様で、左上のA8はいいとして、
右下を指定したときに最初の7行を削除するというのが
この考え方のコツですよね。

僕が最初のものがわかりやすい理由が、このあたりで、
1行目から7行目まで削除する必要がない
というところが理解しやすいです。

最初と2番目のコードを全部書くと以下の通りですよね。

今回はご解答ありがとうございます。
機会がありましたら、またお願いします。

追記
No1さんのお礼にも書きましたが、上級者のみなさんって
ほとんど省略して説明するんですね。
ちょっとびっくりしました。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub 罫線を引くNo2_1()

n = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行まで
For i = 8 To n

Range(Cells(8, 1), Cells(n, 21)).Borders.LineStyle = True

Next i

End Sub

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Sub 罫線を引くNo2_2()

n = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行まで
For i = 8 To n

Range("A8:U8").Resize(n - 7).Borders.LineStyle = True

Next i

End Sub

お礼日時:2017/03/17 23:53

ANo2です。



少しだけ勘違いをなさっているようですので、締め切られる前に……

ANo1、2のお礼の欄に、Forループを用いたコードを書いていらっしゃいますが、両方ともループする必要はありません。
なぜなら対象になるセルを全て指定しているからで、その範囲に罫線を一度設定すれば、全部に引けることになるからです。
ちなみに、ANo3様のご提示は、最終行を求める処理も含めて1行のコードにまとめた記述の例になっています。

言わずもがなではありますが、ご参考までに。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。

ご指摘して頂いてびっくりしました。
おっしゃる通り、For~Next i でループになっているんですよね。

仕事の必要上、とにかく早く作りたいので、
みなさんに教えて頂いたコードを切り貼りして
その場しのぎをしてきましたので、気が付きませんでした。

やっと最近、基礎的な勉強を始めて
頂いたコードの内容を理解できるようになったところですので、
本当に参考になりました。

おっしゃることは以下の通りなんですよね。

いつもご解答して頂きありがとうございます。
機会がありましたらまたお願いします。

------------------------------------------
Sub 罫線を引くNo1()

n = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行まで
Range("A8:U" & n).Borders.LineStyle = True

End Sub
------------------------------------------
Sub 罫線を引くNo2_1()

n = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行まで
Range(Cells(8, 1), Cells(n, 21)).Borders.LineStyle = True

End Sub
------------------------------------------
Sub 罫線を引くNo2_2()

n = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行まで
Range("A8:U8").Resize(n - 7).Borders.LineStyle = True

End Sub

お礼日時:2017/03/18 09:23

こんにちは!



すでに回答は出ていますので、参考程度で・・・

Sub Sample1()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 7 Then
Range(Cells(8, "A"), Cells(lastRow, "U")).Borders.LineStyle = xlContinuous
End If
End Sub

でも大丈夫だと思います。m(_ _)m
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

考え方としてはNO.2さんと同様に
左上と右下で考えるんですよね。

この場合は
左上=(Cells(8, "A"),
右下=Cells(lastRow, "U")

ということですよね。

このコードの場合、「最終行が1行目から7行目までには入らない」ので、
そうなったときの対策を講じる必要があり
「If lastRow > 7 Then」 がそうですよね。

参考になりました。

今回はご解答ありがとうございます。
機会がありましたらまたお願いします。

追記
サブプロシージャーから全文を掲載して頂きありがとうございます。

お礼日時:2017/03/18 00:15

全部まとめるとこう?


Range(Cells(Rows.Count, "A").End(xlUp),range("U8")).Borders.LineStyle = True
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

お礼が遅くなりすいません。

最初、見たみた時は意味がわからなかったのですが、、、。

よく見ると、1行にまとめていて、、、しかもU列が8行目から始まるので、
8行目からのスタートに対して後から削除したり
エラー対策をする必要がないってことですよね。

すごくよく考えられていますよね。
※コードは以下のとおりなんですよね。

今回はご解答ありがとうございます。機会がありましたらまたお願いします。

---------------------------------------------
Sub 罫線を引くNo3()

Range(Cells(Rows.Count, "A").End(xlUp), Range("U8")).Borders.LineStyle = True

End Sub

お礼日時:2017/03/18 09:35

Set Sh = ActiveSheet


Sh.Range("A8:U" & n).Borders.LineStyle = True
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

シンプルなコードですが、
これで機能するんですね。

ご解答頂いたコードは以下のとおりですよね。
※今回はアクティブシート限定なので変数は省いています。

今回はご解答ありがとうございます。
機会がありましたらまたお願いします。


追記
上級者の人って、返答するときに
こんなに省いて要所だけで説明するんですね。
ちょっとびっくりしました。


------------------------

Sub 罫線を引くNO1()

n = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行まで
For i = 8 To n
Range("A8:U" & n).Borders.LineStyle = True

Next i

End Sub

お礼日時:2017/03/17 23:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!