Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


644 / 13645 ツリー ←次へ | 前へ→

【79010】チェックボックスがONの場合に選択している行文字を太くする ペーターパン 17/4/14(金) 12:07 質問[未読]
【79012】Re:チェックボックスがONの場合に選択して... β 17/4/14(金) 13:12 発言[未読]
【79013】Re:チェックボックスがONの場合に選択して... β 17/4/14(金) 14:19 発言[未読]
【79014】Re:チェックボックスがONの場合に選択して... ペーターパン 17/4/14(金) 14:59 お礼[未読]
【79015】Re:チェックボックスがONの場合に選択して... β 17/4/14(金) 15:37 発言[未読]
【79017】Re:チェックボックスがONの場合に選択して... β 17/4/14(金) 20:49 発言[未読]
【79042】Re:チェックボックスがONの場合に選択して... ペーターパン 17/4/19(水) 14:42 お礼[未読]
【79043】Re:チェックボックスがONの場合に選択して... β 17/4/19(水) 17:07 発言[未読]
【79101】Re:チェックボックスがONの場合に選択して... ペーターパン 17/5/10(水) 10:36 質問[未読]
【79102】Re:チェックボックスがONの場合に選択して... β 17/5/10(水) 18:22 発言[未読]
【79104】Re:チェックボックスがONの場合に選択して... ペーターパン 17/5/11(木) 10:32 お礼[未読]
【79263】Re:チェックボックスがONの場合に選択して... ペーターパン 17/6/23(金) 17:59 質問[未読]
【79270】Re:チェックボックスがONの場合に選択して... マナ 17/6/24(土) 12:28 発言[未読]
【79275】Re:チェックボックスがONの場合に選択して... マナ 17/6/24(土) 19:21 発言[未読]
【79280】Re:チェックボックスがONの場合に選択して... ペーターパン 17/6/30(金) 12:33 お礼[未読]

【79010】チェックボックスがONの場合に選択してい...
質問  ペーターパン  - 17/4/14(金) 12:07 -

引用なし
パスワード
   ■相談内容
 チェックボックスにより下記の機能のON、OFFを切り替えたいです。

  ・チェックが入っている :選択している行の文字を太く表示する
  ・チェックが入っていない:選択している行の表示はそのまま

 一度、下記のような流れで作成を試みたのですがうまくいきませんでした。
 ぜひアドバイスお願い致します。


■作ろうとしたVBAのソース

 Private Sub checkbox1_click(ByVal Target As Range)
   With ActiveSheet.CheckBoxes(Application.Caller)
     If .Value = xlOn Then
      UsedRange.Font.Bold = False
      Rows(Target.Row).Font.Bold = True
     End If
   End With
 End Sub

【79012】Re:チェックボックスがONの場合に選択し...
発言  β  - 17/4/14(金) 13:12 -

引用なし
パスワード
   ▼ペーターパン さん:

ActiveX のチェックボックスの値は xlOn や xlOff ではなく True や Fales です。

【79013】Re:チェックボックスがONの場合に選択し...
発言  β  - 17/4/14(金) 14:19 -

引用なし
パスワード
   ▼ペーターパン さん:

よく読むと Application.Caller を使っておられるので
フォームツールのチェックボックスなんですね。

であれば 値そのものは xlOn や xlOff でいいのですが
この場合は、自分でマクロを最初から最後まで書いて
それを チェックボックスにマクロ登録するわけですね。

名前を checkbox1_click とされるのは、勝手というか、すきにしたらいいのですが
 
Private Sub checkbox1_click(ByVal Target As Range)

この ( ) 内の引数、これは誰もセットしてくれません。

しかも、この形だと、マクロ登録しようにも、登録できません。

かつ、ActiveXであっても、フォームツールであっても、チェックボックスがクリックされたときに
そのチェックボックスが配置されているセルを Target といったセルオブジェクトで
返してくれるなんて親切な構造にはなっていません。

あくまで、クリックされたオブジェクトが何であるかがわかるだけで
そのオブジェクト.TopLeftCell といったもので、その場所を把握する必要があります。

