[GitHub Copilot] Excel マクロアプリを作成する

GitHub Copilot を使って、簡単な Excel マクロアプリを作成してみました。こちらで紹介します。

全作業を10分ぐらいで完了しました。

 

 

 

1.作成した Excel マクロアプリ

1秒周期で現在時刻を表示する、という簡単な内容です。

 

作成した Excel マクロアプリ: こちらに添付します 

TimeDisplayApp.xlsm

 

こちら、実際に動作させてみた様子です。

 

動画: "Excelマクロ_現在時刻を1秒更新.mp4"

 

 

2. デジタル時計を作る

2-1. GitHub Copilot へのお願い方法

下記のように依頼してみました。

excel マクロアプリを作成したい。1秒ごとに現在時刻を更新して表示して。

図: 実際の画面(vscode にて)

vscode 画面

 

 

2-2. GitHub Copilot の出力内容

GitHub Copilot から実際に出力された例を以下に紹介します。

全部 GitHub Copilot による生成です。私は1ステップもコーディングしていません。

 

動画: "Excelマクロ_現在時刻を1秒更新.mp4"

 

2-2-1. TimeDisplayMacro.bas

Option Explicit

' 次回実行時刻を保存する変数
Dim NextRunTime As Date
Dim IsRunning As Boolean

' 1秒ごとに現在時刻を更新
Sub StartTimeDisplay()
    ' すでにタイマーが動いている場合は停止
    If IsRunning Then
        StopTimeDisplay
    End If
    
    ' セルA1に時刻を表示
    Range("A1").Value = "現在時刻:"
    Range("A1").Font.Bold = True
    Range("A1").Font.Size = 14
    
    Range("B1").Font.Size = 14
    Range("B1").NumberFormat = "yyyy/mm/dd hh:mm:ss"
    
    ' 列幅を自動調整
    Columns("A:B").AutoFit
    
    ' 実行フラグを立てる
    IsRunning = True
    
    ' 初回の時刻表示
    UpdateTime
    
    MsgBox "時刻表示を開始しました。停止するには StopTimeDisplay を実行してください。", vbInformation
End Sub

' 時刻を更新する処理
Sub UpdateTime()
    On Error Resume Next
    
    ' 実行中でなければ終了
    If Not IsRunning Then Exit Sub
    
    ' セルB1に現在時刻を表示
    ThisWorkbook.Sheets(1).Range("B1").Value = Now
    
    ' 次の更新をスケジュール(1秒後)
    NextRunTime = Now + TimeValue("00:00:01")
    Application.OnTime NextRunTime, "UpdateTime"
End Sub

' 時刻表示を停止
Sub StopTimeDisplay()
    On Error Resume Next
    
    ' 実行フラグを下げる
    IsRunning = False
    
    ' スケジュールされたタイマーをキャンセル
    If NextRunTime > 0 Then
        Application.OnTime EarliestTime:=NextRunTime, _
                            Procedure:="UpdateTime", _
                            Schedule:=False
    End If
    
    MsgBox "時刻表示を停止しました。", vbInformation
End Sub

 

 

2-2-2. README.md

# Excel 時刻表示マクロアプリ

## 概要

1秒ごとに現在時刻を更新して表示するExcelマクロアプリケーションです。

## セットアップ手順

1. **新しいExcelブックを作成**
   - Excelを開いて新規ブックを作成します

2. **VBAエディタを開く**
   - `Alt + F11` を押してVBAエディタを開きます

3. **標準モジュールを追加**
   - メニューから「挿入」→「標準モジュール」を選択

4. **コードを貼り付け**
   - `TimeDisplayMacro.bas` の内容をモジュールにコピー&ペーストします

5. **マクロ有効ブックとして保存**
   - ファイル名: `TimeDisplayApp.xlsm`
   - ファイル形式: Excelマクロ有効ブック (*.xlsm)

## 使用方法

### 時刻表示を開始

1. `Alt + F8` を押してマクロ一覧を表示
2. `StartTimeDisplay` を選択して「実行」をクリック
3. セルA1に「現在時刻:」、セルB1に現在時刻が表示され、1秒ごとに更新されます

### 時刻表示を停止

1. `Alt + F8` を押してマクロ一覧を表示
2. `StopTimeDisplay` を選択して「実行」をクリック

## 機能説明

- **StartTimeDisplay**: 時刻表示を開始します
  - セルA1にラベル「現在時刻:」を表示
  - セルB1に現在時刻を「yyyy/mm/dd hh:mm:ss」形式で表示
  - 1秒ごとに自動更新

