マクロでタイムチャート描画 電子回路のタイミング確認に超便利

全ての波形をショートカットを使って、Excelで簡単にタイムチャートが書けます。 FPGAや電子回路設計仕様や各種資料の作成に凄く便利です。 私は、Max10でチップとのI2C通信や、LVDS通信のタイミング検証用に使いました。 罫線赤色、範囲指定一括削除等追加しました。 トラブル対策も何点か追記しました。

例 I2Cタイムチャート

このファイルをダウンロード (Excel_macro_to_draw_timechart.txt)した、中身をマクロに貼り付けるだけ。
間違ったところがあればコメント頂けたら嬉しいです。

設定方法

開発メニュー表示設定

1.Excelのファイル~オプション~リボンのユーザー設定をクリック。

2.右のリボンのユーザー設定で『開発』のチェックボックスにチェックを入れて、『OK』ボタンをクリック。

3.メニュバーに『開発』が表示されるので、『開発』をクリック。

マクロの貼り付け

4.Visual Basicをクリック

5.Visual Basicが開いたら、左のプロジェクト-VBAProjectのツリーの下で、『PERSONAL.XLSB』の下の『Module1』をクリック。

Book1の下のThisWorkbookにコードを貼り付けると、そのExcelファイルだけでマクロが使用可能になります。 PERSONAL.XLSBのModuleに貼り付けると、全てのExcelファイルで使用可能になります。 私は、複数のBookでこのマクロを共通に実行出来るように、PERSONAL.XLSBに貼り付けています。 このPERSONAL.XLSBが表示されない場合は、テキストファイルでコードを貼り付け、ファイル名をPERSONAL.XLSBに変更して、『C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\Excel\XLSTART』フォルダに保存してください。

6.右の(General)の下の白紙部分に、.txtのコードを全てコピペする。

貼り付けたら、Ctrl+sで保存して、Visual Basicを閉じる。

ファイル マクロ実行可能ファイル拡張子

マクロを設定したら、Excelシートをマクロの実行が出来る.xlsm形式で保存してください。

マクロのショートカットキーの割り付け

7.今度は『マクロ』をクリックし、対象のマクロを選択して、ショートカットキーを入力して、OKを押すと、そのショートカットキーで信号を描けます。 信号は下の表を参考にしてください。

設定するショートカットキーは、あまり使わないショートカットキーに割り付けました。 好きなショートカットキーを割り付けてください。 大文字を入力すると、Ctrl+Shiftとなります。

*『オプション』がグレーアウトしてて登録できない時

  1. 必ずセキュリティセンターか、Office365の場合はトラストセンターでマクロの有効化してください。 『その他、マクロの有効化』を参照ください。
  2. 『マクロの有効化』で解決しなかった場合は、まずマクロの実行だけしてみてください。 オプションがグレーアウトしているダイアログボックスで、どれでもマクロを選択して、一番上の『実行』をクリック。 その時、実行されず『コンパイルエラー』と出た時は、以下の部分の先頭に『’』を入れてコメントアウトして、保存してみてください。 これでエラーがなくなり、マクロ実行と登録が可能になる事もあります。
Private Declare Function GetCursorPos Lib "User32" (lpPoint As coordinate) As Long

信号とショートカットの対比表

全てのマクロにショートカットを登録するわけではありません。 いくつかのマクロは、他のマクロで共通に使う関数として存在するので、下の表にないマクロにはショートカットを登録する必要はありません。 ショートカットの文字は、この通りでなくても構いません。 Ctrl+Cなどはコピーとして使うので、Excelで重要なショートカットキーとダブらない様にしています。(本当は、Ctrl+Eは中央合わせのショートカットなのでマクロでは使いたくなかったのですが、最低でも以下の数は欲しいので、仕方なく使っています。) その中で、risingとかeraseとかできるだけ、意味のあるショートカット文字を選択していますが、Jなど意味のないものもあります。 因みに、グリッド変更は最初の一回だけなので、ショートカットキーを登録せず、最初に『実行』だけするというのもありだと思います。

信号マクロ名ショートカット
シートのグリッド一括変更
(サイズ指定可能:初期値5px)
*最初にしてください。
Jの意味はありません。
cell_for_signalsCtrl+Shift+J
クロックclockCtrl+K
クロック1/2clock_1_2Ctrl+Shift+K
斜め立上り(rising)エッジrising_edgeCtrl+R
斜め立下り(trailing)エッジfalling _edgeCtrl+T
垂直立ち上がり(rising)エッジborder_vertical_upCtrl+Shift+R
垂直立ち下がり(trailing)エッジborder_vertical_downCtrl+Shift+T
Low信号low_signalCtrl+L
High信号
(flipflopの出力qにちなんで)
high_signalCtrl+Q
範囲指定Low信号border_horizontal_lowCtrl+Shift+L
データ保持(double lines)data_holdCtrl+W
データ新規(yield)data_inCtrl+Y
データ終了(end)data_endCtrl+E
範囲指定罫線消去(erase)
(破線は罫線でないので消えません)
border_all_eraseCtrl+Shift+E
縦破線cursor_dashCtrl+M
横寸法破線線+寸法文字cursor_dash_arrowCtrl+Shift+M

タイムチャートの消し方

信号線は、罫線として描画されます。 信号線を消す場合は、Excelの普通のやり方でそのセルの罫線を消してください。 斜め立上り・斜め立下りは、上下に1セルづつ連結しています。

罫線を範囲指定して一括消去できるようにしました。border_all_erase() 便利ですよ。 上の表の、範囲指定罫線消去(Ctrl+Shift+E)です。 縦破線と横寸法破線は罫線でないので消えません。 