配置しようとしているのは ActiveX ですか? フォームツールですか?
いずれであってもアップされたコードでは動きませんが、いずれかによって
正しいコードが異なってきますので。

【79014】Re:チェックボックスがONの場合に選択し...
お礼  ペーターパン  - 17/4/14(金) 14:59 -

引用なし
パスワード
   ▼β さん:

私感ではありますが、トラブル等が起きにくいフォームツールを使いたいです。
ある特定のワークシート場でのみ機能させたいと思っております。

下記、丁寧な説明ありがとうございます。
動かない理由についてはよく分かりました。
勉強になります。

▼β さん:
>▼ペーターパン さん:
>
>よく読むと Application.Caller を使っておられるので
>フォームツールのチェックボックスなんですね。
>
>であれば 値そのものは xlOn や xlOff でいいのですが
>この場合は、自分でマクロを最初から最後まで書いて
>それを チェックボックスにマクロ登録するわけですね。
>
>名前を checkbox1_click とされるのは、勝手というか、すきにしたらいいのですが
> 
>Private Sub checkbox1_click(ByVal Target As Range)
>
>この ( ) 内の引数、これは誰もセットしてくれません。
>
>しかも、この形だと、マクロ登録しようにも、登録できません。
>
>かつ、ActiveXであっても、フォームツールであっても、チェックボックスがクリックされたときに
>そのチェックボックスが配置されているセルを Target といったセルオブジェクトで
>返してくれるなんて親切な構造にはなっていません。
>
>あくまで、クリックされたオブジェクトが何であるかがわかるだけで
>そのオブジェクト.TopLeftCell といったもので、その場所を把握する必要があります。
>
>配置しようとしているのは ActiveX ですか? フォームツールですか?
>いずれであってもアップされたコードでは動きませんが、いずれかによって
>正しいコードが異なってきますので。

【79015】Re:チェックボックスがONの場合に選択し...
発言  β  - 17/4/14(金) 15:37 -

引用なし
パスワード
   ▼ペーターパン さん:

一例です。
以下のマクロを 標準モジュールに記載して、該当のチェックボックスをすべて選んで
この同じマクロを登録してください。

なお、現行のコード、いったんシート状のすべてのセルの文字の太さを通常にし
そのあと、該当の行の文字の太さのみを太字にしていますが、太字にするのは
チェックボックスが選ばれたときのみと考えれば、その行についてのみ
選ばれれば太字、選択が外れれば通常という制御にしました。

Sub フォント切り替え()
  Dim flg As Boolean
  
  With ActiveSheet.CheckBoxes(Application.Caller)
    If .Value = xlOn Then flg = True
    .TopLeftCell.EntireRow.Font.Bold = flg
  End With
  
End Sub

【79017】Re:チェックボックスがONの場合に選択し...
発言  β  - 17/4/14(金) 20:49 -

引用なし
パスワード
   ▼ペーターパン さん:

 
▼ペーターパン さん:

全く別のポイントで。

太字にしたり通常にしたり、そういったことを行う行が何行あるのかわかりませんが
そのすべての行にチェックボックスを配置するのも大変ではないですか。

しかもチェックボックスを、『正確に』その行の中におさめなければいけません。
ちょっと上にずれたりすることって無きにしも非ず。
操作者がうっかりと右クリックで選択してずらしてしまうかもしれませんし。

チェックボックス制御をやめ、たとえばフォントの状態をかえたい行の任意のセルを
ダブルクリックして処理するということも考えられます。
以下の例では、どの行に対しても操作可能ですが、もちろん、何行目以降とか何行目から
何行目までの間とか、その行の特定の列に特定の文字が入っている行のみとか、
そういった条件はいくらでもつけられます。

シートモジュールに。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Cancel = True
  Target.EntireRow.Font.Bold = Not Target.Font.Bold
End Sub

【79042】Re:チェックボックスがONの場合に選択し...
お礼  ペーターパン  - 17/4/19(水) 14:42 -

引用なし
パスワード
   ▼β さん:
