Sub zaiko()
Dim gyo
For gyo = 2 To 10
If Range("D" & gyo).Value > 3 Then
Range("E" & gyo).Value = "A"
ElseIf Range("D" & gyo).Value > 2 Then
Range("E" & gyo).Value = "B"
ElseIf Range("D" & gyo).Value > 1 Then
Range("E" & gyo).Value = "C"
ElseIf Range("D" & gyo).Value > 0 Then
Range("E" & gyo).Value = "D"
ElseIf Range("D" & gyo).Value = "#DIV/0!" Then
Range("E" & gyo).Value = "在庫ゼロ"
End If
Next
End Sub
Sub hikaku_test1()
'不等号で比較できるのは数値同士
If 3 > 1 Then
Range("G1").Value = "こっち"
Else
Range("G1").Value = "そっち"
End If
If 5 > 5 Then
Range("G2").Value = "こっち"
Else
Range("G2").Value = "そっち"
End If
End Sub
Sub hikaku_test2()
'文字列と数値を不等号で比較することはできない
If "こんにちは" > 3 Then
Range("G3").Value = "こっち"
Else
Range("G3").Value = "そっち"
End If
End Sub
Sub hikaku_test3()
'#DIV/0!も文字列なので、不等号で数値と比較することはできない
If "#DIV/0!" > 3 Then
Range("G4").Value = "こっち"
Else
Range("G4").Value = "そっち"
End If
End Sub
Sub hikaku_test4()
'#DIV/0!が
'「セルに埋め込まれた値」でなく
'「ワークシート上での計算の結果でたエラー」
'だったとしてもやはりだめ
'(*)計算結果のエラーは厳密には文字列ではありません。が、基礎編なのでそこの説明は省略。
If Range("D8").Value > 3 Then
Range("G5").Value = "こっち"
Else
Range("G5").Value = "そっち"
End If
End Sub
Sub zaiko_ogawa()
Dim gyo
Dim kaitenritsu
For gyo = 2 To 10
kaitenritsu = Range("B" & gyo).Value / Range("C" & gyo).Value
If kaitenritsu > 3 Then
Range("E" & gyo).Value = "A"
ElseIf kaitenritsu > 2 Then
Range("E" & gyo).Value = "B"
ElseIf kaitenritsu > 1 Then
Range("E" & gyo).Value = "C"
ElseIf kaitenritsu > 0 Then
Range("E" & gyo).Value = "D"
ElseIf kaitenritsu = "#DIV/0!" Then
Range("E" & gyo).Value = "在庫ゼロ"
End If
Next
End Sub
Sub zaiko_ogawa_avoid_div0()
Dim gyo
Dim kaitenritsu
For gyo = 2 To 10
If Range("C" & gyo).Value > 0 Then
kaitenritsu = Range("B" & gyo).Value / Range("C" & gyo).Value
If kaitenritsu > 3 Then '[*1]
Range("E" & gyo).Value = "A"
ElseIf kaitenritsu > 2 Then
Range("E" & gyo).Value = "B"
ElseIf kaitenritsu > 1 Then
Range("E" & gyo).Value = "C"
ElseIf kaitenritsu > 0 Then
Range("E" & gyo).Value = "D"
End If '[*2]
Else
Range("E" & gyo).Value = "在庫ゼロ"
End If
Next
End Sub
上に示したコードで、[*1]-[*2]は以下のように書き換えられます。 If ... ElseIf ... ElseIf ... で比較対象が同じ場合はこう書いたほうがすっきりします。発展編1レベル。
Sub zaiko_ogawa_avoid_div0_select_case()
Dim gyo
Dim kaitenritsu
For gyo = 2 To 10
If Range("C" & gyo).Value > 0 Then
kaitenritsu = Range("B" & gyo).Value / Range("C" & gyo).Value
Select Case kaitenritsu
Case Is > 3
Range("E" & gyo).Value = "A"
Case Is > 2
Range("E" & gyo).Value = "B"
Case Is > 1
Range("E" & gyo).Value = "C"
Case Is > 0
Range("E" & gyo).Value = "D"
End Select
Else
Range("E" & gyo).Value = "在庫ゼロ"
End If
Next
End Sub
もっとリライトできますが、まずはこのくらいで。
> 小川慶一さん: > > お世話になります。コードは以下の通りです。 > また、Excelの画面とVBAの画面を並列したものを添付いたします。 > よろしくお願いします。 > Sub zaiko() > Dim gyo > For gyo = 2 To 10 > If Range("D" & gyo).Value > 3 Then > Range("E" & gyo).Value = "A" > ElseIf Range("D" & gyo).Value > 2 Then > Range("E" & gyo).Value = "B" > ElseIf Range("D" & gyo).Value > 1 Then > Range("E" & gyo).Value = "C" > ElseIf Range("D" & gyo).Value > 0 Then > Range("E" & gyo).Value = "D" > ElseIf Range("D" & gyo).Value = "#DIV/0!" Then > Range("E" & gyo).Value = "在庫ゼロ" > End If > > Next > > End Sub >
Sub hikaku_test1()
> '不等号で比較できるのは数値同士
> If 3 > 1 Then
> Range("G1").Value = "こっち"
> Else
> Range("G1").Value = "そっち"
> End If
> If 5 > 5 Then
> Range("G2").Value = "こっち"
> Else
> Range("G2").Value = "そっち"
> End If
>
> End Sub
> Sub hikaku_test2()
> '文字列と数値を不等号で比較することはできない
> If "こんにちは" > 3 Then
> Range("G3").Value = "こっち"
> Else
> Range("G3").Value = "そっち"
> End If
> End Sub
> Sub hikaku_test3()
> '#DIV/0!も文字列なので、不等号で数値と比較することはできない
> If "#DIV/0!" > 3 Then
> Range("G4").Value = "こっち"
> Else
> Range("G4").Value = "そっち"
> End If
> End Sub
> Sub hikaku_test4()
> '#DIV/0!が
> '「セルに埋め込まれた値」でなく
> '「ワークシート上での計算の結果でたエラー」
> 'だったとしてもやはりだめ
> '(*)計算結果のエラーは厳密には文字列ではありません。が、基礎編なのでそこの説明は省略。
> If Range("D8").Value > 3 Then
> Range("G5").Value = "こっち"
> Else
> Range("G5").Value = "そっち"
> End If
> End Sub
Sub zaiko_ogawa_avoid_div0_select_case()
> Dim gyo
> Dim kaitenritsu
> For gyo = 2 To 10
> If Range("C" & gyo).Value > 0 Then
> kaitenritsu = Range("B" & gyo).Value / Range("C" & gyo).Value
> Select Case kaitenritsu
> Case Is > 3
> Range("E" & gyo).Value = "A"
> Case Is > 2
> Range("E" & gyo).Value = "B"
> Case Is > 1
> Range("E" & gyo).Value = "C"
> Case Is > 0
> Range("E" & gyo).Value = "D"
> End Select
> Else
> Range("E" & gyo).Value = "在庫ゼロ"
> End If
> Next
> End Sub
> > もっとリライトできますが、まずはこのくらいで。 > > > 小川慶一さん: > > > > お世話になります。コードは以下の通りです。 > > また、Excelの画面とVBAの画面を並列したものを添付いたします。 > > よろしくお願いします。 > > Sub zaiko() > > Dim gyo > > For gyo = 2 To 10 > > If Range("D" & gyo).Value > 3 Then > > Range("E" & gyo).Value = "A" > > ElseIf Range("D" & gyo).Value > 2 Then > > Range("E" & gyo).Value = "B" > > ElseIf Range("D" & gyo).Value > 1 Then > > Range("E" & gyo).Value = "C" > > ElseIf Range("D" & gyo).Value > 0 Then > > Range("E" & gyo).Value = "D" > > ElseIf Range("D" & gyo).Value = "#DIV/0!" Then > > Range("E" & gyo).Value = "在庫ゼロ" > > End If > > > > Next > > > > End Sub > >
Option Explicit
'【VBAでの原則を整理します】
'[1] OK: 数値 を 等号 で比較 例: kingaku = 500
'[2] OK: 数値 を 不等号 で比較 例: kingaku > 500
'[3] OK: 文字列を 等号 で比較 例: kingaku = "金額"
'[4] NG: 文字列を 不等号 で比較 例: kingaku = "りんご"
'VBAのIf文では[4]のような式はエラーになります。
'ただし、エクセルのIF関数は、[4]に対してもエラーになりません。
'エクセルのIF関数は、[4]のような比較をするとき、文字列の文字コードを比較します
Sub is_grape()
'文字列は等号で比較できる
'※エクセル関数でもVBAと同様の挙動
Dim gyo
For gyo = 2 To 12
If Range("B" & gyo).Value = "ぶどう" Then
Range("G" & gyo).Value = "そうです"
Else
Range("G" & gyo).Value = "違います"
End If
Next
End Sub
Sub larger_than_grape()
'文字列は不等号では比較できない
'そもそも何をもってして文字列を「大きい」、「小さい」と評するのか?
'※エクセル関数では、VBAとは違う挙動
' すなわち、無理やり文字コードを比較して結果を出力
' セルD1, H1のコメント、D列に埋め込まれた関数式も参照のこと
Dim gyo
For gyo = 2 To 12
If Range("B" & gyo).Value > "ぶどう" Then
Range("H" & gyo).Value = "「大きい」"
Else
Range("H" & gyo).Value = "「大き」くない"
End If
Next
End Sub
Sub code_of_the_first_character()
'数値は不等号で比較できる
'たとえば以下は先頭1文字の文字コードを比較
Dim gyo
Dim sento
Dim code
For gyo = 2 To 12
sento = Left(Range("B" & gyo).Value, 1)
code = Asc(sento)
If code >= -32044 Then 'なぜVBAでは「ぶ」が-32044なのかの説明は省略
Range("I" & gyo).Value = "ぶどうの「ぶ」かそれ以上"
Else
Range("I" & gyo).Value = "文字コード若い"
End If
Next
End Sub
Sub name_length_more_or_equal_to_4()
'数値は不等号で比較できる
'ここでは、文字列の長さを比較
Dim gyo
For gyo = 2 To 12
If Len(Range("B" & gyo).Value) >= 4 Then
Range("J" & gyo).Value = "4文字以上"
Else
Range("J" & gyo).Value = "短い"
End If
Next
End Sub
Sub zaiko_more_or_equal_to_5()
Dim gyo
For gyo = 2 To 12
If Range("C" & gyo).Value >= 5 Then
Range("K" & gyo).Value = "大量在庫"
Else
Range("K" & gyo).Value = "要発注"
End If
Next
End Sub
Sub zaiko__equal_to_5()
Dim gyo
For gyo = 2 To 12
If Range("C" & gyo).Value = 5 Then
Range("L" & gyo).Value = "適正在庫"
Else
Range("L" & gyo).Value = "在庫数に不満"
End If
Next
End Sub
受講生さんの投稿
(投稿ID: 4633)
早速実務でも使ってみました。
在庫回転率(売上原価÷期末在庫)
3以上=”A”
2以上="B"
1以上="C"
1未満="D"
#DIV/0!="在庫ゼロ"
と表示させたいと思いました。
数値になっている部分は、条件分岐しても問題なく動くのですが、
#DIV/0!は「実行値エラー"13" 型が一致しません」の通知がきて、
動きがそこで止まってしまいます。
(#DIV/0!は” ”で囲っています。囲わない場合赤字になりました。)
エラー値の場合、何か特別の処理をしなくてはならないのでしょうか?
(急ぎではないので、以降の講座で出てくるのであれば、その際に学習します。)
小川慶一さんのコメント
(コメントID: 6413)
こんにちは。
書いたマクロを貼り付けていただけますか。コード全体を見ないと分からなそうです。
よろしくお願いいたします。
> 条件分岐構文(If_ Then_Elseif_ End if とFor_ Nextの組み合わせ)で1点質問です。
> 早速実務でも使ってみました。
> 在庫回転率(売上原価÷期末在庫)
> 3以上=”A”
> 2以上="B"
> 1以上="C"
> 1未満="D"
> #DIV/0!="在庫ゼロ"
> と表示させたいと思いました。
> 数値になっている部分は、条件分岐しても問題なく動くのですが、
> #DIV/0!は「実行値エラー"13" 型が一致しません」の通知がきて、
> 動きがそこで止まってしまいます。
> (#DIV/0!は” ”で囲っています。囲わない場合赤字になりました。)
> エラー値の場合、何か特別の処理をしなくてはならないのでしょうか?
> (急ぎではないので、以降の講座で出てくるのであれば、その際に学習します。)
受講生さんのコメント
(コメントID: 6414) 添付ファイルのダウンロード権限がありません
> 受講生 さん:
>
> こんにちは。
> 書いたマクロを貼り付けていただけますか。コード全体を見ないと分からなそうです。
> よろしくお願いいたします。
>
>
> > 条件分岐構文(If_ Then_Elseif_ End if とFor_ Nextの組み合わせ)で1点質問です。
> > 早速実務でも使ってみました。
> > 在庫回転率(売上原価÷期末在庫)
> > 3以上=”A”
> > 2以上="B"
> > 1以上="C"
> > 1未満="D"
> > #DIV/0!="在庫ゼロ"
> > と表示させたいと思いました。
> > 数値になっている部分は、条件分岐しても問題なく動くのですが、
> > #DIV/0!は「実行値エラー"13" 型が一致しません」の通知がきて、
> > 動きがそこで止まってしまいます。
> > (#DIV/0!は” ”で囲っています。囲わない場合赤字になりました。)
> > エラー値の場合、何か特別の処理をしなくてはならないのでしょうか?
> > (急ぎではないので、以降の講座で出てくるのであれば、その際に学習します。)
お世話になります。コードは以下の通りです。
また、Excelの画面とVBAの画面を並列したものを添付いたします。
よろしくお願いします。
小川慶一さんのコメント
(コメントID: 6415)
なるほど。
興味深いですね。
不等号で比較できるのは数値同士です。
エラーになった箇所では、右辺は数値でしたが、左辺は数値ではありませんでした。
エラーが出てしまったのは、そのためです。
..と、受講生さんならこの説明で通じるかなと思うのですが。どうでしょう?
参考になりそうなプログラムを4つ用意しました。
まず、いただいたエクセルファイル上で以下の4つのプログラムを実行してみてください。
hikaku_test1は最後まで実行できます。あとの3つはいずれも最後までいけません。
いたたいたプログラムでは、hikaku_test4 と同じことが起こっています。
エラーになった箇所では、右辺は数値でしたが、左辺は数値ではありませんでした。
なお、いただいたプログラム、僕なら、エクセル関数とマクロという2つの「P」(*DPR講座参照 https://www.exvba.com/dpr.php)が登場するのを嫌って以下のように書くと思います。
(そもそもD列のセルに式を埋め込まない)
もっとも、これでも、0で割り算するときに生じる問題を解決できません。
ということで、最終形態に近い形は以下。
上に示したコードで、[*1]-[*2]は以下のように書き換えられます。
If ... ElseIf ... ElseIf ... で比較対象が同じ場合はこう書いたほうがすっきりします。発展編1レベル。
もっとリライトできますが、まずはこのくらいで。
> 小川慶一さん:
>
> お世話になります。コードは以下の通りです。
> また、Excelの画面とVBAの画面を並列したものを添付いたします。
> よろしくお願いします。
> Sub zaiko()
> Dim gyo
> For gyo = 2 To 10
> If Range("D" & gyo).Value > 3 Then
> Range("E" & gyo).Value = "A"
> ElseIf Range("D" & gyo).Value > 2 Then
> Range("E" & gyo).Value = "B"
> ElseIf Range("D" & gyo).Value > 1 Then
> Range("E" & gyo).Value = "C"
> ElseIf Range("D" & gyo).Value > 0 Then
> Range("E" & gyo).Value = "D"
> ElseIf Range("D" & gyo).Value = "#DIV/0!" Then
> Range("E" & gyo).Value = "在庫ゼロ"
> End If
>
> Next
>
> End Sub
>
受講生さんのコメント
(コメントID: 6416) 添付ファイルのダウンロード権限がありません
> 受講生 さん:
>
> なるほど。
> 興味深いですね。
>
> 不等号で比較できるのは数値同士です。
> エラーになった箇所では、右辺は数値でしたが、左辺は数値ではありませんでした。
>
> エラーが出てしまったのは、そのためです。
> ..と、受講生さんならこの説明で通じるかなと思うのですが。どうでしょう?
>
> 参考になりそうなプログラムを4つ用意しました。
>
> まず、いただいたエクセルファイル上で以下の4つのプログラムを実行してみてください。
> hikaku_test1は最後まで実行できます。あとの3つはいずれも最後までいけません。
>
>
>
> いたたいたプログラムでは、hikaku_test4 と同じことが起こっています。
> エラーになった箇所では、右辺は数値でしたが、左辺は数値ではありませんでした。
>
> なお、いただいたプログラム、僕なら、エクセル関数とマクロという2つの「P」(*DPR講座参照 https://www.exvba.com/dpr.php)が登場するのを嫌って以下のように書くと思います。
> (そもそもD列のセルに式を埋め込まない)
>
>
>
> もっとも、これでも、0で割り算するときに生じる問題を解決できません。
> ということで、最終形態に近い形は以下。
>
>
>
> 上に示したコードで、[*1]-[*2]は以下のように書き換えられます。
> If ... ElseIf ... ElseIf ... で比較対象が同じ場合はこう書いたほうがすっきりします。発展編1レベル。
>
>
>
> もっとリライトできますが、まずはこのくらいで。
>
> > 小川慶一さん:
> >
> > お世話になります。コードは以下の通りです。
> > また、Excelの画面とVBAの画面を並列したものを添付いたします。
> > よろしくお願いします。
> > Sub zaiko()
> > Dim gyo
> > For gyo = 2 To 10
> > If Range("D" & gyo).Value > 3 Then
> > Range("E" & gyo).Value = "A"
> > ElseIf Range("D" & gyo).Value > 2 Then
> > Range("E" & gyo).Value = "B"
> > ElseIf Range("D" & gyo).Value > 1 Then
> > Range("E" & gyo).Value = "C"
> > ElseIf Range("D" & gyo).Value > 0 Then
> > Range("E" & gyo).Value = "D"
> > ElseIf Range("D" & gyo).Value = "#DIV/0!" Then
> > Range("E" & gyo).Value = "在庫ゼロ"
> > End If
> >
> > Next
> >
> > End Sub
> >
小川慶一さん:
非常に詳しいご説明、ありがとうございました。
> 不等号で比較できるのは数値同士です。
確かに!と思いました。
おそらく、IF関数で、文字列A2が「りんご」だったらB2は「〇」というようなことを実務でやっていたので、その延長線上で考えていたのですね。(画像添付します。)IF関数だと文字列を「=」で表現しても結果が出てたので同じことができるだろう、と思ってました。
また、変数の中に割り算を埋め込むという考え方があるのか!と驚きました。
フォローアップベーシックまできて、急に難易度が上がって、復習しつつのため、進捗は遅くなってますが、色々なことができることがわかって、楽しいです。一歩一歩着実に、理解しながら進めていきます。
引き続きよろしくお願いします。
小川慶一さんのコメント
(コメントID: 6417)
> また、変数の中に割り算を埋め込むという考え方があるのか!と驚きました。
変数に埋め込んでいるのは「割り算」ではなく、「割り算の計算結果」です。
以下の動画(と、その周辺の動画)で復習してください。5:00をすぎたところでそう説明しています。
○基礎講座第1章8 - 変数を使ったプログラム、変数を使う意義
https://forum.pc5bai.com/lesson/page/104?t=1582471557
数値、文字列の比較演算についてまとめてみました。
サンプルファイルもダウンロード可能な場所に置きました。
G-L列の値を消してマクロを実行してみてください。
https://www.dropbox.com/s/x0r5bswlrv73811/200223.xlsm?dl=0
> 小川慶一さん:
> 非常に詳しいご説明、ありがとうございました。
> > 不等号で比較できるのは数値同士です。
> 確かに!と思いました。
> おそらく、IF関数で、文字列A2が「りんご」だったらB2は「〇」というようなことを実務でやっていたので、その延長線上で考えていたのですね。(画像添付します。)IF関数だと文字列を「=」で表現しても結果が出てたので同じことができるだろう、と思ってました。
> また、変数の中に割り算を埋め込むという考え方があるのか!と驚きました。
> フォローアップベーシックまできて、急に難易度が上がって、復習しつつのため、進捗は遅くなってますが、色々なことができることがわかって、楽しいです。一歩一歩着実に、理解しながら進めていきます。
> 引き続きよろしくお願いします。
受講生さんのコメント
(コメントID: 6419)
> 受講生 さん:
>
> > また、変数の中に割り算を埋め込むという考え方があるのか!と驚きました。
>
> 変数に埋め込んでいるのは「割り算」ではなく、「割り算の計算結果」です。
> 以下の動画(と、その周辺の動画)で復習してください。5:00をすぎたところでそう説明しています。
>
> ○基礎講座第1章8 - 変数を使ったプログラム、変数を使う意義
> https://forum.pc5bai.com/lesson/page/104?t=1582471557
>
>
> 数値、文字列の比較演算についてまとめてみました。
>
>
>
> サンプルファイルもダウンロード可能な場所に置きました。
>
> G-L列の値を消してマクロを実行してみてください。
> https://www.dropbox.com/s/x0r5bswlrv73811/200223.xlsm?dl=0
>
>
> > 小川慶一さん:
> > 非常に詳しいご説明、ありがとうございました。
> > > 不等号で比較できるのは数値同士です。
> > 確かに!と思いました。
> > おそらく、IF関数で、文字列A2が「りんご」だったらB2は「〇」というようなことを実務でやっていたので、その延長線上で考えていたのですね。(画像添付します。)IF関数だと文字列を「=」で表現しても結果が出てたので同じことができるだろう、と思ってました。
> > また、変数の中に割り算を埋め込むという考え方があるのか!と驚きました。
> > フォローアップベーシックまできて、急に難易度が上がって、復習しつつのため、進捗は遅くなってますが、色々なことができることがわかって、楽しいです。一歩一歩着実に、理解しながら進めていきます。
> > 引き続きよろしくお願いします。
>
小川慶一さん:
>変数に埋め込んでいるのは「割り算」ではなく、「割り算の計算結果」です。
>以下の動画(と、その周辺の動画)で復習してください。5:00をすぎたところでそう説明しています。
おっしゃる通りです。小人さんの動画でちゃんとご説明いただいてますね。その時はわかったつもりで、まだ身についていなかったのですね。
きちんと復習します。
また、詳細なパターンでのご説明ありがとうございました。
実行してみて、コードの書き方次第で、様々な結果を出せることに
驚いております。
文字列と文字コードの違いなど、奥が深いなと思いました。
地道に各コードの意味を理解しながら身に着けていき、
実務でも使えるように
していきたいと思います。
小川慶一さんのコメント
(コメントID: 6420)
> おっしゃる通りです。小人さんの動画でちゃんとご説明いただいてますね。その時はわかったつもりで、まだ身についていなかったのですね。
一度説明されたくらいですべて理解できるようなら、エクセルマクロは誰でもモノにできるようなスキルでしょう。
知識と体験がついてからでないと気づけないことも多くあります。
地図を見るにしても、一度も行ったことのないところの地図を見るのと、一度行ったことがあるところの地図を読むのでは違いますね。それと同じです。
基礎編フォローアップベーシックは、何度も復習するとよいです。
そのたびに受講生さんの頭の中のマクロについての地図がさらに整理されていくものと思います。
演習を解くことは体験です。そのうえで解説を復習することで知識が強化されていきます。
> 小川慶一さん:
> >変数に埋め込んでいるのは「割り算」ではなく、「割り算の計算結果」です。
> >以下の動画(と、その周辺の動画)で復習してください。5:00をすぎたところでそう説明しています。
> おっしゃる通りです。小人さんの動画でちゃんとご説明いただいてますね。その時はわかったつもりで、まだ身についていなかったのですね。
> きちんと復習します。
> また、詳細なパターンでのご説明ありがとうございました。
> 実行してみて、コードの書き方次第で、様々な結果を出せることに
> 驚いております。
> 文字列と文字コードの違いなど、奥が深いなと思いました。
> 地道に各コードの意味を理解しながら身に着けていき、
> 実務でも使えるように
> していきたいと思います。