- **UpdateTime**: 時刻を更新する内部処理
  - 1秒ごとに自動的に呼び出されます

- **StopTimeDisplay**: 時刻表示を停止します

## 注意事項

- マクロを実行するには、Excelのセキュリティ設定でマクロを有効にする必要があります
- ファイルを閉じる前に `StopTimeDisplay` を実行することを推奨します
- ブックを保存する際は、マクロ有効ブック (.xlsm) 形式で保存してください

## トラブルシューティング

**マクロが実行できない場合:**

- 「ファイル」→「オプション」→「セキュリティセンター」→「セキュリティセンターの設定」
- 「マクロの設定」で「すべてのマクロを有効にする」または「警告を表示してすべてのマクロを無効にする」を選択

**時刻が更新されない場合:**

- 一度 `StopTimeDisplay` を実行してから、再度 `StartTimeDisplay` を実行してください

 

NOTE

期待通りに動作するのですが、時計の動作を開始してしばらくすると画面更新が5秒周期ぐらいになってしまいます。マウスを動かす、などすると元の1秒周期に戻ります。

同じ問題と思われる内容が下記記事で紹介されていました。
VBAのApplication.OnTimeが遅延する問題とその対策 #Excel - Qiita

修正方法はいくつかありそうです。

(案1)擬似的なマウス移動でExcelに「操作あり」と認識させる(上記記事参照)

(案2)Application.OnTime をやめて SetTimer api で実現する(次章参照)

 

 

3. アナログ時計を作る

3-1. GitHub Copilot へのお願い方法

前章の内容に続けて、下記のように依頼してみました。

アナログ時計を追加して

一度ソースコードを生成後に上記問題(しばらくすると画面更新が5秒周期ぐらいになってしまう)を確認したので、下記のような感じの追加相談を何度か反復しました。

プログラムを実行してしばらくすると画面更新が5秒ぐらいの頻度になってしまう。1秒周期の画面更新を維持するように修正して。

GitHub Copilot が生成したコードを以下に記載します。

結果として、上記(案2)により問題を解決したと私は理解します。

 

 

3-2. GitHub Copilot の出力内容

GitHub Copilot から実際に出力された例を以下に紹介します。

全部 GitHub Copilot による生成です。私は1ステップもコーディングしていません。

 

動画: "Excelマクロ_現在時刻を1秒更新.mp4"

 

 

3-2-1. TimeDisplayMacro.bas

VBA コードの出力結果です。

Option Explicit

' 次回実行時刻を保存する変数
Dim NextRunTime As Date
Dim IsRunning As Boolean

' 時計の針のオブジェクト
Dim HourHand As Shape
Dim MinuteHand As Shape
Dim SecondHand As Shape
Dim ClockFace As Shape

' Windows APIタイマー関数
#If VBA7 Then
    Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
    Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
    Private TimerID As LongPtr
#Else
    Private Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
    Private TimerID As Long
#End If

' タイマーコールバック関数
#If VBA7 Then
    Private Sub TimerProc(ByVal hWnd As LongPtr, ByVal uMsg As Long, ByVal idEvent As LongPtr, ByVal dwTime As Long)
        UpdateTime
    End Sub
#Else
    Private Sub TimerProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
        UpdateTime
    End Sub
#End If

' 1秒ごとに現在時刻を更新
Sub StartTimeDisplay()
    ' すでにタイマーが動いている場合は停止
    If IsRunning Then
        StopTimeDisplay
    End If
    
    ' セルA1に時刻を表示
    Range("A1").Value = "現在時刻:"
    Range("A1").Font.Bold = True
    Range("A1").Font.Size = 14
    
    Range("B1").Font.Size = 14
    Range("B1").NumberFormat = "yyyy/mm/dd hh:mm:ss"
    
    ' 列幅を自動調整
    Columns("A:B").AutoFit
    
    ' アナログ時計を初期化
    InitializeAnalogClock
    
    ' 実行フラグを立てる
    IsRunning = True
    
    ' 初回の時刻表示
    UpdateTime
    
    ' Windows APIタイマーを開始(1000ミリ秒=1秒)
    TimerID = SetTimer(0, 0, 1000, AddressOf TimerProc)
    
    MsgBox "時刻表示を開始しました。停止するには StopTimeDisplay を実行してください。", vbInformation
End Sub

