|
▼ようちゃん さん:
>【F列に数字を記載し、空白でなければA列に10を記入するプログラム】
>Sub Sample2()
> Dim j As Long
>
> For j = 1 To 100
> If Cells(j, 6) <> "" Then
> Cells(j, 1).Activate
>
>ActiveCell.Value = 10
>End If
>Next j
>End Sub
これはなかなか参考になるコードです。このコードを見ただけで、書いた
人がどの程度VBAに習熟しているかが分かりますから。では、これを材料
にして、コードの記述法一般についておさらいしておきましょう。
'【F列に数字を記載し、空白でなければA列に10を記入するプログラム】
▼インデントをつける
まずコードにはインデントを付けてください。Loopの始まりの Forと
Loopの終了の Next が同じ桁位置にくるように、また、その中のコードは
TABで一段、段下げします。
If〜End If も同じです。(内部を段下げします)
Sub Sample2b()
Dim j As Long
For j = 1 To 100
If Cells(j, 6) <> "" Then
Cells(j, 1).Activate
ActiveCell.Value = 10
End If
Next j
End Sub
▼不用意にセルをアクティブにしない
あるセルに値を書き込む処理のために、セルをアクティブにする
操作は不要です。
セル.Value = 値
これだけで十分です。
▼空白の判定は IsEmpty関数をつかう
> If Cells(j, 6) <> "" Then
これは、セルが 長さ0 の文字列と等しくなかったら、という記述
をしています。ほんとは セルの「値が Empty でなかったら」を
判定したいのではありませんか? そういう時は 組み込み関数の
IsEmpty()を使います。 "" という文字列と比較するのはそのもの
ズバリの判定法ではありません。
Sub Sample2c()
Dim j As Long
For j = 1 To 100
If Not IsEmpty(Cells(j, 6).Value) Then
Cells(j, 1).Value = 10
End If
Next j
End Sub
▼For 〜Next よりも For Each 〜Next のほうが高速
セル範囲などのようなオブジェクトのコレクション内をLoopする
ときは、For Each 〜Next でLoopしたほうが高速です。
Sub Sample2d()
Dim f As Range
For Each f In Range("F1:F100")
If Not IsEmpty(f.Value) Then
f.EntireRow.Range("A1").Value = 10
End If
Next f
End Sub
▼Loopしないで一括処理できないか、考えてみる
これまでのコードは範囲内のセルをひとつづつ順に調査して判定
し、処理するコードを書いていました。
やりたいことが F列範囲内の「文字列が書き込まれているセル」の
A列に数値を代入する、 ということなら、Loopしないで処理を記述
する方法があります。
プロシージャ・コードの最初の
> On Error Resume Next
は、SpecialCellsメソッドが 「範囲内に文字列が書き込まれている
セル」がひとつもなかったときはエラーが発生し、コードの実行が
中断してしまうので、エラーがあっても Resumeしてつぎに進むよ
う進行を制御しています。
Sub Sample2e()
On Error Resume Next
With Range("F1:F100").SpecialCells(xlConstants, xlTextValues)
.Offset(, -5).Value = 10
End With
End Sub
※本題については、別スレの UO3 さんのサンプルも参考になさりながら、
もうしばらくご自分であがいてみてくださいな
|
|