5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
受講生さんの投稿
(投稿ID: 4984)
Range("A6").Value = Len(Range("A1").Value)を
Range("A6").Value = Len(Range("A1"))と
.Valueを省略しても良いでしょうか?
試してみたら答えは同じだったので。
小川 慶一さんのコメント
(コメントID: 7087)
こんにちは。
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」まで書ききるようにしたほうが良いと僕は考えます。
参考にしていただければと思います。
受講生さんのコメント
(コメントID: 7089)
「セルA1の値」と言うように指示をするということですね。理解できたのですが、屁理屈になってしまいますが
”東京都”といった文字列の場合には 「”東京都”の文字列の長さの値」ということにならないのですね。.Valueを入力したら構文エラーになってしまいました。
その違いはオブジェクトか文字列かと言うことでしょうか?
小川 慶一さんのコメント
(コメントID: 7090)
> 屁理屈になってしまいますが
大丈夫ですよ。
「この値なりオブジェクトなりを取り出すとき、このプログラミング言語では、どうしてこういう構文になるだろう」と考えることも大切です。
> その違いはオブジェクトか文字列かと言うことでしょうか?
発展編1で「データ」と「オブジェクト」という話をします。
「オブジェクト」と言うと、「Workbooks("Book1")」のようなワークシート(エクセルファイル)、「Worksheets("Sheet1")」のようなシート、「Range("A1")」のようなセルが例として挙げられます。
これらは、プロパティを持ちます。
オブジェクトのプロパティを取得する際は、「オブジェクト.プロパティ」という構文で表現します。
ここまでは、導入編~基礎編の第1章でお話したとおりです。
一方、改めて説明してはいませんでしたが、エクセルVBAで、「データ」とは、「3」とか「5.1」のような数字、「#2021/01/13#」のような日付、「"こんにちは"」のような文字列です。
これらは、プロパティを持ちません。
ですが、第1章で紹介した「演算子」で演算ができます。(EnzanSample参照)
また、第2章で紹介した「関数」では、引数にデータを渡して演算ができます(*1)。(FuncSample参照)
(*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
受講生さんのコメント
(コメントID: 7098)
言語の仕様によって”文字列”が[オブジェクト」になるか「データ」になるかということですね。
エクセルマクロVBAでは「データ」となりオブジェクトのプロパティを持たないからということですね。
ありがとうございました。
小川 慶一さんのコメント
(コメントID: 7099)
こんばんは。
> エクセルマクロVBAでは「データ」となりオブジェクトのプロパティを持たないからということですね。
そうですね。
また、何かあれば、気軽にご質問ください。