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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

3回答

812閲覧

VBAが想定と違う動きをします…

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2021/07/27 04:16

編集2021/07/28 01:32

下記コードで実行を行うと、

C62:D69のセルに1つでも空白がある場合 → C70のセルに「2」と入力
C62:D69のセルが全て埋まっていたら(空白でない) → C70のセルに「1」と入力

という内容が実行される予定でしたが、
マクロの実行を行うとC70のセルにどの場合でも「2」と入ってしまいます。

VBA

1Option Explicit 2 3Sub test() 4If WorksheetFunction.CountBlank(Range("C62:D69")) > 0 Then 5Cells(70, 3).Value = "2" 6End If 7 8If WorksheetFunction.CountBlank(Range("C62:D69")) = 0 Then 9Cells(70, 3).Value = "1" 10End If 11 12End Sub

何かお気づきのことがありましたら、
ご教示願います。

【追記】
イメージ説明

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

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

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

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

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

m.ts10806

2021/07/27 04:38

デバッグはされましたか?
退会済みユーザー

退会済みユーザー

2021/07/27 04:46

コメントありがとうございます。 デバッグを行ってみました。 If WorksheetFunction.CountBlank(Range("D62:E69")) > 0 Then Cells(70, 4).Value = "2" End If 上記を行うと予定では、 D62:E69に空白が1つでもあればD70に「2」と入力されるというコードを書いたつもりでした。 しかし空白が1つもなくてもこそコードを実行するとD70に「2」と入っていました。
m.ts10806

2021/07/27 05:18

結果は質問本文に追記してください。 質問変更したり回答などがつくと質問一覧の「アクティブ」に上がってくるので投稿し直す必要はありません。
mdj

2021/07/27 06:26

D62:D69は空欄に見えるのですが
退会済みユーザー

退会済みユーザー

2021/07/28 01:30

m.ts10806様 承知致しました、ご教示ありがとうございます。 mdj様 B62:B69の間違えでした、質問本文を訂正します。
K_3578

2021/07/28 07:15

なぜ退会した?
guest

回答3

0

こちらで、そのマクロを実行してみました。
D62:E69に全て数値を設定して実行すると、D70に1が設定されますよ。
マクロは正しく動作しています。
あなたが、D62:E69に全てブランク以外を設定し、2になった例を画像でアップしてください。
イメージ説明

投稿2021/07/27 05:40

tatsu99

総合スコア5493

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

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

退会済みユーザー

退会済みユーザー

2021/07/27 05:52

ご検証までして頂きありがとうございます。 画像追記します。
tatsu99

2021/07/27 06:24 編集

あなたが提示した画像をみました。C62:D69が結合セルになっています。 結合セルは、その先頭のセルのみ値が設定されます。C62,C64,C66,C68のみ値が設定され、D62~D69は 空白になります。したがって、そのC62:D69に全て値を埋めても、D62~D69は必ず空白になるので、2が設定されます。
guest

0

結合されたセルの特徴や動きなど理解されていないとマクロを組むことは難しいとおもいます
サンプルとして載せます

VBA

1Sub Macro2() 2 '前回のデータを削除する(結合されたセル) 3 Range("C70:D71").ClearContents 4 'セル範囲内の空白セルをカウントする 5 '変数「空」に値を書き換える 6 空 = WorksheetFunction.CountBlank(Range("C62:D69")) 7 If 空 > 0 Then 8 Cells(70, 3).Value = "2" 9 MsgBox "セルの空白は" & 空 & "個です." & Chr(10) & "セル(""C70"")への表示は「2」です" 10 ElseIf 空 = 0 Then 11 Cells(70, 3).Value = "1" 12 MsgBox "セルの空白は" & 空 & "個です." & Chr(10) & "セル(""C70"")への表示は「1」です" 13 14 End If 15 End Sub

mdj様とtatsu99様が説明した内容が図2です
mdj様
「CountBlankは空白セル数をカウントします。これは結合セルも結合前のセルとしてカウントします。
よって、2セル(セル4つ)を結合した箇所に対しては「1セルはデータあり、1セル(セル3つ)はデータなし」と判定します。」
tatsu99様
「結合セルは、その先頭のセルのみ値が設定されます。C62,C64,C66,C68のみ値が設定され、D62~D69は
空白になります」
イメージ説明
イメージ説明
セル結合無しでのプログラムに挑戦してみては
それから モニター画面半分をシート、もう半分をモジュール画面に設定して、一度モジュール画面を
クリックしてから[F8]キーを押しながら(黄色いカーソルが移動)変数の値が意とする値なのか確認
できます
[Windows]キー + [←]キー もう半分は[Enter]キーで画面設定できます
イメージ説明

投稿2021/07/30 09:33

syousuke.33

総合スコア312

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

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

0

質問文が「C列」のままですが、「B列」が対象であるとして。

VBA

1MsgBox (WorksheetFunction.CountBlank(Range("B62:B69")))

画像の状態のExcelで上記処理を行うと「4」となります。
また「済」の文字を削除して処理を行うと「8」です。

CountBlankは空白セル数をカウントします。これは結合セルも結合前のセルとしてカウントします。
よって、2セルを結合した箇所に対しては「1セルはデータあり、1セルはデータなし」と判定します。

投稿2021/07/28 07:13

mdj

総合スコア220

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問