いろいろとご教示頂きありがとうございました。
自分の知識の浅さが分かりました。
本来やりたかったことはチェックボックスをONにしている間、選択している任意の行全てが太字になるようにしたかったのです。
あれから試行錯誤していますが、今回は断念することにしました。
諦めずにコツコツと経験を積み重ねてレベルアップと深く正確な知識の習得に励みます。
ご尽力頂きありがとうございました。


>▼ペーターパン さん:
>
> 
>▼ペーターパン さん:
>
>全く別のポイントで。
>
>太字にしたり通常にしたり、そういったことを行う行が何行あるのかわかりませんが
>そのすべての行にチェックボックスを配置するのも大変ではないですか。
>
>しかもチェックボックスを、『正確に』その行の中におさめなければいけません。
>ちょっと上にずれたりすることって無きにしも非ず。
>操作者がうっかりと右クリックで選択してずらしてしまうかもしれませんし。
>
>チェックボックス制御をやめ、たとえばフォントの状態をかえたい行の任意のセルを
>ダブルクリックして処理するということも考えられます。
>以下の例では、どの行に対しても操作可能ですが、もちろん、何行目以降とか何行目から
>何行目までの間とか、その行の特定の列に特定の文字が入っている行のみとか、
>そういった条件はいくらでもつけられます。
>
>シートモジュールに。
>
>Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
>  Cancel = True
>  Target.EntireRow.Font.Bold = Not Target.Font.Bold
>End Sub

【79043】Re:チェックボックスがONの場合に選択し...
発言  β  - 17/4/19(水) 17:07 -

引用なし
パスワード
   ▼ペーターパン さん:

もう、ご覧にならないかもしれませんが。

そういうことだったんですか。
要件をすっかり誤解していました。

であれば、以下の2つの方法が考えられます。

1.任意の行が選択されたときに、その時点のチェックボックスの選択の状態をみて
 チェックが入っていたら、選択された行を太字にする。

 チェックボックスにはマクロ登録をしません。していれば消してください。
 で、シートモジュールに。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Cells.Font.Bold = False
  If CheckBoxes("チェック 1").Value = xlOn Then  '★
    Selection.EntireRow.Font.Bold = True
  End If
End Sub

 ★のところ、実際のコントロール名に直してください。

2.チェックボックスにチェックが入った時点で、その時に選択されていた行を太字にする。
 (これは、やってみると、操作が面倒というか、スムーズじゃないなと思いましたが)

 シートモジュールは使いません。記述があれば消してください。
 標準モジュールに以下のマクロを書き、チェックボックスにマクロ登録します。

Sub Test()
  Cells.Font.Bold = False
  If ActiveSheet.CheckBoxes(Application.Caller).Value = xlOn Then Selection.EntireRow.Font.Bold = True
End Sub

【79101】Re:チェックボックスがONの場合に選択し...
質問  ペーターパン  - 17/5/10(水) 10:36 -

引用なし
パスワード
   ▼β さん:
お礼が遅くなり申し訳ありません。
ご尽力頂きありがとうございます。
あれからすぐマクロを組み使用しております。
今回、以下のような改善要望が出ました。

改善要望:エクセルの動作が少し重いので改善できないか。

確かに、毎回アクティブセルのボールドを解除するよう命令しているので、
一度下記のように書きました。
これですとアクティブセルの太字が残ってしまうので、コマンドボタンを押すとセルの太字が通常に戻るようにするなどの対策を取ろうと思っています。
もっとスマートな方法はあるのでしょうか?
ご教示頂ければ幸いです。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If CheckBoxes("ChkBx1").Value = xlOn Then
    Cells.Font.Bold = False ←★ご教示頂いたマクロのこの部分を移動しました。
    Selection.EntireRow.Font.Bold = True
  End If
End Sub


