- ベストアンサー
VBA繰り返し処理でExcel表の小計行に斜め線を引く方法
- VBAを使用して、Excelの表にある「小計」の行に斜め線を引く方法について教えてください。
- 「小計」の行は数量や単位が不定であり、複数回出現します。繰り返し処理を使って、「小計」の行を検索し、斜め線を引く処理を行いたいと思っています。
- 現在、繰り返し処理を行うためのコードを記述しましたが、うまく動作しておらず、無限ループになってしまいます。B列に入力されている最後のセルまで検索し、処理を終了する方法について、具体的な記述方法を教えていただけますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 それは、行の挿入を加えているので、1順してくると、最初に見つけた場所と違ってしまいますから、たとえFindNext を使用しても、無限ループになってしまいます。ですから、今の方法ですと、「小計」という文字の数を数えて処理するしかないと思います。それと、こういう場合は、サブルーチンにしたほうが、読みやすくなります。 ただし、WorksheetFunction.CountIf(Cells, "*小計*") は、本来は、列が決まっているなら、たとえば、Cells の代わりに、Columns(3) などのほうがよいと思います。なお、位置関係などの係数は、こちらでは分かりませんので、そのまま移しました。 Sub 斜め線描画R() Dim MyLine As Shape Dim c As Range Dim cnt As Integer Dim i As Integer cnt = WorksheetFunction.CountIf(Cells, "*小計*") Set c = Cells.Find(What:="小計", _ LookIn:=xlFormulas, _ LookAt:=xlPart) If Not c Is Nothing Then i = 1 Call LineArranging(c) Do If i >= cnt Then Exit Sub 'カウントでチェック Set c = Cells.FindNext(c) If c Is Nothing Then Exit Sub Call LineArranging(c) i = i + 1 Loop End If Set c = Nothing End Sub Sub LineArranging(rng As Range) Dim BX As Double, BY As Double, EX As Double, EY As Double Dim rngStart As Range, rngEnd As Range Dim myLine As Shape Set rngStart = rng.Offset(1, -1) Set rngEnd = rng.Offset(-2, 0) BX = rngStart.Left BY = rngStart.Top EX = rngEnd.Left + rngEnd.Width EY = rngEnd.Top With rng.Offset(-2, 0) .EntireRow.Insert .RowHeight = 2 End With With rng.Offset(1, 0) .EntireRow.Insert .RowHeight = 2 End With Set MyLine = Sheet4.Shapes.AddLine(BX, BY, EX, EY) BX = BX + 151.5 BY = BY - 27 EX = EX - 152.25 EY = EY + 26.25 Set MyLine = Sheet4.Shapes.AddLine(BX, BY, EX, EY) Set rngStart = Nothing Set rngEnd = Nothing Set MyLine = Nothing End Sub
その他の回答 (1)
- SAKENOSAKA
- ベストアンサー率32% (78/240)
firstAddress を 代入していますよね。 検索対象がそのアドレスと同じだったら もう終わりという処理にしたらいけると思います。 次々検索するためにはFindNextという命令があるので 調べてみてください。
お礼
回答ありがとうございます。 実は教えていただいた方法はすでに試したのですが、無限ループに入ってしまい困ってしまったのです。
お礼
回答ありがとうございます。 無限ループに入った理由がわかりました! 行挿入のためだったのですね。勉強になりました!! 早速試してみたら、期待通りの結果が得られました。 本当にありがとうございました(*^_^*) またお聞きすることがあるかもしれませんが、よろしくお願い致します。