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

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

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

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

Q&A

解決済

2回答

1381閲覧

VBAでSelect Caseの判定がおかしい

koratana

総合スコア1

VBA

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

0グッド

1クリップ

投稿2022/07/07 01:31

VBAで配列に入れた文字列をselectcaseで判定をしてるのですが、並べ替えや、その文字列をセルに入れてifで判定したときと違う結果になってしまいます。

コードは
dim ary1
dim ary2
・・・・
select case true
case ary1(i1,14)>ary2(i2,14)
・・・
case ary1(i1,14)=ary2(i2,14)
・・・
case ary1(i1,14)<ary2(i2,14)
・・・
end select
なのですが、ary2(i2,14)の方が並べ替えで上にくる文字列でも最初の判定でfalseになって3番目の判定でtrueになります。
比べてる文字列をセルに貼り付けてifで判定するとary2(i2,14)の方が小さいと判定されました。
どうしてかわかる方いましたら教えてください。
よろしくお願いいたします。

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

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

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

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

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

hatena19

2022/07/07 02:49

再現できるコードを提示できませんか。 実際の代入した文字列、If文の方のコードが分かるように。
koratana

2022/07/07 05:32

お返事ありがとうございます。 比べたのは A1セル:令和4年度一宮市まちづくり部区画整理課 A2セル:令和4年度一宮市まちづくり部公園緑地課 =IF(A1>A2,A2,A1) で令和4年度一宮市まちづくり部区画整理課が表示されます。 先にいれたコードではaray2に令和4年度一宮市まちづくり部区画整理課が入っています。 よろしくお願いいたします。
hatena19

2022/07/07 05:50 編集

A1、A2セルにそのように入力して、下記のコードを実行してみてください。 Dim ary1(0, 0) Dim ary2(0, 0) ary1(0, 0) = Range("A1") ary2(0, 0) = Range("A2") Select Case True Case ary1(0, 0) > ary2(0, 0) MsgBox "A1の方が大" Case ary1(0, 0) = ary2(0, 0) MsgBox "同じ" Case ary1(0, 0) < ary2(0, 0) MsgBox "A2の方が大" End Select メッセージボックスには何が表示されますか。 こちらのExcelでは、"A1の方が大" と正しく表示されます。
koratana

2022/07/07 06:08

IF文ではA1セルの方が小さい判定だと思うのですが、私が勘違いしてますか? 私がA1セルにarey2の文字列を入れたのでややこしかったですね。
guest

回答2

0

ベストアンサー

A1セルに「令和4年度一宮市まちづくり部区画整理課」
A2セルに「令和4年度一宮市まちづくり部公園緑地課」
と入力して下記のコードを実行すると、
"A1の方が大" と正しくメッセージが表示されます。
Select Caseの問題ではなく、提示されていない部分の問題だと思います。

(追記)文字列の比較方法の問題だと思われます。
モジュールの先頭に下記のようにテキストモードでの比較を指定すると、期待する結果になりそうです。
指定しないとバイナリモードでの比較になります。

vba

1Option Compare Text

Option Compare ステートメント (VBA) | Microsoft Docs

vba

1Public Sub test() 2 Dim ary1(0, 0) 3 Dim ary2(0, 0) 4 5 ary1(0, 0) = Range("A1") 6 ary2(0, 0) = Range("A2") 7 Select Case True 8 Case ary1(0, 0) > ary2(0, 0) 9 MsgBox "A1の方が大" 10 Case ary1(0, 0) = ary2(0, 0) 11 MsgBox "同じ" 12 Case ary1(0, 0) < ary2(0, 0) 13 MsgBox "A2の方が大" 14 End Select 15End Sub

ちなみに、Select Case で大小比較するなら、下記のように書くのが一般的です。

vba

1Public Sub SelectTest() 2 Dim ary1(0, 0) 3 Dim ary2(0, 0) 4 5 ary1(0, 0) = Range("A1") 6 ary2(0, 0) = Range("A2") 7 Select Case ary1(0, 0) 8 Case Is > ary2(0, 0) 9 MsgBox "A1の方が大" 10 Debug.Print ary1(0, 0) 11 Case Is = ary2(0, 0) 12 MsgBox "同じ" 13 Case Is < ary2(0, 0) 14 MsgBox "A2の方が大" 15 End Select 16End Sub

投稿2022/07/07 06:01

編集2022/07/07 07:06
hatena19

総合スコア34347

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

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

koratana

2022/07/07 06:13

ありがとうございます。 そうなんですね。ネットで拾ってきたのそのまま改造して使ってたので勉強になります。 IF文ではA1のが小さい判定だと思ってるのですが、私の勘違いでしょうか?
koratana

2022/07/07 06:16

=IF(A1>A2,"A1が大きい","A2が大きい") とセルに入力すると”A2が大きい”になります。
hatena19

2022/07/07 07:08

なるほど、そうですね。勘違いしてました。 文字列の比較方法の違いが原因と思われます。回答の方に追記しましたので確認ください。
koratana

2022/07/07 07:16

ありがとうございます。 ちゃんとできました! バイナリーモードだとちゃんと比較できないんですね?どういう仕組みか良くわからないですが助かりました。前に進めます^^ありがとうございました。
guest

0

select caseの構文は条件に一致した箇所のみ実行するのではなく一致した箇所以降のすべての処理を実行します。
省略されているので断言できませんがまあ結果が上書きされているのでしょう。
処理を途中で止めたい場合はbrakeを記載します。合致したCASEのみ処理したい場合はすべてにbrakeを記載します。

投稿2022/07/07 03:18

usekay

総合スコア395

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

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

hatena19

2022/07/07 04:07

それはどこ情報ですか。 AND演算子でつながれた式はすべて判定されるというのは知ってますが、 Select Case は合致したら、以降のCaseは判定されないと思いますが。 brake? そんなコマンド、VBAにはないです。
usekay

2022/07/07 04:19

他の言語と勘違いしていたようです忘れてください。
koratana

2022/07/07 05:39

お返事ありがとうございます。 また何かわかりましたら教えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問