>▼ペーターパン さん:
>
>もう、ご覧にならないかもしれませんが。
>
>そういうことだったんですか。
>要件をすっかり誤解していました。
>
>であれば、以下の2つの方法が考えられます。
>
>1.任意の行が選択されたときに、その時点のチェックボックスの選択の状態をみて
> チェックが入っていたら、選択された行を太字にする。
>
> チェックボックスにはマクロ登録をしません。していれば消してください。
> で、シートモジュールに。
>
>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>  Cells.Font.Bold = False
>  If CheckBoxes("チェック 1").Value = xlOn Then  '★
>    Selection.EntireRow.Font.Bold = True
>  End If
>End Sub
>
> ★のところ、実際のコントロール名に直してください。
>
>2.チェックボックスにチェックが入った時点で、その時に選択されていた行を太字にする。
> (これは、やってみると、操作が面倒というか、スムーズじゃないなと思いましたが)
>
> シートモジュールは使いません。記述があれば消してください。
> 標準モジュールに以下のマクロを書き、チェックボックスにマクロ登録します。
>
>Sub Test()
>  Cells.Font.Bold = False
>  If ActiveSheet.CheckBoxes(Application.Caller).Value = xlOn Then Selection.EntireRow.Font.Bold = True
>End Sub

【79102】Re:チェックボックスがONの場合に選択し...
発言  β  - 17/5/10(水) 18:22 -

引用なし
パスワード
   ▼ペーターパン さん:

元々アップしたコードの Cellsを必要行のみにするとどうでしょうか?


Option Explicit

Dim bLine As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not bLine Is Nothing Then
    bLine.Font.Bold = False
    Set bLine = Nothing
  End If
  If CheckBoxes("ChkBx1").Value = xlOn Then
    Selection.EntireRow.Font.Bold = True
    Set bLine = Selection.EntireRow
  End If
End Sub

【79104】Re:チェックボックスがONの場合に選択し...
お礼  ペーターパン  - 17/5/11(木) 10:32 -

引用なし
パスワード
   ▼β さん:
ありがとうございます。

モジュールレベルで変数を宣言する。
if not構文で宣言する。
どちらも今の私ではたどり着けない答えでした。

Worksheet_SelectionChangeの場合、イベント発生の度に変数がどうなっているかよく考えなくてはいけないのですね。
自分が試しに作ったものだと太字が延々と作られ続けた理由がよくわかりました。

壁にぶつかってまた1つ成長できました。
これからも精進します。

>▼ペーターパン さん:
>
>元々アップしたコードの Cellsを必要行のみにするとどうでしょうか?
>
>
>Option Explicit
>
>Dim bLine As Range
>
>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>  If Not bLine Is Nothing Then
>    bLine.Font.Bold = False
>    Set bLine = Nothing
>  End If
>  If CheckBoxes("ChkBx1").Value = xlOn Then
>    Selection.EntireRow.Font.Bold = True
>    Set bLine = Selection.EntireRow
>  End If
>End Sub

【79263】Re:チェックボックスがONの場合に選択し...
質問  ペーターパン  - 17/6/23(金) 17:59 -

引用なし
パスワード
   もし、下記のコードをアドインにしようとした場合、どうすればよいでしょうか?
過去の質問に再質問で申し訳ありませんが、何卒宜しくお願い致します。

>▼β さん:
>ありがとうございます。
>
>モジュールレベルで変数を宣言する。
>if not構文で宣言する。
>どちらも今の私ではたどり着けない答えでした。
>
>Worksheet_SelectionChangeの場合、イベント発生の度に変数がどうなっているかよく考えなくてはいけないのですね。
>自分が試しに作ったものだと太字が延々と作られ続けた理由がよくわかりました。
>
>壁にぶつかってまた1つ成長できました。
>これからも精進します。
>
>>▼ペーターパン さん:
>>
>>元々アップしたコードの Cellsを必要行のみにするとどうでしょうか?
>>
>>
>>Option Explicit
>>
>>Dim bLine As Range
>>
>>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>>  If Not bLine Is Nothing Then
>>    bLine.Font.Bold = False
>>    Set bLine = Nothing
>>  End If
>>  If CheckBoxes("ChkBx1").Value = xlOn Then
>>    Selection.EntireRow.Font.Bold = True
>>    Set bLine = Selection.EntireRow
>>  End If
>>End Sub

