Excel (VBA)

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

 
(Windows 10 Pro : Excel 2016)
1分毎の連続データを自動で入力する方法
投稿日時: 20/03/08 16:00:22
投稿者: Tohya

はじめまして
 
Tohyaと言います。
 
今回やりたいことをまずExcelのマクロ記録を使用して記録し、生成されたコードをほとんどそのまま
使用してEXCELマクロを使用したツールを作成しようとしたのですが、該当コードを動作させた際に、
結果が違う状態となってしまいました。
どのようにすれば、マクロ記録時に行った操作による結果と同じ結果を得られるか、教えて頂けると
幸いです。
 
【やりたいこと】
<前提条件>
シート1にボタンを1つ用意してあること
<動作詳細>
ボタンを押下した際に、以下のことを行います。
1.新しいシートを1つ生成します。
2.A2セルに時刻として”0:00”(0時00分)を入力します。
3.A3セルに時刻として”0:01”(0時01分)を入力します。
4.A2とA3セルを選択します。
5.A3セル右下にある四角いマークをマウスでA1441セル目までドラッグ&ドロップします。
 ※”23:59”(23時59分)まで作成します。
 
【結果】
<手動の場合(マクロ記録時)>
※上記前提条件を抜きにして、動作詳細の内容を手作業で行いました
A2セルからA1441セルまで1分毎に加算されたデータが各セルに入力されます。
<私が作成したマクロの場合>
A2セルが”01:00”にA3セルが”02:00”に変化してしまい、その後”23:00”まで1時間刻みのデータが
A1441セルまで続く状態となってしまいました。
 
【マクロ記録と私のコードでの違い】
<マクロ記録の場合>
時刻情報の”0:00”〜”23:59”のデータを作成する時、データ作成シートがアクティブな状態となって
います。
<私の書いたコードの場合>
時刻情報を編集する部分のコードを、ワークシート名から指定して記述しています。
※これには以下のような理由があります。
 理由:新しく作成したシートにこの時刻情報以外の情報の入力などを行う必要があるのですが、それらの
    データを編集している状態を、ツールが出来上がった際に使用者に見せたくないため。
    
【それぞれのコード】
<マクロ記録で生成されたコード>
Sub Macro1()
'
' Macro1 Macro
    Sheets.Add After:=ActiveSheet
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "0:00"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "0:01"
    ActiveCell.Offset(-1, 0).Range("A1:A2").Select
    Selection.AutoFill Destination:=ActiveCell.Range("A1:A20"), Type:= _
        xlFillDefault
    ActiveCell.Range("A1:A20").Select
Ens Sub
 
<私が記述したコード>
Sub ボタン1_Click()
 
    Worksheets.Add After:=Worksheets(Worksheets.Count)
    ActiveSheet.Name = "Test"
 
    Worksheets("Test").Cells(2, 1).Value = "0:00"
    Worksheets("Test").Cells(3, 1).Value = "0:01"
    Worksheets("Test").Range("A2").Offset(1, 0).Range("A1").Select
    Worksheets("Test").Range("A2").Offset(-1, 0).Range("A2:A3").Select
    Worksheets("Test").Range("A2").AutoFill Destination:=Worksheets("Test").Range("A2:A1441"), Type:= _
        xlFillDefault
End Sub
 
【開発環境】
Windows10 Pro
Microsoft Office Home & Business 2016
Memory:8GB
 
宜しくお願いします。

回答
投稿日時: 20/03/08 17:07:35
投稿者: WinArrow
投稿者のウェブサイトに移動

マクロの記録の問題点の一つに
間違えた操作が、そのまま、記録されてしまう。
 
掲示のコードには、理解に苦しむところがあります。
 
要は、↓のコードになればよいということですね?
 
    Range("A2").Value = "0:0"
    Range("A3").Value = "0:01"
    Range("A2:A3").AutoFill Destination:=Range("A2:A1441"), Type:=xlFillDefault
 
マクロの記録で作成したコードから、まず、「.Select」を排除しましょう。
そうすると
> ActiveCell.Offset(1, 0).Range("A1").Select
> ActiveCell.FormulaR1C1 = "0:00"
の2行は
Range("A1").Value = "0:0"
という1行になります。
※「Formula」は、数式という意味です。
今回の場合、FormulaR1C1プロパテイでも構いませんが、Value の方がわかりやすい。

回答
投稿日時: 20/03/09 11:18:49
投稿者: WinArrow
投稿者のウェブサイトに移動

 
追加のコメント
  
 > Sheets.Add After:=ActiveSheet
 > ActiveCell.Offset(1, 0).Range("A1").Select
   
 Activecllについて
  
手操作をそのまま、VBAコードにすると
↑のようなコードになってしまいます。
 目視レベルなら、ActiveCellでも構いませんが、
コードが多行になると、ActiveCellのオンパレードになって、可動性が非常に悪くなります。
><私が記述したコード>
のように書き換えることは、コードを理解するうえで、大事なことですが、
 読みやすくするということに着眼すると
 セルを直接指定する場合、RangeとCellが混在すると、本当に読みやすいか?
ということです。
  
 >Worksheets("Test").Range("A2").Offset(1, 0).Range("A1").Select
これを一目見ただけで、どこのセルを指しているか?
わかりますか?
 結局は、Range("A2").Ofset(1,0)ですよね?
 回りくどい書き方はなるべく避ける・・・にしないと読むだけで疲れちゃいます。
 

投稿日時: 20/03/09 15:13:20
投稿者: Tohya

WinArrow様
 
お返事が大変遅くなってしまい、申し訳ありません。
 
ありがとうございました。
ご提示頂いたコードを使用しましたら、やりたかったことが実現できました。
 
また、コードの記載についてもアドバイス頂き、とても勉強になりました。
頂いたアドバイスを元に、今後の質問時には記述するコードについて、
皆様にご理解しやすい記述をしていくようにします。
 
この度は、本当にありがとうございました。