5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
受講生さんの投稿
(投稿ID: 5562)
理解が追いついていないところがあります。left mid right関数で返ってくるこたえは、文字列とのことですが、例えばright (“渋谷区渋谷3-2-3”,1)と入力すると3がセルに入り、扱いも数字でした。それでも、文字列が返されると覚えておいた方がいいでしょうか?
小川 慶一さんのコメント
(コメントID: 8426)
> 文字列が返されると覚えておいた方がいいでしょうか?
はい、そのように覚えておいてください (^^
***
以下、いろいろサンプルコードを動かしながら、この結論を補足していこうかと。
先に、これからする話の結論をお伝えしておきます。
1. セルに入った値では、エクセルマクロ内で演算した結果が数値なのか文字列なのかは判断できない
2. エクセルマクロ内で + や & の演算をできたからと言って、「数値型だろう」とか「文字列型だろう」とか決めつけることはできない
3. エクセルVBA内で扱われる値の型を調べるには、 TypeName 関数を使う
そして、いただいた質問文に対しては、上記 1, 2, 3 より、以下のとおりご回答します。
◯ left mid right関数で返ってくる文字列が返されると覚えておいた方がいい(覚えておくべき)
◯ right (“渋谷区渋谷3-2-3”,1)と入力すると3がセルに入ったのは、エクセルシートの仕様上の問題
◯ 「扱いも数字」だったのは、エクセルまたはエクセルVBAの仕様
***
以下は、上記の結論にたどりつくまでのロードマップです。
sample1, sample2, sample3 は、エクセルVBA初心者の方がやりがちな調査方法での調査です。
いずれの方法でも、 Right 関数の戻り値が数値なのか文字列なのかを判断できません。
つづけて、 typename_sample で、解決策を示します。(中級者向けの解決策です)
その後、上記の結論をもう一度示します。
最後の hosoku1, hosoku2 は、初級者向けの情報ではないので、読むとかえって混乱してしまうかもしれませんが...時間をかけて理解していってほしいなという内容です。
***
まずは、 3 と "3" との挙動を比較してみましょう。
前者は数値、後者は文字列です。
上記のとおりなので、セルに結果的に入った値を見ても、Right("渋谷区渋谷3-2-3", 1) の戻り値が数値なのか文字列なのかは判断できません。
では、足し算や結合演算をすれば、分かるでしょうか?
残念ながら、それも難しいです。
なぜなら、以下の sample2, sample3 に示すとおり、エクセルVBAでの + 演算や & 演算の挙動はアバウトだからです。
「足し算できたから文字列ではない」とは言えません。 + 演算子は、その左右のどちらかが文字列であっても、数値であるかのように加算演算をしてくれます(*1)。
上記のとおりなので、数値との足し算の結果をセルに埋め込んでも、 Right("渋谷区渋谷3-2-3", 1) の戻り値が数値なのか文字列なのかは判断できません。
参考までに、以下は、 & 演算子の場合です。
さて、では、 Right("渋谷区渋谷3-2-3", 1) で得られる戻り値が 3 なのか "3" なのかということを調べる方法はないのか?ということですが...。
実は、 TypeName 関数というものがあり、これを使って「データの型」を調べることができます。
(TypeName 関数についは、基礎編では扱っていません。データの型については、発展編1で詳しく学びます)
ということで、 TypeName 関数を使っでデータの型を調べてみましょう。
上記により、ようやく、 Right("渋谷区渋谷3-2-3", 1) の戻り値は文字列だということがわかりました。
ということで、まとめです:
1. セルに入った値では、エクセルマクロ内で演算した結果が数値なのか文字列なのかは判断できない
- エクセルシートがそういう仕様だから
2. エクセルマクロ内で + や & の演算をできたからと言って、「数値型だろう」とか「文字列型だろう」とか決めつけることはできない
- エクセルVBAの演算子は型に対して厳格ではないから
3. エクセルVBA内で扱われる値の型を調べるには、 TypeName 関数を使う
- 未修事項なのでこれは知らなくて仕方ないです。発展編1での学習を楽しみにしていてください。
そして、いただいた質問文に対しては、上記 1, 2, 3 より、以下のとおりご回答します。
◯ left mid right関数で返ってくる文字列が返されると覚えておいた方がいい(覚えておくべき)
◯ right (“渋谷区渋谷3-2-3”,1)と入力すると3がセルに入ったのは、エクセルシートの仕様上の問題
◯ 「扱いも数字」だったのは、エクセルまたはエクセルVBAの仕様:
- シート上であればすでに数値の 3 とみなされた値が入っているで数値演算に利用できて当然
- エクセルVBAのコード内でも、 + 演算子の数値演算用の演算子は文字列のことも無理やり数値とみなして演算してくれるから
ということで。ここまで、いかがでしょうか。
***
上記ご理解いただいたうえで...最後にひとつだけ、補足情報を出しておきます。
「+ 演算子は、その左右のどちらかが文字列であっても、数値であるかのように加算演算をしてくれます(*1)」と、さりげない書き方をしましたが...。
実は、 + 演算子は、ちょっと特殊でして、「どちらかが文字列であっても、数値であるかのように加算演算をしてくれる」のですが、両方が文字列であった場合は、結合演算子として機能します(*2)。
ですので、以下のような演算結果を得る可能性もあります
(*2) については「どうしてそうなのか?」と聞かれるとちょっと説明に困るのですが...。
ひとことで言うと「Microsoft が、 VBA の言語仕様を決めるときに、そういう挙動でいくと決めたから」です。
もっとも、もうちょっとちゃんと説明するならば、実は、「文字列同士の結合を示す演算子として + を使うプログラミング言語」って、割と多いのです。
JavaScript, Python, ... などなど。
なのでそういう言語に寄せてこういう仕様にしたんじゃないかなと思います。
(僕の個人的な意見としては、VBAでは、 "3" + "4" は 7 を返してくれるほうが潔いと思いますが...)
以上、長文ですが、上にあるサンプルコードから、順番に動かして、説明を読みつつ、学習進めてみてください。
そのうえで、もし分からないところがあった場合は、どのサンプルコードのどこが or どの説明が理解でぎなかったのかお知らせください。
よろしくお願いいたします。
taruwoshiru.105さんのコメント
(コメントID: 8427)
サンプルコードを交えた丁寧な説明ありがとうございます。もはや一つの講義を受けさせていただいた気分です。
一度では理解できなかったので、読み返したり、サンプルコードを動かしてみて、少しはわかったように思います。
うまく説明ができないのですが…
そもそも、文字列はエクセルシート上は、計算できないものと思っていました。エクセルシートのセルの書式設定で標準から文字列に変えてしまったときのように、算術演算子やsum関数で計算できないものが文字列で、計算できるものが数値だと認識していました。
VBAは融通が利いて、文字列でも数値でも計算してくれるけど、一度エクセルシートにうつると、そうはいかない。また、VBAからエクセルシートにうつるときに、これは数値にみえるが文字列であるという情報(?)も反映されると思っていました。
なので、right関数で“3”が文字列としてエクセルシートに反映されるのであれば、計算もできない。計算できるということは、VBAが数値に変換して、エクセルシートに反映させているのではとすら思っていました。
エクセルVBAやエクセルシートの仕様上文字列であっても計算ができ、計算できるかどうかで文字列か数値かの判断はできないということが理解できました。
また、文字列 + 文字列を入力すると、+演算子が結合演算子の動きをするというのは、とても興味深かったです。試しに住所ではなく、10桁の数字で同じようにhosoku2を動かしてみましたが、やはり結演算子の動きが確認できて、とてもおもしろかったです。
また、こういう処理の違いがあるからこそ、right mid left関数で返ってくる値は文字列と覚えておくべきなのだということも理解できました。きっとhosokuで示していただいた処理はほんの一例にすぎないと思うので、今後学習を進めて、理解を深めて行きたいと思います。ありがとうございます。
小川 慶一さんのコメント
(コメントID: 8428)
あらためて、まとめてみますね。以下のとおりに理解してください。
エクセルVBAはエクセルのセルに値を書き込むわけですが、そのとき、セルに 3 と書き込もうとしても、セルに "3" と書き込もうとしても、セルには 3 と書き込まれます。
一方、書き込まれた値をどのように扱うかはエクセルシート上のセルの問題です。
セルの書式が「標準」だった場合は、どちらのケースでもセルには数字の 3 が格納されます。
セルの書式が「文字列」だった場合は、どちらのケースでもセルには文字列の 3 が格納されます。
上記からも分かるとおり、エクセルマクロは、 Range("A1").Value = 3 といった構文では、値を書き込むことしかしません。
(書式にまで干渉しようとはしない)
計算結果の受け手たるエクセル側の挙動、計算結果の渡し手たるエクセルVBAの両方についての学びが必要ですが、それぞれで起きていることを区別し、整理して考える必要があります。
> こういう処理の違いがあるからこそ、right mid left関数で返ってくる値は文字列と覚えておくべきなのだということも
上記の「処理の違い」は、演算子の特性であって、関数の戻り値とは無関係です。
関数はそれぞれ「どんな型の戻り値を返すか」ということが決まっています。
シンプルにそれだけです。
演算子の挙動、関数の挙動の両方についての学びが必要ですが、それぞれで起きていることを区別し、整理して考える必要があります。
個々の機能についてはなるべく単体で理解するようにしてください。
小川 慶一さんのコメント
(コメントID: 8429)
こうやっていただいた質問があって、その質問に対するコメントやりとりがあって、というものの蓄積があとから受講される方の助けになります。
これからも、分からないこと、はっきりしないことなどはどんどん質問してください。
各ページに表示される過去のやりとりからも学べることは多いかと思います。
taruwoshiru.105さんのコメント
(コメントID: 8430)
どうやらいろいろなことをごちゃ混ぜにして理解しようとしていたようです。少し分かったつもりでしたが…
要点を整理して再度説明していただきありがとうございます。
>各ページに表示される過去のやりとりからも学べることは多いかと思います。
おっしゃる通りで、動画を見てから他の方の質問や回答を見ていると、自分では気付けなかった視点から理解が深まりとても勉強になります。これからも参考にさせていただきます。
taruwoshiru.105さんのコメント
(コメントID: 8431)
どうやらいろいろなことをごちゃ混ぜにして理解しようとしていたようです。少し分かったつもりでしたが…
要点を整理して再度説明していただきありがとうございます。
>各ページに表示される過去のやりとりからも学べることは多いかと思います。
おっしゃる通りで、動画を見てから他の方の質問や回答を見ていると、自分では気付けなかった視点から理解が深まりとても勉強になります。これからも参考にさせていただきます。
小川 慶一さんのコメント
(コメントID: 8432)
> 動画を見てから他の方の質問や回答を見ていると、自分では気付けなかった視点から理解が深まり
1周やりきって、演習もやりきってから戻ってくると、またすごく勉強になります。
2周目での気付き、学びにも、楽しみにしていてください (^^*