タイムチャートの赤線(NEW)

A1セルに大文字『R』を記入すると、罫線を赤色で描画します。

Function tc_color()でvbRedと指定しています。 tcはTime Chart。

その他

マクロの有効化

Office365になってますますセキュリティーが厳しくなり、デフォルトではマクロ登録や実行が出来なくなっています。 その時は、以下の2つの方法でマクロ設定に入れます。

  1. メニューで『開発』を選び『マクロのセキュリティ』を選択する
  2. メニューの『ファイル』~画面右下の『オプション』~『トラスト センター』~『トラスト センターの設定』を選択する。

電子署名がないので以下の様にセンタ選択しています。

その後、エクセルを再起動で『オプション』が選択できるようになりました。

自分で電子署名発行の仕方

ここが非常に分かりやすかったです。

【初心者向け】VBAマクロに電子証明書の設定を行う手順!
Excel やOutlookなどのOffice製品のVBAマクロに、電子証明書を発行してデジタル署名を行う方法について紹介しました。

破線描画位置算出

ここで使っている、縦破線や横寸法破線線を描画する為の、Excelのシート上での座標計算方法はこの下のページを見てみてください。 GetCursorPosだけでは正しい座標になりません。(Excelのバージョンが上がって、計算方法が変わったみたいで、位置が正確に計算されなくなったようです。2022.12)

縦破線、横破線が表示できない1

Objet Libraryを選択する。

Alt+F11を押すか、メニューの『開発』~『Visual Basic』をクリックしてVBAエディタを開く。

メニューの『ツール』~『参照設定』をクリック。

Microsoft Office xx Object Library』にチェックを入れて『OK』を押す。 一応、エディタで『Ctrl+S』(上書き保存)しておく。

縦破線、横破線が表示できない2

また、以前はカーソルの位置やZOOM率に併せてちゃんと破線が描けていたのですが、位置が左にずれて描かれてしまいます。
縦破線や横矢印破線を描く時は、マウスポインタをエクセル表の一番左の時に描くと表のどこかに表示されます。 マウスポインタが左すぎると、画面の一番左に描かれてしまいます。 今は修正できませんが、いずれ修正したいと思います。

コメント

  1. #If Win64 Then
    Private Declare PtrSafe Function GetCursorPos Lib “User32” (lpPoint As coordinate) As Long
    #Else
    Private Declare Function GetCursorPos Lib “User32” (lpPoint As coordinate) As Long
    #End If

    この部分でユーザーの定義が未定とのエラーが出ますが、どうしたらよいですか。

    • コメントありがとうございます。
      返信が遅くなって申し訳ありません。
      Excelも頻繁に変わっているので私もエラーになり、以下の様にしたらエラーは出なくなりました。
      64bitなので、32bitの方はエディター上でエラーとなりコメントアウトしました。
      これでもやはりエラーは出ますでしょうか?

      #If Win64 Then
      Private Declare PtrSafe Function GetCursorPos Lib “user32” (lpPoint As Coordinate) As Long
      Private Declare PtrSafe Function ScreenToClient Lib “user32” (ByVal hWnd As Long, lpPoint As Coordinate) As Long
      #Else
      ‘Private Declare Function GetCursorPos Lib “user32” (lpPoint As Coordinate) As Long
      ‘Private Declare Function ScreenToClient Lib “user32” (ByVal hWnd As Long, lpPoint As Coordinate) As Long
      #End If

      • Private Declare PtrSafe Function GetCursorPos Lib “user32” (lpPoint As Coordinate) As Long

        この文でコンパイルエラーのユーザ定義型が定義されていませんと出るんですが、
        どうしたらいいのかので教えて下さい。
        Excelは64bitでwindows11です。

        • コメントありがとうございます。
          私のシステムはWindow10 64bit、Excel 32bit なのでas Longでよかったのですが、Excelも64bitだと LongLong型になるようなので、32bitでも64ビットでも動作する、as LongPtrか64bit専用のas LongLongに置き換えると、そのコンパイルエラーを解消出来ると思います。 64bitのExcelを持っていないので確認出来ませんが試していただけませんか? 次の行のLongもLongPtrかLongLongにする必要があると思います。

          Private Declare PtrSafe Function GetCursorPos Lib “user32” (lpPoint As Coordinate) As LongPtr

          https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/longptr-data-type

  2. Function getExcelCusorPos() As x_y
    Dim c As Coordinate

    この部分で、ユーザー定義型は定義されてません。
    と表示されてしまいますが、解決方法はありますでしょうか?
    縦破線を実行しようとすると現れます

    • コメントありがとうございます。
      Excel_macro_to_draw_timechart.txtを再度PERSONAL.XLSBに貼り付けなおしてみましたが私の環境ではboarder_dashは正常に描画されます。
      (*カーソル位置が正確取得できなくなっていて、縦破線描画は左側にかなりずれて表示されてしまいますが)
      私の環境は、以下の通りです。
      Windows10 Pro 22H2 64bit OSビルド19045.3570
      ExcelはMicrosoft® Excel® for Microsoft 365 MSO (バージョン 2307) 64 ビット

      『ユーザー定義型は定義されていません』と表示されるのは,もしかしてObjectライブラリが選択されていないのかもしれません。
      https://ichiri.biz/tech/fpga-timing-char/#no_dash1 <---さっき追記しました。 どうしても解決できない場合は、getExcelCusorPosを使わずに固定位置に縦破線を描画するようにするのも手だと思います。 ActiveSheet.Shapes.AddConnector(msoConnectorStraight, _ 200, _ 200, _ 200, _ 300).Select ごめんなさい。 後は今のところ思いつきません。