プロが教えるわが家の防犯対策術!

データの入っている行だけを繰り返し処理したく以下マクロ記述しましたが上手くいきません。宜しく御願いします。

E列に空白列を挿入。
E3に「月」と入力しE4にD4の年月日から年月だけを取り出すように組みたく下記記述したのですがエラーになってしまいました。
どのように記述したら良いでしょうか?
..A..B..C...D.........E.......F
1
2
3 * * * 納期 月    *
4 09.10/08  09.10
5

   記
Sub 年月test()
'
' 年月test Macro
' マクロ記録日 : 2009/11/15 ユーザー名 : TH
'

'
Columns("E:E").Select
Selection.Insert Shift:=xlToRight
Range("E3").Select
ActiveCell.FormulaR1C1 = "月"
ActiveCell.Characters(1, 1).PhoneticCharacters = "ツキ"
Range("E4").Select
Do Until ActiveCell.Offset(0, -1).Value = ""
With ActiveCell
.Value = .FormulaR1C1 = "=LEFT(RC[-1],5)"
End With
Loop
End Sub

A 回答 (2件)

こんにちは。



マクロの処理は、Selectしたり、同じことを一つずつ処理することが、動作を遅くする原因となります。

ほとんどの場合は、SelectやActivateなどの処理を省略して前後のコードをつなぐことができるので記録したコードを見直しして、不要な箇所を削っていくといいですよ。

記録で得られた以下のコードを
 Columns("E:E").Select
 Selection.Insert Shift:=xlToRight
 Range("E3").Select
 ActiveCell.FormulaR1C1 = "月"
 ActiveCell.Characters(1, 1).PhoneticCharacters = "ツキ"
 Range("E4").Select

私は、
 Columns("E:E").Insert
 Range("E3").Value = "月"
と記述しましたが以下に理由を説明しますね。

例えば、エクセル君からみて、記録された処理は、
E列が選択された
 Columns("E:E").Select
選択した箇所に(右方向に)列が挿入された
 Selection.Insert Shift:=xlToRight
という処理になりますが、これは、「E列に列を挿入する」という処理で、SelectとSelectionをつなげて
 Columns("E:E").Insert Shift:=xlToRight
という処理に修正することができます。更に、Shift:=xlToRightは、ヘルプファイルを確認すると、今回は、省略しても問題ありませんから、
 Columns("E:E").Insert ………(A)
とすることができます。

また、その後の処理では、
E3を選択した
 Range("E3").Select
アクティブセル(E3)に"月"と入力した
 ActiveCell.FormulaR1C1 = "月"
アクティブセル(E3)に"ツキ"とフリガナを付けた
 ActiveCell.Characters(1, 1).PhoneticCharacters = "ツキ"
(Enterキーを押したので)E4を選択した
 Range("E4").Select
となります。
ここでの処理は、「E3に"月"と入力する」という処理ですから、フリガナを付けた処理やE4を選択する処理は不要ですよね。そして、ここでもSelectしなくてもいいので
 Range("E3").FormulaR1C1 = "月"
があれば処理されるわけです。そして、セルに値を入れる場合は、Valueプロパティを使うのが一般的ですので、FormulaR1C1をValueに変えて
 Range("E3").Value = "月" ………(B)
と修正することができます。

ただ、次のDo…Loopの最初の判定にRange("E4").Selectを使いますので、これは残しておきます。
そうすると、testは、test1のように修正できます。

Sub test1()
Columns("E:E").Insert
Range("E3").Value = "月"

Range("E4").Select
Do Until ActiveCell.Offset(0, -1).Value = ""
  ActiveCell.FormulaR1C1 = "=LEFT(RC[-1],5)"
  ActiveCell.Offset(1, 0).Select
Loop
End Sub

Do … Loop の処理ですが、ここでも、Selectしていること、(セルに対して)一つ一つ処理していることが処理を遅くしている原因になっていますので、速く処理するためには、Selectしないこと、一度に処理することが有効な対策になります。

それで、まず、Selectしない処理を考えてみます。
最初のセルは、Range("E4")ですからここを基点に相対位置のセルを調べて数式を入力するコードを組み立てます。

相対位置をずらすため、相対する行位置を記憶する変数(i)を宣言して用意します。
プロシージャの最初に
Dim i As Long
を記述して次のように書き換えてみてください。

Sub test2()
Dim i As Long

Columns("E:E").Insert
Range("E3").Value = "月"

i = 0
Do Until Range("E4").Offset(i, -1).Value = ""
  Range("E4").Offset(i, 0).FormulaR1C1 = "=LEFT(RC[-1],5)"
  i = i + 1
Loop

End Sub

処理を実行してみると、Selectしていない分、処理が速くなっていることが実感できると思います。

もう一案は、「D4:Dのデータの入っている最終行までの右隣」に一度に数式を入力する方法です。
最終行は、D65536を選択してCtrl+↑を記録すれば最終行が選択できますからその行を指定し、その右隣に数式を一度に入れてあげれば、Selectもしませんし、一度に入力されるので処理がさらに速くなります。

Sub test3()

Columns("E:E").Insert
Range("E3").Value = "月"

Range("D4:D" & Range("D" & Rows.Count).End(xlUp).Row).Offset(, 1).FormulaR1C1 = "=LEFT(RC[-1],5)"

End Sub
    • good
    • 0
この回答へのお礼

仕事と理解が遅く御礼を書かせていただくのが遅くなり大変申し訳御座いません。
似たような事例が参考書にないか見ていましたがなく
繰り返し処理はDo~LoopよりEnd(xlUp)で数式をコピーする方が早いのが勉強になりました。
Select処理を省略して早くなるのも勉強になりました。
誠に有難う御座いました。

お礼日時:2009/12/14 23:26

こんにちは。



こういうことでしょうか?

Sub test()

Columns("E:E").Insert
Range("E3").Value = "月"
With Columns("D:D").SpecialCells(xlCellTypeConstants, 1).Offset(, 1)

  .NumberFormat = "ee.mm"
  .Value = .Offset(, -1).Value
'又は
'  .Value = "=TEXT(RC[-1],""ee.mm"")"
'  .NumberFormat = "@"
'  .Value = .Text

End With

End Sub
    • good
    • 0
この回答へのお礼

正直言ってマクロ初心者でいただいた回答を貼り付けてみましたが
うまく動作せず途方にくれて参考書をず~っと読んでおり回答が遅くなり大変申し訳御座いませんでした。
結果下記で動作する事が出来ました。
ただ1行づづLEFT関数が移動して値を返していくのは
動作が遅くこれでいいのか?です。

   記
Sub test()
' test Macro
' マクロ記録日 : 2009/11/23 ユーザー名 : NeverLand
'
Columns("E:E").Select
Selection.Insert Shift:=xlToRight
Range("E3").Select
ActiveCell.FormulaR1C1 = "月"
ActiveCell.Characters(1, 1).PhoneticCharacters = "ツキ"
Range("E4").Select
Do Until ActiveCell.Offset(0, -1).Value = ""
ActiveCell.FormulaR1C1 = "=LEFT(RC[-1],5)"
ActiveCell.Offset(1, 0).Select
Loop
End Sub

お礼日時:2009/11/23 19:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!