' 時刻を更新する処理
Sub UpdateTime()
    On Error Resume Next
    
    ' 実行中でなければ終了
    If Not IsRunning Then Exit Sub
    
    ' セルB1に現在時刻を表示
    ThisWorkbook.Sheets(1).Range("B1").Value = Now
    
    ' アナログ時計を更新
    UpdateAnalogClock
End Sub

' 時刻表示を停止
Sub StopTimeDisplay()
    On Error Resume Next
    
    ' 実行フラグを下げる
    IsRunning = False
    
    ' Windows APIタイマーを停止
    If TimerID <> 0 Then
        KillTimer 0, TimerID
        TimerID = 0
    End If
    
    ' アナログ時計を削除
    DeleteAnalogClock
    
    MsgBox "時刻表示を停止しました。", vbInformation
End Sub

' アナログ時計を初期化
Sub InitializeAnalogClock()
    Dim ws As Worksheet
    Dim centerX As Double, centerY As Double
    Dim radius As Double
    Dim i As Integer
    Dim angle As Double
    Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double
    
    Set ws = ThisWorkbook.Sheets(1)
    
    ' 既存の時計を削除
    DeleteAnalogClock
    
    ' 時計の中心位置(セルD5の位置)
    centerX = ws.Range("D5").Left + 100
    centerY = ws.Range("D5").Top + 100
    radius = 80
    
    ' 時計の文字盤(円)を作成
    Set ClockFace = ws.Shapes.AddShape(msoShapeOval, _
                                        centerX - radius, centerY - radius, _
                                        radius * 2, radius * 2)
    With ClockFace
        .Fill.ForeColor.RGB = RGB(255, 255, 255)
        .Line.Weight = 2
        .Line.ForeColor.RGB = RGB(0, 0, 0)
        .Name = "ClockFace"
    End With
    
    ' 12時間の目盛りを描画
    For i = 0 To 11
        angle = i * 30 * WorksheetFunction.Pi / 180 - WorksheetFunction.Pi / 2
        x1 = centerX + (radius - 10) * Cos(angle)
        y1 = centerY + (radius - 10) * Sin(angle)
        x2 = centerX + (radius - 5) * Cos(angle)
        y2 = centerY + (radius - 5) * Sin(angle)
        
        Dim mark As Shape
        Set mark = ws.Shapes.AddLine(x1, y1, x2, y2)
        mark.Line.Weight = 2
        mark.Line.ForeColor.RGB = RGB(0, 0, 0)
        mark.Name = "ClockMark" & i
    Next i
    
    ' 中心点を描画
    Dim centerDot As Shape
    Set centerDot = ws.Shapes.AddShape(msoShapeOval, _
                                        centerX - 3, centerY - 3, 6, 6)
    With centerDot
        .Fill.ForeColor.RGB = RGB(0, 0, 0)
        .Line.Visible = msoFalse
        .Name = "ClockCenter"
    End With
    
    ' 時針を作成(短く太い)
    Set HourHand = ws.Shapes.AddLine(centerX, centerY, centerX, centerY - radius * 0.5)
    With HourHand
        .Line.Weight = 4
        .Line.ForeColor.RGB = RGB(0, 0, 0)
        .Name = "HourHand"
    End With
    
    ' 分針を作成(長く中太)
    Set MinuteHand = ws.Shapes.AddLine(centerX, centerY, centerX, centerY - radius * 0.7)
    With MinuteHand
        .Line.Weight = 2.5
        .Line.ForeColor.RGB = RGB(0, 0, 0)
        .Name = "MinuteHand"
    End With
    
    ' 秒針を作成(長く細い、赤色)
    Set SecondHand = ws.Shapes.AddLine(centerX, centerY, centerX, centerY - radius * 0.8)
    With SecondHand
        .Line.Weight = 1
        .Line.ForeColor.RGB = RGB(255, 0, 0)
        .Name = "SecondHand"
    End With
End Sub

