マクロの記録・停止後に、F4キーを30回ぐらい押すと落ちる

  1. 動作環境は以下になります。
    Windows10 pro 64bit 1903
    Mery 64bit ver2.8.6

     |  fine  |  返信
  2. ご報告ありがとうございます。

    マクロの記録・停止後に F4 キーということなので、マクロの実行中に発生するエラーだと思います。

    マクロのエラーはそのマクロの内容が分からないとサポートすることが難しいため、お手数をおかけしますが問題の発生するマクロの内容を教えていただけると調査の助けになります。

    記録した操作が簡単なものであれば、行った操作を文章で書いてくださっても大丈夫です。

    複雑な操作を記録されている場合は [マクロ] メニューの [名前を付けて保存] からマクロを保存して、そのファイルを Mery で開けば記録した操作の内容が見えますので、その内容を教えていただけますと助かります。

    ただ、記録したマクロの内容に個人情報やインターネットに公開してはまずい情報などが含まれているかもしれない場合は別途対応させていただきますので、その旨だけを教えてください。

    ご不便をおかけして申し訳ございませんがよろしくお願いいたします。

     |  Kuro  |  返信
  3. 本日実施すると、F4を普通にポンポン押している分には問題なく動作しました。ただし、F4押しっぱなしにすると落ちます。

    ■マクロ
    document.selection.CharRight(true, 1);
    document.selection.CharRight(true, 1);
    document.selection.CharRight(true, 1);
    document.selection.CharRight(true, 1);
    document.selection.Copy();
    document.selection.CharRight(false, 1);
    document.selection.Paste();
    document.selection.NewLine(1);

    ■ファイルの内容
    2474
    2475
    2476
    2477
    2478
    2479
    247A
    247B
    247C
    247D
    247E
    247F
    2480
    2481
    2482
    2483
    2484
    2485
    2486
    2487
    2488
    2489
    248A
    248B
    248C
    248D
    248E
    248F
    2490
    249C
    249D
    249E
    249F
    24A0
    24A1
    24A2
    24A3
    24A4
    24A5
    24A6
    24A7
    24A8
    24A9
    24AA
    24AB
    24AC
    24AD
    24AE
    24AF
    24B0
    24B1
    24B2
    24B3
    24B4
    24B5
    2504
    2506
    2521
    2522
    2529
    252A
    2531
    2532
    2539
    253A
    2543
    2544
    2545
    2546
    2574
    2575
    2576
    2577
    2578
    2579
    257A
    257B
    25A2
    33CC

    以上です。

     |  fine  |  返信
  4. ご返信ありがとうございます。

    頂いた条件で現象を再現することができました。

    どうやらマクロの動作速度が速すぎてクリップボードへのコピー (document.selection.Copy) と ペースト (document.selection.Paste) の処理に Windows のクリップボードがついてこれなくなってエラーが発生し、その結果、Mery が強制終了してしまっているようです。

    クリップボード関連の処理は他のアプリとの兼ね合いもありますので完全にエラーをなくすことはできないのですが、次のバージョンではクリップボードへのアクセスの安定性の向上と、エラーが発生した場合にも Mery が強制終了することのないよう改善したいと思います。

    あまりご参考にならないかもしれませんが、頂いたマクロですとクリップボードへのアクセス時 (document.selection.Paste) に sleep メソッドで少し待機するようにすればエラーをある程度回避できると思います。

    document.selection.CharRight(true, 1);
    document.selection.CharRight(true, 1);
    document.selection.CharRight(true, 1);
    document.selection.CharRight(true, 1);
    document.selection.Copy();
    document.selection.CharRight(false, 1);
    sleep(200); // 少し待つ
    document.selection.Paste();
    document.selection.NewLine(1);
    

    ご不便をおかけして申し訳ございませんが、次のバージョンまで今しばらくお待ちくださいませ。

     |  Kuro  |  返信
  5. 横から失礼します。

    そもそもが「マクロの記録・停止後」の連続実行についてなので、的外れな内容になってしまいますが…。
    おそらく個々の行の文字列データをクリップボードに保存しておく必要はないとおもいますので、以下のようなマクロにすると不安定になることがなくなりますね。

    // ■ 1行だけ「行の複製」を実行
    // ※ マクロの実行1回につき、キャレット位置の「1行」を複製する
    var s = document.selection;
    s.DuplicateLine();
    
    // カーソルを次の行頭に移動させるなら
    var y = s.GetActivePointY( mePosLogical );
    s.SetActivePoint( mePosLogical, 1, y + 2 );
    

    上のマクロならショートカットキーの押しっぱなしで連続実行しても大丈夫だとおもいますが、最後の行がええんと複製・増殖されつづけてしまいます。:(

    また、以下のマクロなら連続実行せずとも、実行 1 回で済みます(アンドゥ操作 1 回で元に戻せます)。

    // ■ ファイル内のすべての各行ごとに二重に複製する(※ 一括操作)
    // ※ 要: Mery 2.7.0 以上  … スクロールバーがヌルヌル動きます
    var d = document,  s = d.selection;
    s.StartOfDocument();
    BeginUndoGroup();
    for ( var i = 1, yy = d.GetLines( 0 ), y; i <= yy; i ++ ) {
      y = s.GetActivePointY( mePosLogical );
      s.DuplicateLine();
      s.SetActivePoint( mePosLogical, 1, y + 2 );
    }
    EndUndoGroup();
    
    // ■ ファイル内のすべての各行ごとに二重に複製する(※ 一括操作)
    var d = document,  s = d.selection;
    var a = d.Text.split( "\n" );
    for ( var i = 0, len = a.length; i < len; i ++ ) {
      a[i] = a[i] + "\n" + a[i];
    }
    d.Text = a.join( "\n" ).replace( /\n+$/, "\n" );
    s.EndOfDocument();
    

    以下のマクロは、事前に二重化したい行を範囲選択しておく前提。

    // ■ 選択範囲を含むすべての行を二重に複製する(※ 一括操作, 空行は複製しない)
    var s = document.selection;
    var ty = s.GetTopPointY( mePosLogical );
    var bx = s.GetBottomPointX( mePosLogical );
    var by = s.GetBottomPointY( mePosLogical );
    
    if ( ty != by && bx == 1 ) { by --; }
    s.SetActivePoint( mePosLogical, 1, ty );
    s.SetActivePoint( mePosLogical, 1, by, true );
    s.EndOfLine( true, mePosLogical );
    
    var a = s.Text.split( "\n" );
    for ( var i = 0, len = a.length; i < len; i ++ ) {
      if ( a[i] ) {
        a[i] = a[i] + "\n" + a[i];
      }
    }
    s.Text = a.join( "\n" );
    s.SetAnchorPoint( mePosLogical, 1, ty );
    
     |  sukemaru  |  返信
スポンサーリンク