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

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

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

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

Q&A

解決済

2回答

7087閲覧

選択したセルの文字列を変更しようとすると文字の大きさが変わってしまう、複数選択でも動くようにしたい

halmichi

総合スコア12

VBA

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

0グッド

0クリップ

投稿2020/08/16 08:43

前提・実現したいこと

Microsoft360のエクセルを使っています。VBAで、画像のようなチェックボックスの文字を選択するとチェックがついたり消えたりするようにしたいです。2列1行が1単位で、左のチェックボックスがオンになると右が入力可能になります。

また範囲で選択してもその部分が変わるようにしたいです。
イメージ説明

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

チェックボックスの大きさが変わってしまうことがあります。
游ゴシックがSegoe UI Symbolにかわっているからのようですが、変わってしまう基準がわかりません。変わるときも変わらない時もあります。

範囲で選択すると「型が一致しません」というエラーが出ます。

該当のソースコード

VBA

1Private Sub Worksheet_SelectionChange(ByVal Target As Range)  2 With Target 3 If .Value = ChrW(9744) Then 4 .Value = ChrW(9745) 5 .Offset(0, 1).Font.ColorIndex = xlAutomatic 6 ElseIf .Value = ChrW(9745) Then 7 .Value = ChrW(9744) 8 With .Offset(0, 1) 9 .Value = ChrW(9744) + "リハ" 10 .Font.ThemeColor = xlThemeColorDark1 11 .Font.TintAndShade = -0.249977111117893 12 End With 13 ElseIf .Value = ChrW(9744) + "リハ" Then 14 If .Offset(0, -1).Value = ChrW(9745) Then 15 .Value = ChrW(9745) + "リハ" 16 End If 17 ElseIf .Value = ChrW(9745) + "リハ" Then 18 .Value = ChrW(9744) + "リハ" 19 End If 20 End With 21End Sub

試したこと

フォントを指定すれば大丈夫だと思いますが、なぜこうなってしまうのか知りたいです。

範囲に関しては、Rangeオブジェクトを各々のセルとして取得できればループで処理できるかと思いましたが、そのようなものは見つけられませんでした。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Excelファイルに入力中のフォントが強制的に游ゴシックへ変わる

↑これじゃないですかね?
最新のバージョンにアップデートしたら、なおるかも?

コードの方はこんな感じでまとめてみてはいかがでしょうか。

ExcelVBA

1Option Explicit 2 3Private Sub Worksheet_SelectionChange(ByVal Target As Range) 4 Dim rngEventArea As Range: Set rngEventArea = Me.Range("C3:F10") 5 Dim c As Range 6 7 Set Target = Intersect(Target.Resize(, 1), rngEventArea) 8 If Target Is Nothing Then Exit Sub 9 10 For Each c In Target.Cells 11 CheckOnOff c 12 Next 13 14 rngEventArea(0, 1).Select 15End Sub 16 17Private Sub CheckOnOff(ByRef c As Range) 18 Dim cmyTrue As String: cmyTrue = ChrW(9745) 19 Dim cmyFalse As String: cmyFalse = ChrW(9744) 20 Dim cDefault As String: cDefault = ChrW(9744) & "リハ" 21 Dim s As String 22 Dim flg As Boolean 23 24 If c.Font.Color = rgbLightSlateGray Then Exit Sub 25 s = c.Value 26 flg = CBool(InStr(s, cmyFalse)) 27 If flg Then 28 s = Replace(s, cmyFalse, cmyTrue) 29 Else 30 s = Replace(s, cmyTrue, cmyFalse) 31 End If 32 c.Value = s 33 If CBool(c.Column Mod 2) Then 34 With c.Offset(, 1) 35 .Value = cDefault 36 .Font.Color = IIf(flg, vbBlack, rgbLightSlateGray) 37 End With 38 End If 39End Sub

投稿2020/08/17 03:17

編集2020/08/17 07:55
mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

halmichi

2020/08/17 06:25

ありがとうございます。
halmichi

2020/08/18 06:50

ありがとうございます。 知らないメソッドが多く、理解に時間がかかっていますが、大変勉強になります。 CheckOnOffで変数Sにcの値を格納してから処理しているのは可読性をよくするためという理解でいいですか? よろしくお願いいたします。
mattuwan

2020/08/18 10:28 編集

