| 
    
     |  | ▼ようちゃん さん: 
 >【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 さんのサンプルも参考になさりながら、
 もうしばらくご自分であがいてみてくださいな
 
 
 |  |