Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10500 / 76734 ←次へ | 前へ→

【71780】Re:単価計算をLoop処理で行うVBAマクロの作成
発言  UO3  - 12/4/7(土) 20:49 -

引用なし
パスワード
   ▼つぐみ さん:

こんばんは

マクロ記録について参考情報です。

表題「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

5 hits

【71749】単価計算をLoop処理で行うVBAマクロの作成 つぐみ 12/4/5(木) 21:38 質問
【71750】Re:単価計算をLoop処理で行うVBAマクロの作... つぐみ 12/4/5(木) 21:40 発言
【71757】Re:単価計算をLoop処理で行うVBAマクロの作... UO3 12/4/6(金) 5:25 回答
【71758】Re:単価計算をLoop処理で行うVBAマクロの作... UO3 12/4/6(金) 9:18 発言
【71760】Re:単価計算をLoop処理で行うVBAマクロの作... つぐみ 12/4/6(金) 10:13 質問
【71761】Re:単価計算をLoop処理で行うVBAマクロの作... つぐみ 12/4/6(金) 10:24 質問
【71762】Re:単価計算をLoop処理で行うVBAマクロの作... ちん 12/4/6(金) 10:30 発言
【71764】Re:単価計算をLoop処理で行うVBAマクロの作... UO3 12/4/6(金) 16:42 発言
【71780】Re:単価計算をLoop処理で行うVBAマクロの作... UO3 12/4/7(土) 20:49 発言
【71802】Re:単価計算をLoop処理で行うVBAマクロの作... つぐみ 12/4/9(月) 17:05 お礼

10500 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free