いつもありがとうございます。 以下のコードですが、セルA1には3という数値が入っている状態で実行するとイミディエイトウインドウで3と表示されます。 Sub hairetu() Dim ary(0) As Range Set ary(0) = Range("A1") Debug.Print ary(0) End Sub 上記のコードでは、ary(0)にrange("A1")への参照を返していることになるとおもうのですが、なぜセルの値を返すのでしょうか? range("A1")はオブジェクトなので、その参照ということはセルの値を取得するという意味なのでしょうか?
> 小川様 > > いつもありがとうございます。 > 以下のコードですが、セルA1には3という数値が入っている状態で実行するとイミディエイトウインドウで3と表示されます。 > Sub hairetu() > Dim ary(0) As Range > Set ary(0) = Range("A1") > Debug.Print ary(0) > End Sub > 上記のコードでは、ary(0)にrange("A1")への参照を返していることになるとおもうのですが、なぜセルの値を返すのでしょうか? > range("A1")はオブジェクトなので、その参照ということはセルの値を取得するという意味なのでしょうか? >
[1]について Sub hairetu2() Dim ary As Range Set ary = Range("A1") Debug.Print ary End Sub ary()から()をとり、aryとして変数を配列でなくし、かつセルA1には3が入っている状態でというコードを実行しました。 イミディエイトウインドウには3が表示されました。ちなみに、セルA1を空欄のまま実行するとイミディエイトウインドウには空白が表示されました。 このアドバイスは、変数を配列ではなくすことで問題の本質に近づけるものだと解釈しました。
[2] Sub hairetu3() Dim ary As Range Set ary = Range("A1") Debug.Print ary Debug.Print TypeName(ary) End Sub セルA1には3が入っている状態で、上記のコードを実行すると、イミディエイトウインドウには3とRangeと表示されました。
[3] Sub hairetu4() Dim ary1 As Range Dim ary2 As Long Set ary1 = Range("A1") ary2 = Range("A1") Debug.Print ary1 Debug.Print ary2 Debug.Print TypeName(ary1) Debug.Print TypeName(ary2) End Sub セルA1には3が入っている状態で、上記コードを実行すると、イミディエイトウインドウには3,3,Range,Longと表示されました。
次に、 Sub hairetu5() Dim ary1 As Range Dim ary2 As Long Set ary1 = Range("A1").Value ary2 = Range("A1").Value Debug.Print ary1 Debug.Print ary2 Debug.Print TypeName(ary1) Debug.Print TypeName(ary2) End Sub セルA1には3が入っている状態で、上記コードを実行しようとするとSet ary1 = Range("A1").Valueの行で、オブジェクトが必要です、と警告がでました。
最後に、 Sub hairetu6() Dim ary1 As Range Dim ary2 As Long Set ary1 = Range("A1") ary2 = Range("A1").Value Debug.Print ary1 Debug.Print ary2 Debug.Print TypeName(ary1) Debug.Print TypeName(ary2) Debug.Print TypeName(Range("A1")) End Sub セルA1には3が入っている状態で、上記のコードを実行すると、イミディエイトウインドウで3,3,Range,Long,Rangeと表示されました。
Sub hoge()
Dim bk As Workbook
Set bk = ThisWorkbook
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Dim rg As Range
Set rg = Range("A1")
Dim ft As Font
Set ft = rg.Font
Dim sp As Shape 'エクセルのリボン「挿入」→「図形」から、適当な図形をエクセルシートに追加してください。それから試してください。
Set sp = ws.Shapes(1)
Dim c As Long
c = Range("A1")
Range("A1").Value = 3
End Sub
疑問点その2 Sub hairetu6() Dim ary1 As Range Dim ary2 As Long Set ary1 = Range("A1") ary2 = Range("A1").Value Debug.Print ary1 Debug.Print ary2 Debug.Print TypeName(ary1) Debug.Print TypeName(ary2) Debug.Print TypeName(Range("A1")) End Sub
Sub test1()
'[*1] プロパティの設定の構文では、セルについては、.Valueを省略しても、.Valueを取得する
'[*2] プロパティの取得の構文では、セルについては、.Valueを省略しても、.Valueを取得する
Range("A1") = 3 '[*1]により、 .Valueプロパティの値が設定されるから。
Debug.Print "test1-1"
Debug.Print TypeName(Range("A1")) '出力: Range
Debug.Print Range("A1") '出力: 3 -> [*2] により、.Valueプロパティの値が出力されるから。
End Sub
Sub test2() '[*2]の例。
Range("A1").Value = 3
Dim rg As Range
Debug.Print "test2-1"
Debug.Print TypeName(rg) '出力: Nothing
Set rg = Range("A1")
Debug.Print "test2-2"
Debug.Print TypeName(rg) '出力: Range
Debug.Print rg '出力: 3 -> [*2] により、.Valueプロパティの値が出力されるから。
End Sub
Sub test3() '当然、変数が配列であろうと、[*2]は変わらない。
Range("A1").Value = 3
Dim ary(0) As Range
Debug.Print "test3-1"
Debug.Print TypeName(ary(0)) '出力: Nothing
Set ary(0) = Range("A1")
Debug.Print "test3-2"
Debug.Print TypeName(ary(0)) '出力: Range
Debug.Print ary(0) '出力: 3 -> [*2] により、.Valueプロパティの値が出力されるから。
End Sub
Sub test4() '自動データヒントでは、マクロ実行中にRangeオブジェクトの上にカーソルを乗せると、そのセルの .Value プロパティの値を表示する。
Range("A1").Value = 3 '
Dim rg As Range
Set rg = Range("A1") '[*3]
Debug.Print "test4-1"
Debug.Print Range("A1").Value '[*3]の行までが実行済の状態で、「Range」の上にカーソルを置いて試してみてください。
Debug.Print Range("A1") '[*3]の行までが実行済の状態で、「Range」の上にカーソルを置いて試してみてください。
Debug.Print "test4-2"
Debug.Print rg.Value '[*3]の行までが実行済の状態で、「rg」の上にカーソルを置いて試してみてください。
Debug.Print rg '[*3]の行までが実行済の状態で、「rg」の上にカーソルを置いて試してみてください。
End Sub
わかやまさんの投稿
(投稿ID: 4233)
いつもありがとうございます。
以下のコードですが、セルA1には3という数値が入っている状態で実行するとイミディエイトウインドウで3と表示されます。
Sub hairetu()
Dim ary(0) As Range
Set ary(0) = Range("A1")
Debug.Print ary(0)
End Sub
上記のコードでは、ary(0)にrange("A1")への参照を返していることになるとおもうのですが、なぜセルの値を返すのでしょうか?
range("A1")はオブジェクトなので、その参照ということはセルの値を取得するという意味なのでしょうか?
小川慶一さんのコメント
(コメントID: 5794)
これから3つアドバイスをします。
これら3つのアドバイスに基づいて検討し、その結果を報告してください。
[1] 変数が配列でない場合についても検討してください。
[2] Typename関数という関数があります。
引数として指定されたもののデータの型を教えてくれる関数です。
これも使ってさらに検討してください。
[3] 以下の記事を読んだうえで、ご自身でテスト用のコードを書き、さらに検討してください。
「「セルの値」を指定するとき、.Value は省略してよいものか? – Excelマクロ・VBA」
https://www.exvba.com/2183/
上記[1], [2], [3]を行ったうえで、すっきり理解できたなら、ご自身の見解を自分の言葉でまとめてください。
それでもなお不明な点が残るようでしたら、どのような検討をして、何についてはすっきりしたか?そして、何がまだ不明なのか?を明らかにして再投稿してください。
よろしくお願いします。
> 小川様
>
> いつもありがとうございます。
> 以下のコードですが、セルA1には3という数値が入っている状態で実行するとイミディエイトウインドウで3と表示されます。
> Sub hairetu()
> Dim ary(0) As Range
> Set ary(0) = Range("A1")
> Debug.Print ary(0)
> End Sub
> 上記のコードでは、ary(0)にrange("A1")への参照を返していることになるとおもうのですが、なぜセルの値を返すのでしょうか?
> range("A1")はオブジェクトなので、その参照ということはセルの値を取得するという意味なのでしょうか?
>
わかやまさんのコメント
(コメントID: 5798)
ありがとうございます。
アドバイスをもとに確認作業を行いました。
変数をrange型で宣言した場合、その変数に.valueをつけるとオブジェクト入れるように怒られました。逆に、変数をlong型で宣言しておいて.valueをつけずに、range("A1")とオブジェクトで記載してもそのまま実行でき、値をかえしてくれました。
データ型が分かっている人にはrangeで宣言した後に、.valueをつければ怒られますが、データ型を知らない初心者には.valueを付け忘れても、そのまま実行してあげようという優しさがあるということでしょうか?
小川慶一さんのコメント
(コメントID: 5799)
どのような検討をしたのか、詳しく書いてください。
まだしっくりこないことがあるならば、たとえば、以下くらいは少なくとも詳細に報告ください。
・具体的に、どんなサンプルコードを書いたのか?
・それを実行した結果はどうだったのか?
・それを元に、どういう知見が得られたのか?
僕がどうしてそう言うのかというと、それは、前記「3つのアドバイス」のうち、[2]をされたという形跡がこの投稿からは確認できないからです。
言い換えると、僕の提示した3つの手順を順に実行したという形跡が感がられません。
それから、たとえば、以下の一文。日本語としておかしいです。
[a] データ型が分かっている人には
[b] rangeで宣言した後に、.valueをつければ怒られますが、
[c] データ型を知らない初心者には.valueを付け忘れても、
[d] そのまま実行してあげようという
[e] 優しさがあるということでしょうか?
主語がないのはまあいいとしても...。
[a]の、「分かっている人には」と、[b]の、「怒られますが」は、つながらないですね。
「分かっている人には」なら、[b]は、「怒られます」ではなく、「怒ります」です。
つまり、エクセルマクロ的に言えば、構文エラーが生じています。
また、怒られるタイミングは、「.valueをつければ」ではなく、「.valueをつけた状態で【実行すれば】」です。
わかやまさんの言語運用能力の限界なのか(つまり、言いたいことは頭の中でより明確なのだが、表現力が拙いのか)、そもそも理解が足りないのか(つまり、頭の中でも言いたいことが本人にとっても不明確なのか)、単に投稿時の推敲が足りないのか(つまり、言いたいことは明確だし表現力も本来十分にあるのだが、この投稿をしたときは、慎重さに欠けていただけなのか)はわかりません。
が、いずれにせよ、「私の理解はこうです。間違いないですか?」という質問がきて、それが意味の通らない文章であったならば、僕は返事のしようがないわけです。
と同時に、再三書いていることではありますが、エクセルマクロのスキルは言語運用能力なので、こういう拙い言語表現の投稿を見ると、僕は、エクセルマクロに対する理解やエクセルマクロでの表現の力云々以前に、その基礎たる言語能力のほうにそもそも疑問を抱くわけです。
高いレベルのスキルを得るには、当然、基礎が大事です。その基礎というのは、エクセルマクロに限らない、言語運用能力のことも含みます。
以上から、わかやまさんがこの件について慎重に検討し、慎重に思考を整理し、慎重に報告した、という様子が感じられません。
基礎編受講生とかならそういうところはあまり見ないでシャンシャンと適当にお返事します(もとより、理論的に混乱するようなことは伝えていませんから)が、発展編2の受講生としてはこれでは心もとないです。
以上から、今の手順書作成、運用能力なり、日本語運用能力なり、学習能力なり、というところが、発展編2を学ぶには力量不足と思われます。
「能力的にギリギリのことを学んでいる」と思って、学習の一挙手一投足を丁寧に慎重に行ってください。
【参考】
手順書作成、運用能力について
https://www.exvba.com/4skills.php#shikumi
言語能力について
https://www.exvba.com/4skills.php#language
学習能力について
https://www.exvba.com/4skills.php#study
エクセルVBAの習得と「ITスキル」、「仕組み化、効率化能力」、「言語能力」、「学習能力」の4つの能力との間には、密接な関係があります。
https://www.exvba.com/4skills.php
「密接な関係がある」とは、以下の2つの意味です。
・これらの能力が高いほうがエクセルVBAを習得するのが容易だ
・エクセルVBAを習得し、上達する過程で、これらの能力も連動して向上する
上に挙げた能力が元々高い方ほど、エクセルVBAの習得は簡単です。
しかし、学び方が適切ならば、エクセルVBAのスキル向上に連動してこういった能力も向上するようになります。すると、エクセルVBAのスキルを習得することもより楽になっていきます。
・疑問を慎重に整理し
・慎重に考察し
・何が分かっていないのか?を慎重に判断し
・それを調べるためのテストコードを慎重に作成し
・慎重にテストを実行し
・そのテストの結果について慎重に考察し
・そこで新たに湧いた疑問を慎重に整理し
...
ということをくり返したうえで、得られた知見を整理し、次の報告なり質問なりを慎重に行ってください。
そのような慎重さ身につけることが、結果として、より高度な概念を理解し、運用できるようになるための近道になります。
よろしくお願いします。
わかやまさんのコメント
(コメントID: 5800)
失礼いたしました。言語運用の向上が、VBA習得と密接に関係があることをきちんと認識し、学習に励みたいと思います。
以下、検討した内容です。
[1]について
Sub hairetu2()
Dim ary As Range
Set ary = Range("A1")
Debug.Print ary
End Sub
ary()から()をとり、aryとして変数を配列でなくし、かつセルA1には3が入っている状態でというコードを実行しました。
イミディエイトウインドウには3が表示されました。ちなみに、セルA1を空欄のまま実行するとイミディエイトウインドウには空白が表示されました。
このアドバイスは、変数を配列ではなくすことで問題の本質に近づけるものだと解釈しました。
[2]
Sub hairetu3()
Dim ary As Range
Set ary = Range("A1")
Debug.Print ary
Debug.Print TypeName(ary)
End Sub
セルA1には3が入っている状態で、上記のコードを実行すると、イミディエイトウインドウには3とRangeと表示されました。
[3]
Sub hairetu4()
Dim ary1 As Range
Dim ary2 As Long
Set ary1 = Range("A1")
ary2 = Range("A1")
Debug.Print ary1
Debug.Print ary2
Debug.Print TypeName(ary1)
Debug.Print TypeName(ary2)
End Sub
セルA1には3が入っている状態で、上記コードを実行すると、イミディエイトウインドウには3,3,Range,Longと表示されました。
次に、
Sub hairetu5()
Dim ary1 As Range
Dim ary2 As Long
Set ary1 = Range("A1").Value
ary2 = Range("A1").Value
Debug.Print ary1
Debug.Print ary2
Debug.Print TypeName(ary1)
Debug.Print TypeName(ary2)
End Sub
セルA1には3が入っている状態で、上記コードを実行しようとするとSet ary1 = Range("A1").Valueの行で、オブジェクトが必要です、と警告がでました。
最後に、
Sub hairetu6()
Dim ary1 As Range
Dim ary2 As Long
Set ary1 = Range("A1")
ary2 = Range("A1").Value
Debug.Print ary1
Debug.Print ary2
Debug.Print TypeName(ary1)
Debug.Print TypeName(ary2)
Debug.Print TypeName(Range("A1"))
End Sub
セルA1には3が入っている状態で、上記のコードを実行すると、イミディエイトウインドウで3,3,Range,Long,Rangeと表示されました。
分かったことをまとめます。
hairetu5のようにary1という変数をrange型で宣言し、その変数にary1=Range("A1").valueとしてしまった場合は実行エラーになるが、hairetu4のようにary2という変数をLong型で宣言しary2=Range("A1")と.valueを付け忘れた場合は
本来ならデータ型が一致しないために実行エラーになるが、VBA自体が初心者向けのプログラミング言語であるためにこびとちゃんが無理矢理.valueの事だろうと解釈し、エラーを出さずに実行してくれる。
不明な点について述べます。セルA1に3が入っている状態で、hairetu6のようにary1をRange型で宣言します。ary1=Range("A1")とかき、そこ(Range("A1")の部分)にカーソルを乗せると
Range("A1")=3と表示され、オブジェクトであるRange("A1")に値である3が入っています。そのため、ary1はRange型で宣言しているにもかかわらず、3という値が入ってしまいます。
Range("A1")=3と表示されるのはなぜでしょうか?
どうぞよろしくお願いします。
小川慶一さんのコメント
(コメントID: 5801)
>hairetu5のようにary1という変数をrange型で宣言し、その変数にary1=Range("A1").valueとしてしまった場合は実行エラーになるが、hairetu4のようにary2という変数をLong型で宣言しary2=Range("A1")と.valueを付け忘れた場合は
>本来ならデータ型が一致しないために実行エラーになるが、VBA自体が初心者向けのプログラミング言語であるためにこびとちゃんが無理矢理.valueの事だろうと解釈し、エラーを出さずに実行してくれる。
まあまあOKです。まだ日本語のつながりがおかしいところはありますが、そこは目をつむります。
ビジネスにおいては、一般に、重文は駄文です。
日本語がぐちゃぐちゃしている人は、たいてい、プログラムもぐちゃぐちゃしていますね。
「マクロの勉強と日本語力は別」と思ったら、どちらも早々に頭打ちです。
日本語を書くときも、マクロを書くように書いてください。マクロを書くときも、日本語を書くように書いてください。それが、日本語とエクセルマクロ両方のスキルを効率よく向上させるコツです。
たとえば以下のように文をより区切るとより読みやすく(プログラミング言語的に言うと、可読性が高く)なります。
(もっとキレイに書くこともできますが、今回は、いただいた文を極力残したバージョンをお見せします)
hairetu5のように、ary1という変数をRange型で宣言し、ary1=Range("A1").Valueとした場合は実行時エラーになる。
一方、hairetu4のように、ary2という変数をLong型で宣言し、ary2=Range("A1")とした場合は実行時エラーにならない。
hairetu4のプログラムが実行時エラーにならないのは、「VBAは初心者向けのプログラミング言語なので、こびとちゃんが無理矢理.Valueの事だろうと解釈し、エラーを出さずに実行してくれるから」であろうと考えた。
ご自身で書かれた文章切り貼りして僕が今紹介した添削例と同じものを作ろうとしてみてください。
そうすると、日本語のつながりがおかしいところはどこか?とか、読みやすくなるように文章を書き直すとはどういうことか?といったことがより明らかになるでしょう。
(マクロの勉強と同じです。見本を見て「ふーん」と思っているだけでは実力はつきません)
こういうところから直さないと、抽象的思考力は伸びません。
慣れない思考行動パターンを身につけるというのはストレスかかることです。
ですが、あなたの周囲の人もおそらくあまりきちんとやってないことでしょうから、こういう地味な努力は、少しきちんとやっただけですぐに自分を差別化するスキルになります。
それから、検証の過程で6つのコードを書いたというのはそれはそれでよいですが、報告時には、自分が得た知見だけが如実にわかるような最低限のサンプルコードを提示したほうがよいでしょう。
そういうことも、「可読性」を高めるためのアイデアです。
次に、「不明な点」について。
>Range("A1")=3と表示されるのはなぜでしょうか?
それでは、どう表示されるべきだと考えますか?
わかやまさんの「不明な点」についての記述には、わかやまさんご自身の「仮説」が含まれていません。
理系科目の勉強は、仮説と検証のくり返しで学ぶものです。
仮説を立てないことには、検証のしようがありません。
こんなサンプルを書いてみました。実行し、種々のタイミングで変数やオブジェクト、そのオブジェクト、プロパティ等のキーワードの上にマウスを置いて、検討してみてください。
わかやまさんのコメント
(コメントID: 5810)
いただいたサンプルコードを用いて、ステップインモードで1行ずつ実行し
すべての変数の表示(自動データヒント)を確認する作業を行いました。
1回ごとの表示とその変化を、テキスト形式にまとめたのですが、その結果をお見せするのは煩雑になりますので、割愛させていただきます。
私の疑問点を2点整理し直しました。
疑問点その1
Sub hairetu()
Dim ary(0) As Range
Set ary(0) = Range("A1")
Debug.Print ary(0)
End Sub
上記のコードのDebug.Print ary(0)を実行すると、オブジェクト型変数であるary(0)からオブジェクトそのものが返ってこず、イミディエイトウインドウには3という値が返ってくる。
そのため、ary(0)にはRange(“A1”)を格納したのに、3という値しか入っていないのではないか、という疑問がありました。
疑問点その2
Sub hairetu6()
Dim ary1 As Range
Dim ary2 As Long
Set ary1 = Range("A1")
ary2 = Range("A1").Value
Debug.Print ary1
Debug.Print ary2
Debug.Print TypeName(ary1)
Debug.Print TypeName(ary2)
Debug.Print TypeName(Range("A1"))
End Sub
上記コード(セルA1には3がはいっている状態です)で、オブジェクト型変数であるRange("A1")やary1にカーソルを乗せると自動データヒントでは、Range("A1")=3,ary1=3と表示される。
このRange("A1")=3という表示の左辺はオブジェクト型変数、右辺は値を表しており、イコールで結ばれている意味合いをうまく解釈できない、というのが2つ目の疑問点でした。
以下が私の考えです。
インターネットでDebug.Printの実行時のイミディエイトウインドウの表示と自動データヒントの表示について調べました。
すると、オブジェクト型変数とデータ型の変数で表示方法に大きな違いがあることが分かりました。
Debug.Printメソッドで、データ型の変数を実行すれば、その値が表示されます。
しかし、オブジェクト型変数を扱おうとすると、基本的に実行エラーになります。実際の挙動も確認済みです。
同様に、自動データヒントの表示についても、データ型の変数にカーソルをあわせば、その時点で入っている値が表示されます。オブジェクト型変数については、その行を実行した後でですが、基本的に自動データヒントの表示はありません。
今回の疑問1、2で扱った変数は、オブジェクト型変数であるRangeでした。
上記の内容が正しいとすれば、Debug.Print ary(0)から3、Range("A1")からはRange("A1")=3という表示は出ないはずです。
では、なぜそのような表示が出るかというと、VBAはRangeオブジェクトを特別扱いしていると考えました。
(これは小川様に以前紹介していただいた、「セルの値を指定するとき、.Value は省略してよいものか? ? Excelマクロ・VBA」からヒントを得ています)
オブジェクト型変数であるRangeのValueプロパティに値が格納されても、本来ならDebug.Printメソッドや自動データヒントのよる表示はないはずです。
しかし、Range型オブジェクトのみ、小人ちゃんが気を利かせ、たくさんある他のプロパティに優先して、Valueプロパティの値を表示していると考えました。そして自動データヒントでは『オブジェクト=値』という形で表示していたと結論づけました。
そもそもオブジェクトにはたくさんのプロパティがあるので、オブジェクトだけ指定しても、そのすべてを表示することには物理的に限界がありますよね。
振り返ると
Debug.Printの実行時のイミディエイトウインドウの表示と自動データヒントの表示について、きちんとした知見を得たことで、理解が大きく前進しました。
時間はかかったのですが、今回の学習を通し、当初の疑問を解決するだけでなく、たくさんの周辺知識を学ぶことができました。具体的には、オブジェクトの理解が進んだこと、ローカルウインドウを知った、オブジェクトの階層構造を知った、などです。粘ってみて良かったです。
どうぞよろしくお願いします。
小川慶一さんのコメント
(コメントID: 5811)
ある程度努力されたので、あとは、以下のサンプルコードを読んで実行すれば、すべてご理解いただけるものと思います。
要点は、以下の3つだけです。
・セルのプロパティを取得する構文では、取得するプロパティの指定を省略した場合は、.Valueプロパティの値を取得する
・セルのプロパティを設定する構文では、設定するプロパティの指定を省略した場合は、.Valueプロパティの値を設定する
・自動データヒントでは、マクロ実行中にRangeオブジェクトの上にカーソルを乗せると、そのセルの .Value プロパティの値を表示する。
小川慶一さんのコメント
(コメントID: 5812)
あとは、より丁寧に学ぶのであれば、さきほど僕が示した投稿全文をなぞって書き写してみることです。
当然、サンプルコードについては、ひとつひとつのプロシージャごとに、書いて、それから実行して、ということをくり返しつつです。
わかやまさんのコメント
(コメントID: 5814)
アドバイスありがとうございました。理解できました。
言語運用能力について小川様からご指摘をいただいた際は、”ドキッ”としました。
昔から、あまり自信がなく、特に改善すること試みずに、今に至っているからです。
ですが、今回エクセルマクロというプログラム言語を学ぶにあたり、プログラムの能力を向上させるためにも、私自身の言語運用能力について見直していこうと決意いたしました。
まずは丁寧に書くことを意識していきたいと考えています。
今回は本当にありがとうございました!
小川慶一さんのコメント
(コメントID: 5815)
認識か記述かのどちらかの能力に瑕疵があるわけです。
と、「どちらか」と書いてはみましたが、実際には、これらの能力は連動しているので、たいてい、同じ人なら、両方の能力とも同じ程度です。
記述力を高めることは認識力を高めます。
認識力を高めることは記述力を高めます。
たとえば、一連のやりとりで学んだことを自分なりに言葉にまとめてみるとかもよいですよ。
あとは、以下の2つの講座です。
○ 「イヤでもWindowsとエクセルの操作が早くなるワークショップ」セット
https://forum.pc5bai.com/lesson/index/ 内、「おすすめ講座セット」の二番目。
○イヤでも思考が整理されて文章作成が早くなるワークショップ
https://forum.pc5bai.com/lesson/course/63
アウトプット能力を高めることは、認識力、記述力を爆発的に高めます。
> 小川様
>
> アドバイスありがとうございました。理解できました。
> 言語運用能力について小川様からご指摘をいただいた際は、”ドキッ”としました。
> 昔から、あまり自信がなく、特に改善すること試みずに、今に至っているからです。
> ですが、今回エクセルマクロというプログラム言語を学ぶにあたり、プログラムの能力を向上させるためにも、私自身の言語運用能力について見直していこうと決意いたしました。
> まずは丁寧に書くことを意識していきたいと考えています。
> 今回は本当にありがとうございました!