• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA 繰り返し処理について教えてください)

VBA繰り返し処理でExcel表の小計行に斜め線を引く方法

このQ&Aのポイント
  • VBAを使用して、Excelの表にある「小計」の行に斜め線を引く方法について教えてください。
  • 「小計」の行は数量や単位が不定であり、複数回出現します。繰り返し処理を使って、「小計」の行を検索し、斜め線を引く処理を行いたいと思っています。
  • 現在、繰り返し処理を行うためのコードを記述しましたが、うまく動作しておらず、無限ループになってしまいます。B列に入力されている最後のセルまで検索し、処理を終了する方法について、具体的な記述方法を教えていただけますか?

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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  

shino_chan
質問者

お礼

回答ありがとうございます。 無限ループに入った理由がわかりました! 行挿入のためだったのですね。勉強になりました!! 早速試してみたら、期待通りの結果が得られました。 本当にありがとうございました(*^_^*) またお聞きすることがあるかもしれませんが、よろしくお願い致します。

その他の回答 (1)

回答No.1

firstAddress を 代入していますよね。 検索対象がそのアドレスと同じだったら もう終わりという処理にしたらいけると思います。 次々検索するためにはFindNextという命令があるので 調べてみてください。

shino_chan
質問者

お礼

回答ありがとうございます。 実は教えていただいた方法はすでに試したのですが、無限ループに入ってしまい困ってしまったのです。

関連するQ&A

専門家に質問してみよう