データの入っている行だけを繰り返し処理したく以下マクロ記述しましたが上手くいきません。宜しく御願いします。
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
No.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
仕事と理解が遅く御礼を書かせていただくのが遅くなり大変申し訳御座いません。
似たような事例が参考書にないか見ていましたがなく
繰り返し処理はDo~LoopよりEnd(xlUp)で数式をコピーする方が早いのが勉強になりました。
Select処理を省略して早くなるのも勉強になりました。
誠に有難う御座いました。
No.1
- 回答日時:
こんにちは。
こういうことでしょうか?
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
正直言ってマクロ初心者でいただいた回答を貼り付けてみましたが
うまく動作せず途方にくれて参考書をず~っと読んでおり回答が遅くなり大変申し訳御座いませんでした。
結果下記で動作する事が出来ました。
ただ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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) マクロで最終行を取得してコピーしたい 3 2022/04/06 19:07
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Excel(エクセル) エクセルマクロで教えてください 2 2022/05/04 09:07
- Excel(エクセル) Excel VBA 空白行があるセル範囲に色を付ける 3 2022/06/13 15:58
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
iD
-
エクセルで、日付を入力すると...
-
メルカリのメルカードで買い物...
-
DoEventsがやはり分からない
-
switch の範囲指定
-
【Excel】特定の文字を含むセル...
-
VBAでループ内で使う変数名を可...
-
Do~Loopした回数をカウントしたい
-
EXCEL VBA マクロ 実行する度に...
-
UMLでの例外処理
-
リョウ・・・量?料?
-
VB.NET Excelを読み込んでDataT...
-
if文の処理部分の括弧を省略し...
-
エクセルVBA マクロ処理中のポ...
-
インタラクティブの反対語は?
-
VBの質問#if 0 then ってどう...
-
C言語 b += a ? 1 : 0; の意味
-
NULLを含むフィールド値の条件分岐
-
VB6,Ifから抜けるには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
メルカリのメルカードで買い物...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
EXCEL VBA マクロ 実行する度に...
-
DoEventsがやはり分からない
-
UMLでの例外処理
-
月度は何て読みますか?
-
switch の範囲指定
-
VBの質問#if 0 then ってどう...
-
セルの値が0はクリアするマクロ
-
VB.NET Excelを読み込んでDataT...
-
Do~Loopした回数をカウントしたい
-
Loadイベント中にほかのイベン...
-
Select Case文でこのようなこと...
-
findは動くがfindnextがマクロ...
-
緊急です。 知り合いから50kgの...
-
リョウ・・・量?料?
-
理不尽、行き場のないイライラ...
おすすめ情報