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

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

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

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

Q&A

解決済

6回答

4527閲覧

文字列が一致しているかを判定していますがヒットしません

skjdujr9djhf

総合スコア28

VBA

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

0グッド

0クリップ

投稿2018/03/15 07:31

編集2018/03/16 00:46

前提・実現したいこと

特定の列で判定文字と一致したらその数を数えようとしていますが、
1件もヒットしません。
ソースのi,jは変数です。
セル(j - 1, 7)から上方向にセル(i, 7)まで「ABC」と完全一致している数を
数えようとしています。
検索範囲はVartype関数で確認すると戻り値が8なので全て文字列となっています。

●追記
変数i,jはこのソースより上で定義しており値もこの処理に入る前に
期待した値が取れていることは確認できています。
(Debug.Print i
Debug.Print j で確認)

該当のソースコード

VBA

1 Dim sheet As Worksheet 2 Dim r As Long 3 Dim c As Long 4 5 'カウント変数 6 c =0 7 8 Set sheet = Worksheets("Sheet1") 9 r = sheet.Cells(j - 1, 7).End(xlUp).Row 10 11 Do While (i <= r) 12 If sheet.Cells(r, 7).Value = "ABC" Then 13 14 c = c + 1 15 16 End If 17 r = r - 1 18 Loop 19 20 Debug.Print c

試したこと

テストデータ10件でセルの値を確認しようとしています。
イメージ説明

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

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

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

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

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

guest

回答6

0

ベストアンサー

手元で再現してみたので、回答内容を全面刷新しました。

まず、r = sheet.Cells(j - 1, 7).End(xlUp).Rowが適切に想定した数字を拾ってきているかの確認をしましょう。
このコードでスタートするべき行番号を設定しているものと思いますが、
rの数字がおかしいうちは次のDo Whileループに全く入っていきません。

さらに、ループ処理の中のi <= r
iの値を示したコード内でわからなかったのですが、
条件次第ではrが0以下になってエラーになりかねないことを
確認したほうが良いです。

F8キーでステップ実行しつつ、
イミディエイトウィンドウで気になる変数を「? r」とかすれば表示してくれるので、
想定通りの動きになるか変数の中身を点検しながらステップ実行してください。

投稿2018/03/16 02:38

編集2018/03/16 03:10
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

skjdujr9djhf

2018/03/19 01:13

rが適切な値が取れていると思っていましたが、想定した値が取れていませんでした。 以下のコードで1行ずつ実行すると想定通りの動きとなりました。 Sub abc() Dim sheet As Worksheet Dim r As Long Dim c As Long 'カウント変数 c = 0 i = 1 j = 11 Set sheet = Worksheets("Sheet1") r = Range("G" & j - 1).Row Do While (i <= r) If sheet.Cells(r, 7).Value = "ABC" Then c = c + 1 Debug.Print r End If r = r - 1 Loop Debug.Print c End Sub
guest

0

比較処理に関しては特別問題になるようなところはないと思います。
変数ijの状態がわからないので、おそらくここに問題があるのでは。
ループに入る前にijが想定どおりの値になっているか確認してみてください。

投稿2018/03/15 08:17

ttyp03

総合スコア16998

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

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

0

jとiの初期値が設定されていません。
適当に下記のように設定しました。
j = 100
i = 1

その上で、

G1セル 1
G2セル ABC
G3セル 2
G4セル ABC
G5セル 3

と入力し、実行したところ期待通りになっていました。

F8キーでステップ実行できますので
1行つづ確認していけば自身で原因はかわると思います。

投稿2018/03/15 07:51

kikukiku

総合スコア514

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

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

0

値の比較は基本的に文字列どうしでやるのが無難です。

なので、自分ならまず比較を「Cstr(sheet.Cells(r, 7).Value) = "ABC"」
とします。
※今回はABCが文字列ですが、1等の数値を当てようとした時に、
文字列 vs 数値だとHitしないので。

