• ベストアンサー

EXCEL VBA 文字 アドレス 検索 消去 セル

こんにちは。 EXCELの中にボタンを設置して以下のような動作をさせたいと思っておりますが、うまくいきません。 どのように改良すればよろしいでしょうか? 1.「end」の文字を検索し、そのセルのアドレスを取得する 2.取得したアドレスの行に関する値から一つ引いた値を計算で求める。例えばendがA10にあれば、A9とする 3.次にA3からA9までの範囲を消去する。 以下が自作したプログラムです。 Sub ボタン1_Click() Dim srcSheets As Worksheet Dim sinki As Integer sinki = MsgBox("データを消去しますか", vbYesNo) Select Case sinki Case vbYes '選択肢 Dim lngYLine As Long Dim intXLine As Integer Set Obj = Worksheets("Sheet2").Cells.Find("end") 'Sheet2の中でendを検索する。セルの場所を特定する。 If Obj Is Nothing Then MsgBox "endが見つかりません" Else lngYLine = Worksheets("Sheet2").Cells.Find("end").Row intXLine = Worksheets("Sheet2").Cells.Find("end").Column lngYLine = lngYLine - 1 End If With Sheets("Sheet2").Range("A3:intXLine+lngYLine").ClearContents End With End Select End Sub

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

  • ベストアンサー
  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.2

#1です。 With End With もいらないですね。 というか使い方が間違ってます。 Sheets("Sheet2").Range(Cells(3,intXLine),Cells(lngYLine,intXLine)).ClearContents

defmerube
質問者

補足

早速の返事ありがとうございます。 ただ、アプリケーション定義またはオブジェクト定義のエラーです。 と表記されます。 以下のように改良しております。 Sub ボタン1_Click() Dim srcSheets As Worksheet Dim sinki As Integer sinki = MsgBox("データを消去しますか", vbYesNo) Select Case sinki Case vbYes 'データを削除 Dim lngYLine As Long Dim intXLine As Integer Set Obj = Worksheets("Sheet2").Cells.Find("end") 'endを検索する If Obj Is Nothing Then MsgBox "endが見つかりません" Else lngYLine = Obj.Row intXLine = Obj.Column lngYLine = lngYLine - 1 End If Sheets("Sheet2").Range(Cells(3, intXLine), Cells(lngYLine, intXLine)).ClearContents End Select End Sub

その他の回答 (4)

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.5

#1です。 endが見つからないときはクリアを実行してはいけないので Else (略) 'End If ←削除 Sheets("Sheet2").Range(Cells(3, intXLine), Cells(lngYLine, intXLine)).ClearContents End If '←追加 ですね。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

そのエラーが出るということはコードの書き方が拙いのです。 それに、コードの書く場所も違います。 >End If >Sheets("Sheet2").Range(Cells(3, intXLine), Cells(lngYLine, intXLine)).ClearContents 上記2行を下記4行と入れ替えてください。    With Sheets("Sheet2")  .Range(.Cells(3, "A"), .Cells(lngYLine, intXLine)).ClearContents  End With  End If 値のクリアーは、必ず【A3】からendの前のセルまでですよね? 例えば、endが A7にあったら、A3~A6をクリアー C7にあったら、A3~C6をクリアー ということです。 また、 Range(.Cells(3, intXLine), .Cells(lngYLine, intXLine)) このようにすると、 endがC7にあったらクリアーされるのは、C3~C6になります。 以上。  

defmerube
質問者

お礼

分かりやすい解説ありがとうございます。 意図していたプログラムを作ることができました。 どうやら、 .Range(.Cells(3, "A"), .Cells(lngYLine, intXLine)).ClearContents の使い方が根本的にわかっていなかったようです。

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.3

Set Obj = Worksheets("Sheet2").Cells.Find("end") Cells のFindメソッドは、該当したレンジを返しますので、 lngYLine = Worksheets("Sheet2").Cells.Find("end").Row intXLine = Worksheets("Sheet2").Cells.Find("end").Column lngYLine = lngYLine - 1 ここは、 lngYLine = Obj.Row intXLine = Obj.Column lngYLine = lngYLine - 1 でもいいですね

defmerube
質問者

お礼

簡略化のアドバイスありがとうございます。 こちらの方がすっきりして、見やすくなりました。 ぜひ、活用させていただきたいと思います!

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.1

With Sheets("Sheet2").Range(Cells(3,intXLine),Cells(lngYLine,intXLine)).ClearContents でいいのでは。 ちなみに sinki = MsgBox("データを消去しますか", vbYesNo) If sinki = vbNo then Exit Sub If Obj Is Nothing Then MsgBox "endが見つかりません" Set Obj = Nothing Exit Sub End If というふうにプロシージャを終了させるほうがわかりやすいと思います。

関連するQ&A