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