Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Excel 2010)
貼付け先が変動する場合のコピーの仕方
投稿日時: 18/02/24 11:31:31
投稿者: カールおじさん

シート[就業表]に4月から翌年3月までの1年分の月単位で5名の就業表がありますが、期中で就業者名が変わることがあります。変わった場合には変わった月から年度末3月までは変更なしとします。
下記のように、シート[基礎データ]に就業者名と変更適用月(下例では8月以降)があり、さらにC:D列にはシート[就業表]の各月の就業者名の先頭セル(B列)の行番号を記載してあります。
 

	A	B	C	D
1	氏名		月	行番号
2	aaa		4	7
3	bbb		5	18
4	ccc		6	29
5	ddd		7	42
6	eee		8	53
7			9	64
8			10	77
9			11	88
10	適用月		12	99
11	8		1	112
12			2	123
13			3	134

 
氏名が変更になり、その適用月を指定したときに、シート[就業表]の指定月以降期末3月までの氏名をコピペで変更したく下記のように自分の知識範囲でマクロを作成し、一応問題なく動くことは確認しました。
改善点(カッコイイ)等がありましたらご教示ください。
 
Sub 就業者情報変更()
Dim n As Integer
Dim r As Integer
Dim i As Integer
Dim 適用開始月 As Integer
Dim 月範囲 As Range
Dim 月行番号 As Range
     
    Application.ScreenUpdating = False
     
    Sheets("基礎データ").Select
    Range("A2:A6").Select
    Selection.Copy
    適用開始月 = Range("A11").Value
        Set 月範囲 = Worksheets("基礎データ").Range("C2:C13")
    n = Application.WorksheetFunction.Match(適用開始月, 月範囲, 0)
    For i = n To 12
        Set 月行番号 = Worksheets("基礎データ").Range("D2:D13")
        r = Application.WorksheetFunction.Index(月行番号, i, 0)
        Sheets("就業表").Select
        Cells(r, 2).Select
        ActiveSheet.Paste
    Next i
    Cells(1, 2).Select
     
    Application.ScreenUpdating = True
 
End Sub

回答
投稿日時: 18/02/24 12:23:17
投稿者: simple

Selectしないという観点を検討してみてください。
そう言う観点だけを考えて修正してみました。参考にしてください。
 

Sub 就業者情報変更()
    Dim n As Long
    Dim r As Long
    Dim i As Long
    Dim 月範囲 As Range
    Dim 月行番号 As Range
    Dim 適用開始月 As Long

    Application.ScreenUpdating = False

    Set 月範囲 = Worksheets("基礎データ").Range("C2:C13")
    Set 月行番号 = Worksheets("基礎データ").Range("D2:D13")

    適用開始月 = Sheets("基礎データ").Range("A11").Value
    Sheets("基礎データ").Range("A2:A6").Copy

    n = Application.WorksheetFunction.Match(適用開始月, 月範囲, 0)
    For i = n To 12
        r = Application.WorksheetFunction.Index(月行番号, i, 0)
        Sheets("就業表").Cells(r, 2).PasteSpecial xlPasteAll
    Next i

    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub

投稿日時: 18/02/25 11:55:10
投稿者: カールおじさん

simpleさんありがとうございました。
すっきりした感じですね。
ついでで申し訳ないですが、
次のことについて教えてください。
今回の変数宣言中で、n・ r・ i・ 適用開始月について
私は、整数で桁数が小さいので Integer を使いましたが
simpleさんは、Long を使われました
使い分けする利点があるのでしょうか。
それとも数値の場合 Long を使うのが原則でしょうか。

回答
投稿日時: 18/02/25 12:31:53
投稿者: simple

Integerが間違いということではありません。
メモリの量からはLongのほうが大きいですが、
処理効率はLongのほうがよいと言われています。
また、(この場合はちがいますが)行番号などは
Integerだとオーバーフローする懸念があります。
なので、わたしは大抵の場合整数はLong型を使うことにしています。
 
それよりも、大抵の処理はSelectする必要がありませんので、
そのことに重点をおいて考えてみてください。
Selectする書き方だと処理効率が低下するうえに、
可読性も低下します。
私は可読性の向上が大切なポイントだと思っています。

投稿日時: 18/02/25 13:55:42
投稿者: カールおじさん

simpleさんありがとうございました。
わかりました。
これからは、できるだけ Select を使わないで済むよう努力します。