【79270】Re:チェックボックスがONの場合に選択し...
発言  マナ  - 17/6/24(土) 12:28 -

引用なし
パスワード
   ▼ペーターパン さん:

なぜアドインなのでしょうか。
ちょっと試してみましたが
メリットが感じられませんでした。

「元に戻す」の機能が使えなくなるのは気にしないのでしょうか。
特定ファイルにのみに適用するマクロではないのでしょうか。

【79275】Re:チェックボックスがONの場合に選択し...
発言  マナ  - 17/6/24(土) 19:21 -

引用なし
パスワード
   ▼ペーターパン さん:

試したのは、こんな感じです。

Option Explicit

Dim WithEvents xlApp As Application
Dim bLine As Range


Private Sub Workbook_Open()
  Set xlApp = Application
  
 With xlApp.CommandBars("Cell").Controls.Add(before:=1)
  .Caption = "強調表示OFF"
  .OnAction = "thisworkbook.メニュ切り替え"
  ThisWorkbook.Sheets(1).Cells(1).Value = False
 End With
  
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

  If Not bLine Is Nothing Then bLine.Font.Bold = False
  xlApp.CommandBars("Cell").Controls(1).Delete
  
End Sub

Private Sub メニュ切り替え()
  
  With ThisWorkbook.Sheets(1).Cells(1)
    If .Value = False Then
      xlApp.CommandBars("Cell").Controls(1).Caption = "強調表示ON"
    Else
      xlApp.CommandBars("Cell").Controls(1).Caption = "強調表示OFF"
    End If
    .Value = Not .Value
  End With
   
End Sub


Private Sub xlApp_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

  If Not bLine Is Nothing Then
    bLine.Font.Bold = False
    Set bLine = Nothing
  End If
  If ThisWorkbook.Sheets(1).Cells(1).Value Then
    Selection.EntireRow.Font.Bold = True
    Set bLine = Selection.EntireRow
  End If
  
End Sub

【79280】Re:チェックボックスがONの場合に選択し...
お礼  ペーターパン  - 17/6/30(金) 12:33 -

引用なし
パスワード
   ▼マナ さん:
返信が遅れて申し訳ありません。

業務上、CSVファイルやエクセルファイルの数値チェックを行うことが多いため、個人用にアドインを作りたいと考えていました。
下記、よく読んで自分の至らなかった点を確認してみます。


>▼ペーターパン さん:
>
>試したのは、こんな感じです。
>
>Option Explicit
>
> Dim WithEvents xlApp As Application
> Dim bLine As Range
>
>
>Private Sub Workbook_Open()
>  Set xlApp = Application
>  
> With xlApp.CommandBars("Cell").Controls.Add(before:=1)
>  .Caption = "強調表示OFF"
>  .OnAction = "thisworkbook.メニュ切り替え"
>  ThisWorkbook.Sheets(1).Cells(1).Value = False
> End With
>  
>End Sub
>
>Private Sub Workbook_BeforeClose(Cancel As Boolean)
>
>  If Not bLine Is Nothing Then bLine.Font.Bold = False
>  xlApp.CommandBars("Cell").Controls(1).Delete
>  
>End Sub
>
>Private Sub メニュ切り替え()
>  
>  With ThisWorkbook.Sheets(1).Cells(1)
>    If .Value = False Then
>      xlApp.CommandBars("Cell").Controls(1).Caption = "強調表示ON"
>    Else
>      xlApp.CommandBars("Cell").Controls(1).Caption = "強調表示OFF"
>    End If
>    .Value = Not .Value
>  End With
>   
>End Sub
>
>
>Private Sub xlApp_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
>
>  If Not bLine Is Nothing Then
>    bLine.Font.Bold = False
>    Set bLine = Nothing
>  End If
>  If ThisWorkbook.Sheets(1).Cells(1).Value Then
>    Selection.EntireRow.Font.Bold = True
>    Set bLine = Selection.EntireRow
>  End If
>  
>End Sub

644 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free