|    | 
     ▼つぐみ さん: 
 
こんばんは 
 
マクロ記録について参考情報です。 
 
表題「Loopで」とあります。 
アップしたコードはループ構文の基本ですから是非、理解して習得してください。 
一方で、課題として「マクロ記録」と書かれていますね。 
アップしたコードそのものは、エクセル操作では実現できませんので 
エクセル操作をそのままコードに置き換えるマクロ記録もできません。 
 
ですので、後で説明した操作をマクロ記録したケースでお話しします。 
(2003で実行したケースです) 
 
まず、途中に空白セルのある列のデータ最終行。 
エクセルシートの本当の最終行を選択して、Ctrl/↑ をおしますと 
そこにいたるまでのスクロールバーの動きも記録されますが、それを取り除くと 
 
Sub Macro1() 
' 
' Macro1 Macro 
' マクロ記録日 : 2012/4/7 ユーザー名 : UO3 
' 
 
' 
  Range("A65536").Select 
  Selection.End(xlUp).Select 
End Sub 
 
このようなコードが生成されます。 
上記操作を行いますと、データ最終行のセルが「選択」されますので 
そのセル.Select となっていますが、求めたいのは、その行番号ですね。 
そのセル.Row が求める行番号です。 
それと、前にコメントしたとおり、65536 は2003のシートの最終行番号ですが 
2007以降は、この値も変化してきますので、ここは固定値ではなく、 
「動いているエクセルのバージョンにおけるシートの最終行」である Rows.Count を 
使うことをおすすめします。 
 
で、ここが重要なんですが、人間の操作をコピーするマクロ記録の宿命で 
やたらと ○○○.Select -> Selection.□□□ というペアが生成されます。 
これらは、ほとんど ○○○.□□□ と記述できますし、記述すべきです。 
 
ということを加味しますと、Macro1 は以下のようになります。 
 
Sub Macro1補正() 
  Dim maxRow As Long 
  maxRow = Range("A" & Rows.Count).End(xlUp).Row 
End Sub 
 
で、次に、ご説明した、コピーによる単価計算。データが20行あったとすれば、 
説明した操作でできあがるコードは以下になります。 
 
Sub Macro2() 
' 
' Macro2 Macro 
' マクロ記録日 : 2012/4/7 ユーザー名 : UO3 
' 
 
' 
  Range("D2:D20").Select 
  Selection.Copy 
  Range("C2").Select 
  ActiveSheet.Paste 
  Range("B2:B20").Select 
  Application.CutCopyMode = False 
  Selection.Copy 
  Range("C2").Select 
  Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _ 
    :=False, Transpose:=False 
  Application.CutCopyMode = False 
End Sub 
 
まず、この Select/Selection の部分をお化粧直しします。 
 
Sub Macro2補正_1() 
  Range("D2:D20").Copy Range("C2") 
  Range("B2:B20").Copy 
  Range("C2").PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _ 
    :=False, Transpose:=False 
  Application.CutCopyMode = False 
End Sub 
 
で、次に、固定値で生成された 20 を、データ最終行としての変数で与えます。 
データ最終行を求めるMacro1補正と合成しますと、最終的には以下になりますね。 
 
Sub Macro2補正_2() 
  Dim maxRow As Long 
  maxRow = Range("A" & Rows.Count).End(xlUp).Row 
  Range("D2:D" & maxRow).Copy Range("C2") 
  Range("B2:B" & maxRow).Copy 
  Range("C2").PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _ 
    :=False, Transpose:=False 
  Application.CutCopyMode = False 
End Sub 
 | 
     
    
   |