質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • VBA

    2259questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1900questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • LibreOffice Calc

    27questions

    LibreOffice Calcは、様々なOSで利用可能なオフィススイートであるLibreOfficeに含まれるオープンソースの表計算ソフトです。テンプレートや背景色、枠線といった書式設定の各項目を柔軟で設定することができます。

  • LibreOffice Basic

    3questions

  • OpenOffice Basic

    2questions

LibreOffice Calc でワンタッチで行チェックする方法

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 946

cwi

score 8

 前提・実現したいこと

Excelでワンタッチで行チェックする方法
に投稿されたコードをLibreOffice Calcで使用したく修正を行っています。
シートイベント「選択を変更した時」に登録しているのですが
ワンクリック毎に複数回実行されてしまうようで動作が不安定です。
ワンクリック毎に1回だけ実行されるようにするにはどのような方法がありますか?

 発生している問題・エラーメッセージ

ワンクリック毎に34回実行されてしまうようです。
チカチカっとなって元に戻る症状は頻発、文字と色が一致しないこともあります。

 該当のソースコード

REM  *****  BASIC  *****
Option VBASupport 1
Option Explicit

Dim G_exec As Integer

Sub Worksheet_SelectionChange(ByVal Target As Range)

     'dbg
     G_exec = G_exec + 1
     ThisWorkbook.WorkSheets(1).Cells(1,1) = G_exec
     ThisWorkbook.WorkSheets(1).Cells(1,3) = ""

  On Error Goto Er

  Const strRow = 2
  Const endRow = 30

  Dim ChckOn As String
  Dim ChckOff As String

  ChckOn = ChrW(9745) '選択状態の文字
  ChckOff = ChrW(9744)  '非選択状態の文字

  '次のxx行は連続しない複数セルの選択時エラーとなる。
    'dbg
    ThisWorkbook.WorkSheets(1).Cells(1,4) = Target.CellAddress.Row
    ThisWorkbook.WorkSheets(1).Cells(1,5) = Target.CellAddress.Column
    'dbgここまで
  '対象がA列の指定範囲の1セルだけのとき
  If Target.CellAddress.Column+1 <> 1 Then Exit Sub
  If Target.CellAddress.Row+1 > endRow Then Exit Sub
  If Target.CellAddress.Row+1 < strRow Then Exit Sub
  If Target.Rows.Count > 1 Then Exit Sub
  If Target.Columns.Count > 1 Then Exit Sub

 'Application.EnableEvents = False
 ThisComponent.LockControllers
  If Target.CellAddress.Column+1 = 1 Then
    'チェックあり/チェックなしトグル動作。
    'チェックありのときは背景は色付き
    If Target.String = ChckOff Then
      Target.String = ChckOn
      With Rows(Target.CellAddress.Row+1).Interior
        .Color = rgb(255,99,71)
      End With
    Else
      Target.String = ChckOff
      With Rows(Target.CellAddress.Row+1).Interior
        .ColorIndex = xlNone
      End With
    End If
  End If

    'Application.EnableEvents = True/False(VBA)に相当する記述が分からない &
    'Target.Offset(0, 1).Select に相当する次の記述は
      'ThisComponent.CurrentController.select (ThisComponent.CurrentController.ActiveSheet.getCellByPosition(2,Target.CellAddress.Row))
      'カーソルが動く前にイベントが発生してしまう
      'Wait 100 'millisec 効果なし
      'Sleep 100
      'DoEvents: DoEvents: DoEvents

    ThisComponent.UnlockControllers
    Exit Sub  '終了

    Er:
    'エラー発生時の処理を記述
    'msgbox Error ,,"エラー"
     'dbg
     ThisWorkbook.WorkSheets(1).Cells(1,3) = "err"
     ThisWorkbook.WorkSheets(1).Cells(1,2) = ThisWorkbook.WorkSheets(1).Cells(1,2) + 1
End Sub
  'http://calibreblo.blogspot.com/2011/04/blog-post_1621.html
  'LibreOffice Calc Basic fun!!!: セルの位置を取得
  '.CellAddress.Column
  '.CellAddress.Row

  'http://calibreblo.blogspot.com/2011/04/blog-post_26.html
  'LibreOffice Calc Basic fun!!!: データが入力されている最終行・最終列を求める
  '.Rows.Count

  'https://forum.openoffice.org/ja/forum/viewtopic.php?f=19&t=187
  'Calcシート内の値があるすべてのセルを範囲とするプロパティ (トピック) • OpenOffice.org コミュニティーフォーラム
  '.getRows.Count
  '.getColumns.Count

  'https://ask.libreoffice.org/en/question/139060/how-to-retrieve-a-cell-value-using-libreoffice-basic/
  '.Columns.getCount()

  'https://j11.blog.so-net.ne.jp/2013-10-18
  '選択範囲の行、列の個数を調べる Libreoffice Calc Basic:ubuntu & LibreOffice:So-netブログ

 'http://calibreblo.blogspot.com/2011/05/blog-post_12.html
 'LibreOffice Calc Basic fun!!!: セルの背景色とフォントの色を設定する

'https://forum.openoffice.org/en/forum/viewtopic.php?f=9&t=36641
'Custom Cell Background (View topic) • Apache OpenOffice Community Forum
'Fill_Cell_Backgrounds.ods by Charlie Young

'https://stackoverflow.com/questions/32556294/how-to-change-the-background-color-of-a-cell-on-mouse-click-in-libre-office-calc
'myCell = ThisComponent.CurrentController.Selection
'myCell.CellBackColor = -1

'https://improve-future.com/libreoffice-calc-basic-handle-cell-range.html
'LibreOffice Calc: Basic でセルをまとめて扱う

'http://itukamuikananoka.blog.fc2.com/blog-category-6.html
'LibreOffice - いつか。むいか。なのか。
'clearContents で書式のみ消す方法

'http://www.vbaexpress.com/forum/showthread.php?11740-Solved-colorindex-xlnone
'Solved: colorindex = xlnone ?

'https://forum.openoffice.org/en/forum/viewtopic.php?f=9&t=39266
'ActiveCell.Offset (View topic) • Apache OpenOffice Community Forum

 試したこと

Now() で取得した時刻をグローバル変数で保持しておき、前回の実行時刻と今回の実行時刻が一定以下では即終了するようにしてもみましたが、改善はするもののしばしば誤動作しました。
(分解能が1秒程度のようで1000ms差になることがある。まれに「今回の実行時刻は前回の-1000ms後」という値も出る)

 補足情報(FW/ツールのバージョンなど)

LibreOffice 3.4.6,  LibreOffice Portable 4.3.5.2
Windows Vista (SPはインストールが成功しない)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • VBA

    2259questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1900questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • LibreOffice Calc

    27questions

    LibreOffice Calcは、様々なOSで利用可能なオフィススイートであるLibreOfficeに含まれるオープンソースの表計算ソフトです。テンプレートや背景色、枠線といった書式設定の各項目を柔軟で設定することができます。

  • LibreOffice Basic

    3questions

  • OpenOffice Basic

    2questions