|
▼KK さん:
>とちゅうでアプリケーション定義またはオブジェクト定義のエラーと表示され
>1行目に1が入ったところで止まります
> Do Until ActiveCell.Value = "end"
> If IsNumeric(ActiveCell.Value) Then
> Dim K As Integer
> For K = 1 To 1000
> ActiveCell.Offset(0, 10).Value = K
> ActiveCell.Offset(0, -10).Select
> Next K
> End If
> ActiveCell.Offset(1, 0).Select
> Loop
すざましいことをしていますね!?!?
アプリケーション定義エラーの直接の原因は ◆ の行にあります。
> For K = 1 To 1000
> ActiveCell.Offset(0, 10).Value = K
> ActiveCell.Offset(0, -10).Select '◆
> Next K
いまLoopの最初のセルは[I2]です。ここがActiveCellです。
ここに数値が入っているか、空白ですと、プログラムの実行は
ActiveCell.Offset(0, 10) セルに 1000回 値K を書き込む処理をしています。
(何のために 1000回 同じセルに書き込む必要があるのか? ここも疑問ですけど)
たとえば そこを
繰り返しなしで
K = K + 1
> ActiveCell.Offset(0, 10).Value = K
> ActiveCell.Offset(0, -10).Select '◆
と修正したとしましょう。
それでもエラーは出ます。
理由は ◆のところで [I2]セルから 10列左 のセルを Select しなさい、
となっているからです。I列から 10列左のセル なんてないですよね?
こういうのは、 最初に "end" のあるセルを Findメソッドか Worksheetの
Match関数で見つけておいて [I2] から その"end" のあるセルのひとつ上の
セルまで For Each Next で Loopするとしたほうが分りやすいし、効率的です。
それから、さっきも言いましたが、
Dim c As Range
For Each c In Range([I2:I30]
> If IsNumeric(c.Value) Then
IsNumericは数値化可能かどうか調べる関数で、空白セルも(0に数値化可能
なので)IsNumeric(空白セル.Value) は True になります。
ここは2重のIf文にして、
最初に If Not IsEmpty(c.Value) Then で 空白セルでないことを判断し、
その中で(空白セルでないときのみ)
If IsNumeric(c.Value) Then
とすべきです。
他にもありますが、とりあえず、この辺りを再調査してコーディングして
みてください。
|
|