|
▼つぐみ さん:
こんばんは
マクロ記録について参考情報です。
表題「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
|
|