ちょっと違います。 昔初心者だったころ(今も初心者なんですが)、 「同じ事を二度書くな」と習った事を、 実践しているだけです。 効能としては、 今回の件ではあまり関係ないかもですが、 メンテナンス性の向上があります。 例えば、 c.valueを c.offset(0,1).value に変えたくなったときに、 書き直す箇所が1箇所になります。 あと、 今回の件では、セルを読む回数が1回少なくなります。セルへのアクセスは結構重いので、出来れば回数を最低限にしたいです。(書き込みに比べたらたいしたことないですが)数十回程度なら気にならないですが、何千何万と繰り返せばかなりの時間になります。 また、ピリオドの登場回数を減らすのも、高速化に寄与します。 今回の件の場合、文字列の変更の部分を関数化することでさらに可読性が向上するかもしれませんが、プロシージャを分けるとステップインで処理の流れが追いにくいと感じる方もいるようなので、今は分かりやすい方でやってください。 自作関数を作るのに抵抗がなくなれば、レベル1upかも。
halmichi

2020/08/20 06:33

ありがとうございます。 高速化、メンテナンス性などは今まで意識していませんでしたが、これからは頭の隅に置いておこうと思います。
guest

0

フォントか勝手に変わらないようにするには、対象セル範囲を選択した状態で、右クリック→セルの書式設定→フォント で「標準フォント」のチェックを外せば、指定したフォント固定になります。

イメージ説明

フォントを指定すれば大丈夫だと思いますが、なぜこうなってしまうのか知りたいです。

フォントを設定すると「標準フォント」も自動ではずれます。
「標準フォント」は文字種(日本語とか記号とか)に応じて適するとEXCELくんが判断したフォントにするという仕様なのだと思います。

範囲に関しては、Rangeオブジェクトを各々のセルとして取得できればループで処理できるかと思いましたが、

下記のコードでどうでしょう。

vba

1Private Sub Worksheet_SelectionChange(ByVal Target As Range) 2 Dim rngCell As Range 3 4 For Each rngCell In Target 5 CheckChange rngCell 6 Next 7End Sub 8 9Private Sub CheckChange(ByVal rngCell As Range) 10 With rngCell 11 If .Value = ChrW(9744) Then 12 .Value = ChrW(9745) 13 .Offset(0, 1).Font.ColorIndex = xlAutomatic 14 ElseIf .Value = ChrW(9745) Then 15 .Value = ChrW(9744) 16 With .Offset(0, 1) 17 .Value = ChrW(9744) + "リハ" 18 .Font.ThemeColor = xlThemeColorDark1 19 .Font.TintAndShade = -0.249977111117893 20 End With 21 ElseIf .Value = ChrW(9744) + "リハ" Then 22 If .Offset(0, -1).Value = ChrW(9745) Then 23 .Value = ChrW(9745) + "リハ" 24 End If 25 ElseIf .Value = ChrW(9745) + "リハ" Then 26 .Value = ChrW(9744) + "リハ" 27 End If 28 End With 29End Sub

ちみなにこのWorksheet_SelectionChangeを使用する方法は、同じセルを繰り返しクリックても無反応なのが気になります。
間違えてチェックしてしまったとき、チェックを外すには、一度別セルをクリックしてからでないとチェックを外せません。
通常のチェックボックスはクリックするたびにチェックのオンオフが可能です。

フォームコントロールかActiveXコントロールのチェックボックスを配置する方法の方がいいように思います。

投稿2020/08/17 03:29

編集2020/08/17 03:45
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

halmichi

2020/08/17 10:41

ありがとうございます。レンジオブジェクトをFor Eachで処理すればよかったんですね。 勉強になりました。 ご指摘の通り、初めはチェックボックスを置こうと思っていたのですが、前の処理で「行列のヘッダを読み込んで自動生成したい」ものであったので、セルに入れられず断念した結果こうなっています。 このスクリプトは初めGASで作ったのですが、ネットが不安定だとうまく動作しないことがあってエクセルに移植しています。GASだとチェックボックスがセルに埋め込まれているので楽だったのですが。。 何かうまい手はあるでしょうか?というか、その質問は新たにしたほうがいいですか? よろしくお願いいたします。
hatena19

2020/08/17 12:32

おそらく結構なボリュームになると思いますので、新規に質問しなおした方かいいと思います。
halmichi

2020/08/18 06:45

ありがとうございます。 そうします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問