' アナログ時計を更新
Sub UpdateAnalogClock()
    Dim ws As Worksheet
    Dim centerX As Double, centerY As Double
    Dim radius As Double
    Dim currentTime As Date
    Dim hours As Integer, minutes As Integer, seconds As Integer
    Dim hourAngle As Double, minuteAngle As Double, secondAngle As Double
    
    Set ws = ThisWorkbook.Sheets(1)
    
    ' 時計の針が存在しない場合は終了
    On Error Resume Next
    If HourHand Is Nothing Or MinuteHand Is Nothing Or SecondHand Is Nothing Then
        Exit Sub
    End If
    On Error GoTo 0
    
    ' 時計の中心位置
    centerX = ws.Range("D5").Left + 100
    centerY = ws.Range("D5").Top + 100
    radius = 80
    
    ' 現在時刻を取得
    currentTime = Now
    hours = Hour(currentTime)
    minutes = Minute(currentTime)
    seconds = Second(currentTime)
    
    ' 12時間表示に変換
    If hours >= 12 Then hours = hours - 12
    
    ' 角度を計算(12時を0度として時計回りに回転)
    ' 注: Excelの角度は右向きが0度なので、-90度(-Pi/2)オフセット
    hourAngle = ((hours + minutes / 60) * 30 - 90) * WorksheetFunction.Pi / 180
    minuteAngle = (minutes * 6 - 90) * WorksheetFunction.Pi / 180
    secondAngle = (seconds * 6 - 90) * WorksheetFunction.Pi / 180
    
    ' 時針を削除して再作成
    On Error Resume Next
    HourHand.Delete
    On Error GoTo 0
    
    Dim hourLength As Double
    hourLength = radius * 0.5
    Dim hourEndX As Double, hourEndY As Double
    hourEndX = centerX + hourLength * Cos(hourAngle)
    hourEndY = centerY + hourLength * Sin(hourAngle)
    
    Set HourHand = ws.Shapes.AddLine(centerX, centerY, hourEndX, hourEndY)
    With HourHand
        .Line.Weight = 4
        .Line.ForeColor.RGB = RGB(0, 0, 0)
        .Name = "HourHand"
    End With
    
    ' 分針を削除して再作成
    On Error Resume Next
    MinuteHand.Delete
    On Error GoTo 0
    
    Dim minuteLength As Double
    minuteLength = radius * 0.7
    Dim minuteEndX As Double, minuteEndY As Double
    minuteEndX = centerX + minuteLength * Cos(minuteAngle)
    minuteEndY = centerY + minuteLength * Sin(minuteAngle)
    
    Set MinuteHand = ws.Shapes.AddLine(centerX, centerY, minuteEndX, minuteEndY)
    With MinuteHand
        .Line.Weight = 2.5
        .Line.ForeColor.RGB = RGB(0, 0, 0)
        .Name = "MinuteHand"
    End With
    
    ' 秒針を削除して再作成
    On Error Resume Next
    SecondHand.Delete
    On Error GoTo 0
    
    Dim secondLength As Double
    secondLength = radius * 0.8
    Dim secondEndX As Double, secondEndY As Double
    secondEndX = centerX + secondLength * Cos(secondAngle)
    secondEndY = centerY + secondLength * Sin(secondAngle)
    
    Set SecondHand = ws.Shapes.AddLine(centerX, centerY, secondEndX, secondEndY)
    With SecondHand
        .Line.Weight = 1
        .Line.ForeColor.RGB = RGB(255, 0, 0)
        .Name = "SecondHand"
    End With
    
    ' 画面描画を強制的に更新
    ws.Calculate
End Sub

' アナログ時計を削除
Sub DeleteAnalogClock()
    Dim ws As Worksheet
    Dim shp As Shape
    
    Set ws = ThisWorkbook.Sheets(1)
    
    On Error Resume Next
    ' 全ての時計関連の図形を削除
    For Each shp In ws.Shapes
        If shp.Name Like "Clock*" Or shp.Name Like "*Hand" Then
            shp.Delete
        End If
    Next shp
    
    ' オブジェクト変数をクリア
    Set HourHand = Nothing
    Set MinuteHand = Nothing
    Set SecondHand = Nothing
    Set CckFace = Nothing
    On Error GoTo 0
End Sub

 

 

4. 後書き

GitHub Copilot を使って Excel マクロアプリを作成する、ということを試してみました。

残念ながら GitHub CopilotExcel ファイルおよびマクロを直接作成まで行ってはくれませんでしたが、若干の手操作だけで短時間でアプリケーション作成することができました。

ちょっとした Excel ツールを作成するという場面は、多くの方が時々?頻繁に行っているのではと考えます。GitHub Copilot を活用することでとても効率よく短時間で作成することができましたので、よかったら参考にしてみてください。

 

 

ライセンス

本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。

The MIT License (MIT)

  Copyright 2025 Kinoshita Hidetoshi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

 

参考

 


 

変更履歴

2025-11-13 - 新規作成

 

Programming Items トップページ

プライバシーポリシー