dポイントプレゼントキャンペーン実施中!

こんにちは。
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

A 回答 (5件)

#1です。


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

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

この回答への補足

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

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

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
    • good
    • 0

#1です。


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

そのエラーが出るということはコードの書き方が拙いのです。


それに、コードの書く場所も違います。


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

以上。
 
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/22 08:32

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
でもいいですね
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/22 08:30

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

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