
【この動画で使用する教材ファイル】
・Kiso03.xls
・kiso_mm_movie.pdf(P9:関数リファレンス)
※講座内で使用する資料は、この個別ページ内でダウンロードできます。
この講座を含む定額コースに参加するか、この講座を購入することで、講座を利用できるようになります。
定額コースに参加すると、そのコースの利用期間中はいつでも講座を利用できます。
講座を購入すると、いつでも講座を利用できます。
このページへの投稿/コメント
Range("A6").Value = Len(Range("A1").Value)を
Range("A6").Value = Len(Range("A1"))と
.Valueを省略しても良いでしょうか?
試してみたら答えは同じだったので。
こんにちは。
Range("A1").Value : セルA1の、値
Range("A1") : セルA1
です。
言葉の意味が異なります。
Range("A6").Value = Len(Range("A1"))
↑のような書き方ですと、このプログラ手順書(手順書)を読んだ「エクセルの中のこびとちゃん」が、
「Range("A1")」て書いてあるけど、セルA1の、『値』が欲しいんだろうな~」と、プログラムを書いた人の意を汲んで、「セルA1」ではなく、「セルA1の、値」を取り出して処理をしてくれます。
ですが、これは、「きちんと書かなくても、相手がこちらの意を汲んで解釈してくれるだろう」ということに期待した、雑な書き方です。
実は、基礎編レベルでは気にしなくても大丈夫ですが、発展編1レベルまで学習が進むと、
Range("A1").Value : セルA1の、値
Range("A1") : セルA1
という違いが重要な意味を持つようになります。
Range("A1")
という書き方で動いているからと言って、普段から、「セルA1の、値」を指定しているのか、「セルA1」を指定しているのかということへの意識づけをなおざりにしたままで学習を進めると、発展編1レベルまで学習が進んだときに、理解が追いつかなくなってしまう可能性があがります。
ということで:
・「セルA1の、値」という言葉の意味を考えると、 .Value をつけるのが本来ふさわしい
・「言葉の意味の違い」を日頃から意識していないと、先々の学習でそのツケを払うことになる
・「読者がこちらの意を汲んでくれるだろう」という期待で雑な手順書を書くことは好ましくない
上記の理由から、たとえ「セルA1の、値」を指定せずとも「セルA1」を指定しただけで「セルA1の、値」を取り出せるとしても、「セルA1の、値」を取り出すときには、普段から「Range("A1").Value」というように、「.Value」まで書ききるようにしたほうが良いと僕は考えます。
参考にしていただければと思います。
ありがとうございます。理解できました。「セルA1の値」
> 受講生 さん:
>
> こんにちは。
>
> Range("A1").Value : セルA1の、値
> Range("A1") : セルA1
>
> です。
> 言葉の意味が異なります。
>
> Range("A6").Value = Len(Range("A1"))
>
> ↑のような書き方ですと、このプログラ手順書(手順書)を読んだ「エクセルの中のこびとちゃん」が、
>
> 「Range("A1")」て書いてあるけど、セルA1の、『値』が欲しいんだろうな~」と、プログラムを書いた人の意を汲んで、「セルA1」ではなく、「セルA1の、値」を取り出して処理をしてくれます。
>
> ですが、これは、「きちんと書かなくても、相手がこちらの意を汲んで解釈してくれるだろう」ということに期待した、雑な書き方です。
>
> 実は、基礎編レベルでは気にしなくても大丈夫ですが、発展編1レベルまで学習が進むと、
>
> Range("A1").Value : セルA1の、値
> Range("A1") : セルA1
>
> という違いが重要な意味を持つようになります。
>
> Range("A1")
>
> という書き方で動いているからと言って、普段から、「セルA1の、値」を指定しているのか、「セルA1」を指定しているのかということへの意識づけをなおざりにしたままで学習を進めると、発展編1レベルまで学習が進んだときに、理解が追いつかなくなってしまう可能性があがります。
>
> ということで:
> ・「セルA1の、値」という言葉の意味を考えると、 .Value をつけるのが本来ふさわしい
> ・「言葉の意味の違い」を日頃から意識していないと、先々の学習でそのツケを払うことになる
> ・「読者がこちらの意を汲んでくれるだろう」という期待で雑な手順書を書くことは好ましくない
>
> 上記の理由から、たとえ「セルA1の、値」を指定せずとも「セルA1」を指定しただけで「セルA1の、値」を取り出せるとしても、「セルA1の、値」を取り出すときには、普段から「Range("A1").Value」というように、「.Value」まで書ききるようにしたほうが良いと僕は考えます。
>
> 参考にしていただければと思います。
「セルA1の値」と言うように指示をするということですね。理解できたのですが、屁理屈になってしまいますが
”東京都”といった文字列の場合には 「”東京都”の文字列の長さの値」ということにならないのですね。.Valueを入力したら構文エラーになってしまいました。
その違いはオブジェクトか文字列かと言うことでしょうか?
> 受講生 さん:
>
> こんにちは。
>
> Range("A1").Value : セルA1の、値
> Range("A1") : セルA1
>
> です。
> 言葉の意味が異なります。
>
> Range("A6").Value = Len(Range("A1"))
>
> ↑のような書き方ですと、このプログラ手順書(手順書)を読んだ「エクセルの中のこびとちゃん」が、
>
> 「Range("A1")」て書いてあるけど、セルA1の、『値』が欲しいんだろうな~」と、プログラムを書いた人の意を汲んで、「セルA1」ではなく、「セルA1の、値」を取り出して処理をしてくれます。
>
> ですが、これは、「きちんと書かなくても、相手がこちらの意を汲んで解釈してくれるだろう」ということに期待した、雑な書き方です。
>
> 実は、基礎編レベルでは気にしなくても大丈夫ですが、発展編1レベルまで学習が進むと、
>
> Range("A1").Value : セルA1の、値
> Range("A1") : セルA1
>
> という違いが重要な意味を持つようになります。
>
> Range("A1")
>
> という書き方で動いているからと言って、普段から、「セルA1の、値」を指定しているのか、「セルA1」を指定しているのかということへの意識づけをなおざりにしたままで学習を進めると、発展編1レベルまで学習が進んだときに、理解が追いつかなくなってしまう可能性があがります。
>
> ということで:
> ・「セルA1の、値」という言葉の意味を考えると、 .Value をつけるのが本来ふさわしい
> ・「言葉の意味の違い」を日頃から意識していないと、先々の学習でそのツケを払うことになる
> ・「読者がこちらの意を汲んでくれるだろう」という期待で雑な手順書を書くことは好ましくない
>
> 上記の理由から、たとえ「セルA1の、値」を指定せずとも「セルA1」を指定しただけで「セルA1の、値」を取り出せるとしても、「セルA1の、値」を取り出すときには、普段から「Range("A1").Value」というように、「.Value」まで書ききるようにしたほうが良いと僕は考えます。
>
> 参考にしていただければと思います。
> 屁理屈になってしまいますが
大丈夫ですよ。
「この値なりオブジェクトなりを取り出すとき、このプログラミング言語では、どうしてこういう構文になるだろう」と考えることも大切です。
> その違いはオブジェクトか文字列かと言うことでしょうか?
発展編1で「データ」と「オブジェクト」という話をします。
「オブジェクト」と言うと、「Workbooks("Book1")」のようなワークシート(エクセルファイル)、「Worksheets("Sheet1")」のようなシート、「Range("A1")」のようなセルが例として挙げられます。
これらは、プロパティを持ちます。
オブジェクトのプロパティを取得する際は、「オブジェクト.プロパティ」という構文で表現します。
ここまでは、導入編~基礎編の第1章でお話したとおりです。
一方、改めて説明してはいませんでしたが、エクセルVBAで、「データ」とは、「3」とか「5.1」のような数字、「#2021/01/13#」のような日付、「"こんにちは"」のような文字列です。
これらは、プロパティを持ちません。
ですが、第1章で紹介した「演算子」で演算ができます。(EnzanSample参照)
また、第2章で紹介した「関数」では、引数にデータを渡して演算ができます(*1)。(FuncSample参照)
Sub EnzanSample()
Range("B1").Value = 3 + 5.1 '8.1 を得ます
Range("B2").Value = 3 * 5.1 '15.3 を得ます
Range("B3").Value = 3 & 5.1 '"35.1" を得ます
Range("B4").Value = "東京都" & "文京区" '"東京都文京区" を得ます
End Sub
Sub FuncSample()
Range("C1").Value = Int(5.7) '整数部分を取り出す関数。 5 を得ます
Range("C2").Value = Abs(-5.7) '絶対値を取り出す関数。 5.7 を得ます
Range("C3").Value = Sqr(16) '平方根を取り出す関数。 4 を得ます
Range("C4").Value = Left("東京都", 2) '"東京" を得ます
Range("C5").Value = Replace("東京都", "京都", "大阪") '"東大阪" を得ます
Range("C6").Value = Len("東京都") '3 を得ます
End Sub
(*1)引数にオブジェクトを受け取って演算し、戻り値としてオブジェクトを返す関数もあります。ですが、基礎編レベルを大きく超えてしまうので、ここではその説明は省略します。
なお、「『"東京都"の長さ』というような書き方ができないものだろうか」という疑問はごもっともです。
実は、プログラミング言語の中には、そういう書き方ができる言語もあります。
以下は、「JavaScript」という言語の例。
文字列は、モロに「オブジェクト」です。
"文字列".length というプロパティが存在します。エクセルVBAのMid関数のような処理は、.substr によって、行います。
<script>
const nagasa = "東京都文京区".length
alert(nagasa) // 6 とメッセージボックスに表示される
const naka = "東京都文京区".substr(3, 2)
alert(naka) // "文京" とメッセージボックスに表示される
</script>
以下は、「Python」という言語の例。
文字列は、「リスト」です。(「リスト」とは何か?という話は割愛)
文字列の長さを取得する関数として len 関数があります。一方、文字列の一部を取り出すには、JavaScriptとはまた異なる書き方をします。
nagasa = len("東京都文京区")
print(nagasa) # 6 と出力されます
naka = "東京都文京区"[3:5]
print(naka) # 文京 と出力されます
冒頭、「『この値なりオブジェクトなりを取り出すとき、このプログラミング言語では、どうしてこういう構文になるだろう』と考えることは大切」と書きました。
それを決めるのは、そのプログラミング言語を作った人たちです。
彼らは、「どんな目的で、どんな人が書く」ということを想定してその言語を作ります。
そのとき、それぞれの言語を作った人たちが、「世界をどう切り出すと、書き手にとって都合良いだろうか」と考えて試した結果がそれぞれの言語の仕様です。
VB, JavaScript, Pythonそれぞれで仕様が違うのは、それらの言語を作った人たちの「世界の切り出し方」が違うからです。
・VBを作った人たちは、「文字列」という抽象概念を、「データ」という形で切り出して表現した。
・JavaScriptを作った人たちは、「文字列」という抽象概念を「オブジェクト」という形で切り出して表現した。
ということです。
もっとも、「では、文字列の長さを得る方法がいちばん優れている言語はどれだろか」とか、「『文字列』という抽象概念をより上手に切り出して表現できているプログラミング言語はどれだろうか」とか、そういう問いにはあまり意味はありません。
「英語と日本語とロシア語のどれがいちばん○○という点で優れているか」とかいう議論と同じで、比較になじまないです。
プログラムを書くときに使う言語をいったん決めたら、その言語を使うときには、その言語の開発者が決めたやり方に合わせるしかないです。
そして、いったん言語を選択したら、その言語特有の概念や基本構文を整理して理解することが大切です。
そこは、「英語を話すときは、英語の文法に従うよりない」というのと同じです。
ただ、その理解の際、「こういうことを表現したいとき、なんで、この言語では、こういうやり方になるんだろう」といった疑問は当然わきます。
そのとき、単に「とにかく、こう書けばいいんだな」と鵜呑みにするのではなく、その疑問をつきつめようとすることは、とても大切です。
エクセルVBAであれ、英語であれ、言語学習時に湧くそういう疑問に向き合うことは、その言語についての理解を深めるだけでなく、日本語を含めた他の言語を学ぶときの学習能力をつけることにも役立ちます。
参考: エクセルマクロ習得に関係する4つの能力
https://www.exvba.com/4skills.php
言語の仕様によって”文字列”が[オブジェクト」になるか「データ」になるかということですね。
エクセルマクロVBAでは「データ」となりオブジェクトのプロパティを持たないからということですね。
ありがとうございました。
こんばんは。
> エクセルマクロVBAでは「データ」となりオブジェクトのプロパティを持たないからということですね。
そうですね。
また、何かあれば、気軽にご質問ください。
instr関数は、インストリング(InString)、インストア(Instore)、インエスティーアール(inSTR)といろいろ読み方あるみたいですね。
結局使うときはinstrなので、実現される機能は一緒ですが(^^*
僕は、「インストア」と読んでいます。
「インストリング」は、「Instr」である以上、ちょいおかしいかな。
「インエスティーアール」は、「インストア」より音節が多くて言うのが面倒くさい (^^;
VBAでの関数名の由来や読み方については、そんなに神経質になることはないと思います。
参考までに書くと、VBAのInstr関数と同様の機能を実現するにも、言語によって、その実装方法や名称は異なります。
php: strpos関数
java, javascript: indexOfメソッド
python: findメソッド
「メソッド」については発展編1で学びます。
そんな風に言語ごとに違う中、VBAでの実装にやたらこだわる人をたまに見かけます。
たいてい、VBAしか書けなくて、自身のVBAでの経験だけからプログラミングのあり方なりについて論じようとする人たちです... (^^;
> こんにちは。
> instr関数は、インストリング(InString)、インストア(Instore)、インエスティーアール(inSTR)といろいろ読み方あるみたいですね。
> 結局使うときはinstrなので、実現される機能は一緒ですが(^^*
確かに自分でやってみると、わかるし、マクロの練習にもなるし、理解も深まります。解説を読むと、よりマスターが早まりますね。
> 確かに自分でやってみると、わかるし、マクロの練習にもなるし、理解も深まります。
ですね。
理系科目は、自分で仮説を立てて実験検証するのがいちばん力になります。というか、実務でマクロを書くとなったらどのみち、教科書にならないような部分について「仮説を立てて実験検証する」というステップを避けられません。そのための事前練習にもなりますね (^^*
・InStr関数 は引数の中で指定された引数が左から数えて何文字目にあるかを返す
指定された引数(文字列)がない場合は0を返す
次はドリルだ!理解を深めるぞ!
こちらも、よくまとまっていますね☆
> ・Len関数 は引数の文字数を返す
> ・InStr関数 は引数の中で指定された引数が左から数えて何文字目にあるかを返す
> 指定された引数(文字列)がない場合は0を返す
> 次はドリルだ!理解を深めるぞ!
どんどん学んでください!
>理解できました。
引数の意味がよくわかりません。英語でParameterとありました。ウェキペディアで調べましたが、よく飲み込めません(´□`)
>引数の意味がよくわかりません。
「意味」では分かりません。
何がわからないのか、もう少し詳しく教えて。概念が分からない?ようでしたら、具体例をたくさん見て、実際に書いて、としていってください。
手書きドリルもお渡ししていますので、あれも手を動かしてしっかりやって。
そのうえで、また質問してください。
>Find関数 と Instr関数の違いは何とか理解できましたが、
>引数の意味がよくわかりません。英語でParameterとありました。ウェキペディアで調べましたが、よく飲み込めません(´□`)
試してみた結果ですが、Len関数は、「半角・全角どちらでも1文字としてカウントする。スペースもカウントされる」と理解してよろしいでしょうか?
OKです。
ついでに言うと(匿名さんはご存知とは思いますが)、全角スペースも1文字と数えます(ときどき、「全角スペースだけは2文字」と何故か思われている方もいらっしゃるので。。)
>小川先生
>試してみた結果ですが、Len関数は、「半角・全角どちらでも1文字としてカウントする。スペースもカウントされる」と理解してよろしいでしょうか?
学習記録としてメモを残す
※メモを残すにはこの講座の利用権限が必要です。