こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2009-01-21 11:04:52

QNo.4648000

困ってます

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

#1です。
With
End With
もいらないですね。
というか使い方が間違ってます。

Sheets("Sheet2").Range(Cells(3,intXLine),Cells(lngYLine,intXLine)).ClearContents

投稿日時 - 2009-01-21 13:24:51

補足

早速の返事ありがとうございます。
ただ、アプリケーション定義またはオブジェクト定義のエラーです。
と表記されます。

以下のように改良しております。

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

投稿日時 - 2009-01-21 15:17:01

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

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

投稿日時 - 2009-01-21 17:36:17

ANo.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になります。

以上。
 

投稿日時 - 2009-01-21 17:16:11

お礼

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

投稿日時 - 2009-01-22 08:32:40

ANo.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
でもいいですね

投稿日時 - 2009-01-21 14:01:50

お礼

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

投稿日時 - 2009-01-22 08:30:54

ANo.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
というふうにプロシージャを終了させるほうがわかりやすいと思います。

投稿日時 - 2009-01-21 13:20:42

あなたにオススメの質問