なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

スクレイピングまでがんばるVBA講座~その2. プログラムの基礎機能①

f:id:nazuna_0124:20180609224553p:plain

新入社員放置は転職防止のための戦略なのかもしれない


たまにそんな気がしてます。


なにもしなければよいので、

案外悪くないのかもしれません。



おつかれさまです。なずなです。


講座の続き。

最初のところを細かくやってくれるところは

いっぱいあるので、このへんはざっくりと。



プログラムの基本的な考え方はコンピューターに対する命令書です。
命令書をかくにあたって、プログラムを書く人が楽になるように
仕組みや機能があります。

この機能や仕組みは言語によって違います。

ここでは3つの説明です。
    ・オブジェクト
    ・標準関数
    ・サブプロシージャ
        (プロシージャへの引数わたし)

オブジェクトとオブジェクトの指定

知ってる人はしってるのでさらっと。



Range("A1")の部分がオブジェクトです。

まず実はここで行っているのは文字列の代入ですので
Range("A1").Value が省略されてたりします。

最初は面倒で省略したくなりますが、書いておいたほうが無難。

次にシートの省略です。

Worksheets("Sheet1").Range("A1").Value 

こうなります。こう書き換えてもオッケーです。

Worksheets(1).Range("A1").Value 

一つ目は名前で指定。2つ目はインデックス番号で指定です。
どちらも使います。

また、英語でなんとなくわかりますが単語にSの複数形がついて
("")で指定するという形式になります。


### プロパティ

属性って言い方をします。
オブジェクトにはそれぞれ属性がついていて、セルA1に入力されている文字列って
意味合いになってます。

わかりやすいのが背景色で

Worksheets(1).Range("A1").Interior.Color = RGB(255, 0, 0)   

これで真っ赤になります。


### メソッド
そのオブジェクトに備わった処理を実行させるもの。
どっちも「.」ドットなので区別は付きにくいです。

エアコンでもテレビでもリモコンには「電源ON」て書いてあるかと思います。
でもテレビのリモコンでエアコンが付いたりはしない。そういうかんじ。


Range("A1").Clear

をやってみましょう。

標準関数

関数って表現が最初は嫌いでした!
何かが返ってくると思っておきましょう。
組み込み関数なんていわれ方もするかも。

各言語によって名前や返り方が違います。


debug.print Now() 

とりあえずはこれです。

ついでに文字列の連結を覚えておくことに。

debug.print "hello" & " " & Now()

F5キー押すたびに秒まで変わってるのがわかります。
ついでに覚える日付表示。

YYYY年MM月DD日で表示したい!

    Debug.Print Format(Now, "YYYY年MM月DD日")

この手のは丸暗記しかありません。

サブプロシージャ

ついでにさらっと簡単な変数もやっちゃいます。
下記をコピペで使ってください。


Sub CopyClip()
    Dim str

    str = "Test" & " " & Now()

    Dim db As New DataObject

    db.SetText str
    db.PutInClipboard

End Sub


ここでエラー出た人!
下記の手順を行ってください。

    挿入 > 標準フォーム

    画面の左上に1個増えましたが気にしなくてオッケー。


実行できた人はどこかでCtrl + V (要するに貼り付け)


クリップボードにstrの中身がコピペされています。

これがコピペをわけもわからず使うということです!
最初は「こういうもんだ」と割り切って使いましょう。

把握するべきは、strの中身がクリップボードに格納されるということです。

これをもうちょっと使いやすくする方法が以下。


Sub CopySample()
    Dim str

    str = "いまなんじ? "

    Call CopyClip(str)

    'こっちでもオッケー
    'CopyClip str

End Sub


Sub CopyClip(str)
    str = str & " " & Now()

    Dim db As New DataObject

    db.SetText str
    db.PutInClipboard

End Sub


こうやって変数をわたして処理を切り分けることができます。


[補足]
    ・VBAは省略するとデフォルトで参照渡しです。値渡しのときは Byval をつけます。
    ・省略をしてもよい引き数は Optional をつけます。記載移行のすべての引数がそうなるので注意。


これらを利用して
    Range("A1")をコピーするボタンAと
    Range("B2")をコピーするボタンBを作ってみてください!



プロシージャへのジャンプ機能があります。
プロシージャ内のプロシージャ名(ここではCall CopiClip(str)) にカーソル合わせて
shift + 2 です。