あと、Hitしそうでしないパターンの調整ですかね。
Trimで前後スペースを除去したり、
StrConvで大文字小文字、全角半角を調整したり、
String_Compare(Str1, Str2, vbTextCompare)で判定してみたり。

投稿2018/03/15 07:46

ExcelVBAer

総合スコア1175

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

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

ExcelVBAer

2018/03/15 09:03

例えば if r = 10 Then Stop 等と、確実にあるべき位置で止めて、 Debug.Print sheet.Cells(r, 7).Value で値を確認してみては?
skjdujr9djhf

2018/03/16 01:18 編集

Cstr(sheet.Cells(r, 7).Value) = "ABC"で文字列同士の比較にしてみましたが、ヒットしませんでした。 また以下のコードとテストデータを作成して値を確認していますが、結果が得られません。 エラー1004「アプリケーション定義またはオブジェクト定義のエラーです。」が表示されます。 Sub abc() Dim sheet As Worksheet '変数宣言 Dim r As Long Dim c As Long Dim i As Long Dim j As Long 'カウント変数 c = 0 '変数初期値 i = 1 j = 11 Set sheet = Worksheets("Sheet1") r = sheet.Cells(j - 1, 7).End(xlUp).Row Do While (i <= r) If r = 7 Then Stop End If r = r - 1 Loop Debug.Print sheet.Cells(r, 7).Value End Sub 調べるとCells()を使ったときの第1パラメータの変数iが0だと出る http://www.koikikukan.com/archives/2013/11/20-015555.php や対象のシートがアクティブでない時にエラーが発生するとのことです。 他に考えられる原因はあるでしょうか。
ExcelVBAer

2018/03/16 04:52

1. Worksheets("Sheet1")は、ActiveWorkBook.Worksheets("Sheet1")と自動解釈されるので、 対象のブックをアクティブにするか、 対象のブックから呼び出すか(WorkBooks("ブック名").Worksheets("シート名")) とする方が無難ですね。Sheet1とかよくある名前なので特に。。。 If文は、下記のようにも記述できますので、ご参考まで。 If r = 7 Then Stop で、Stopしなかったのであれば、 7行目が処理されなかったということで、 r = sheet.Cells(j - 1, 7).End(xlUp).Row 時点の r が怪しいですねぇ。 デバッグの方法として、以下を使うとやりやすいのでご参考まで。 ・ブレークポイント ・F8 でステップ実行 ・ローカルウィンドウ ・イミディエイトウィンドウ
guest

0

Cells(i,j)で取得できるRangeオブジェクトにはValueValue2Textといったプロパティで値が保持されるようです。

Valueプロパティの値と"ABC"の比較で検索できないのはValue2プロパティに値が保持されているからかもしれません。

投稿2018/03/15 07:42

tkturbo

総合スコア5572

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

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

skjdujr9djhf

2018/03/16 01:45

Debug.Print sheet.Cells(r, 7).Value2 Value2プロパティで値を確認してみましたが、Valueの時と結果は変わりませんでした。
guest

0

Debug.Print で、sheet.Cells(r, 7).Valueを確認して、"ABC"なのに、HITしないということなのでしょうか?

あとは、iの値がわからないですが、そもそもループに入ってないとかありませんか?

追記
i、jは期待した値とのことなので・・・

VBA

1 Do While (i <= r) 2 Debug.print sheet.Cells(r, 7).Value 3 If sheet.Cells(r, 7).Value = "ABC" Then

で、期待した値か表示されるか確認してみてはどうでしょう。

投稿2018/03/15 07:39

編集2018/03/15 09:39
momon-ga

総合スコア4820

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

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

skjdujr9djhf

2018/03/16 01:43

上記で確認するとデバック結果には「1」と表示されます。 テストデータ10行ですが、全て1が返ってきます。 やはりsheet.Cells(r, 7).Valueで値が取れていないようです。
momon-ga

2018/03/16 02:37

ステップ実行で変数の中身確認しましょう。 テストデータが入ってるシート名も合っているか確認です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問