[VBA]初級講座受講メモ -Day6‐

VBA

どうも。つじけ(tsujikenzo)です。こちらのシリーズではノンプロ研VBA初級講座3期で学んだことをアウトプットしております。本日は6回目です。いよいよ最終回ですね。

Day6 セル・シート・ブックの操作

今日のアジェンダ

  1. セル範囲を動かす
  2. データの抽出
  3. ブックの作成と保存
  4. 構造化データ

です。

セルの範囲指定

Rangeオブジェクトは知れば知るほど謎なことが増えてきて嫌になっちゃう為になるけど、私の最大の謎が言語化されていて助かりました。

Rangeオブジェクトを参照するにはRangeオブジェクトを返すプロパティの戻り値を使わなければなりません。言い方を変えれば、Rangeオブジェクトを返すプロパティを経由してRangeオブジェクトを参照するという事です。下表は、Rangeオブジェクトを参照するためのプロパティです。

Rangeオブジェクト(RangeとCells)|VBA入門
エクセルの根幹はセルです、セルはRangeオブジェクトになります、このRangeオブジェクトの理解なくしてマクロVBAは理解できません。マクロVBAで自在にセルを扱う為には、このRangeオブジェクトをしっかりと理解する必要があります。セルを表すVBA記述は多数存在します、Range、Cells、Rows、

私の気持ちを代弁するかのごとく、ご親切に次のステップまで示されていました。まずは太字プロパティを操作する方法を徹底して覚えることからですね。(考察はその後でもいい)

Rangeオブジェクトに、Rangeプロパティがあるあたりが、ちょっと理解しづらいかもしれません。まずは、上表の太字が使えるようになること目指してください。

ちょっと脱線しましたが、WorksheetクラスのRangeプロパティには引数でカンマ区切りでRangeオブジェクト(恐らく単体セル)を渡すと、範囲を取得できるみたい。

Worksheetオブジェクト.Range(Rangeオブジェクト1, Rangeオブジェクト2)

Offsetプロパティ

Rangeオブジェクトに対して移動することができる。(レコーディングマクロだとよく出てくる)

Rangeオブジェクト.Offset(行方向、列方向)

Rowsプロパティ、Columnsプロパティ

割と直感的に操作できそうなプロパティ

Worksheetオブジェクト.Rows(行番号)
Worksheetオブジェクト.Columns(行番号)

今私、直感的に操作できるって言いました?では貼り付け先の指定はどうですか?Rowsは行全体なので、張り付け先の指定先はA列(のどこか)を指定します。

.Rows(行番号).Copy Sheet2.Cells(‘自由に’, 1(A列指定))

Columnsは列全体なので、張り付け先の指定先は1行目(のどこか)ですね。

.Columns(列番号).Copy Sheet2.Cells(1(1行目指定), ‘自由に’)

これ、納得いかない不思議で、Rows & Columnsプロパティで取得したオブジェクトはRows & Columnsオブジェクトなんでしょうけど、行・列全体ってことはきっと要素の長さを持ってないってことでしょうかね。でも長さを持ってないクセにA列とか1行目をRangeオブジェクトで指定できるのは不思議じゃないですか?(不思議じゃない、あ、そうですか。すみません💦)

F2[オブジェクトブラウザー]でちゃんと確認しましょう。あれ?Property Rows As Range?そっか、Rows & Columnsオブジェクトなんてこの世に無いんですね。相変わらず2つのクラスにRowsプロパティがあるのは初学者の私の範疇ではないのでいちおどちらも掲載しておきます。

ノンプロ研に入会したての時にVBA板で自分のマクロを投稿して質問した時に、「処理対象が行全体になってますね。」とご指摘いただいたことを思い出しました。確かにRangeオブジェクトの最大値はXFD列1048576行だと思いますので、使わないのにその分のメモリを確保してるのは無駄ですね。

データの抽出

Do Whileの中にif文を置く(ワンライナーで書くとEnd Ifが省略できる)のが基本。貼り付け先のシートの行数指定に別のカウント変数を用意するのもテクニックです。

With Sheet1
        Dim i As Long: i = 1
        Dim j As Long: j = 1
        Do While .Cells(i, 1).value <> ""
            If .Cells(i, 2).value <= 25 Then
                .Rows(i).Copy Sheet2.Cells(j, 1)
                j = j + 1
            End If
            i = i + 1
        Loop
End With

ブックの作成と保存

ブックの作成

AddメソッドはWorkbooksコレクションのメンバーです。Workbookオブジェクトのメンバーではありません。F2[オブジェクトブラウザー]で確認しましょう。

確かにありませんね。むしろ「新規Workbookを作成する」ということはExcelライブラリApplicationクラスにありそうじゃないですか?

ないですね~。(だからWorkbooksコレクションのメンバーって言ってるでしょ💦)

ちなみにExcelライブラリAddメソッドを検索すると沢山のAddメソッドが用意されているようです。ちゃんとクラスを確認して使用した方がバグに出会ったときなどにリカバリが早いでしょうね。ちなみにWorksheetsクラス(コレクション)にもAddメソッドがあるようですね。きっとシートを追加する時はWorksheetsコレクション.Addメソッドを使うんでしょうね(まだやったことない)。

新規ブックを作成した時は、新規ブックがアクティブなブックになるのでシートを掴む時に便利です。

ブックの保存・閉じる

Workbookオブジェクト.Save
Workbookオブジェクト.SaveAs ファイルパス

全ての引数がオプションになっていて、ブックを閉じる際にオプションでファイル形式を保存したりパスワード指定したりできるみたいです。

ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
ワークブックを閉じる場合や保存する場合のマクロVBAの説明です。閉じる時に保存するか保存しないかを指定できます。また、ブックを保存するにも、上書きなのか別ファイルにするのか等によってVBAの記述がそれぞれ違ってきます。

ブックを閉じるのはCloseメソッドです。

Workbookオブジェクト.Close

新規作成したBookをそのままwith構文のオブジェクトに指定することができて便利

  Dim filePath As String: filePath = ThisWorkbook.Path & "\hoge.xlsx"
    With Workbooks.Add
        .Worksheets(1).Range("A1").value = "★"
        .SaveAs filePath
        .Close
    End With

ブックを開く

Workbooksコレクション.Open  ファイルパス

作成の時と同様に、開いたブックはアクティブなブックになります。OneDriveなどのクラウド上のファイルを操作する際はURLになるらしいですが、まだ使ってないので今回は覚えません💦

最終行を取得

ノンプロ研の講座を受けているのによそ様のブログを紹介してばっかりなのも憚れるのですが、どこからコピペしてきたのか、どこまで理解してるのか、今は全てオープンで語られるようになったのもノンプロ研のお陰だと思ってます。(以前ならコピペコードをさも自分の知識のごとくひけらかしていたと思います💦)

Worksheetオブジェクト.Cells(Rows.count, 1).End(xlUp).row

これは「沢山のプロパティが詰まっていて大変勉強になる」とのことです。確かに。そもそもまだ慣れない私にとってはEnd()がメソッドなのかプロパティなのかも見分けがつかないですが、しかしF2[オブジェクトブラウザー]も授業で習いましたのでもう大丈夫ですね。しかもこれ読み取り専用のプロパティですって。なんとなく分かってきましたね。

そしてまだ疑問が沢山残っていますが、私がずっと感じてた違和感は正しかったんだと思えて安心しました。

『今は、プロパティには、値の設定・取得をするものと、 オブジェクトを返すプロパティがあると言う事だけ知っておいて下さい。EndはRangeオブジェクト返すプメロパテイであるということです。』

最終行の取得(End,Rows.Count)|VBA入門
Excelワークシートにおける表の最終行の取得は、マクロVBAの必須技術になります、エクセルVBAにおける最終行取得の必要性 エクセルは表計算ソフトです、つまり縦横の表を扱います、データは横に項目があり、縦に項目に対するデータが入っている事が一般的です。しかし、そのデータ行数は決まった行数ではない事が普通です。

まとめ

以上で第6回目のまとめでした。closesaveなどのメソッドはバリバリ使ってましたが、対象のオブジェクトがなんなのかとか意識したことがなく、基礎がわかってないままずっと使ってたんだなと改めて認識しました。また、最後の最後では「プロパティには、値の設定・取得をするものと、 オブジェクトを返すプロパティがある」という腹落ちも得まして、大変学ぶことの多かった最終回となりました。次回卒業LTでこのシリーズは終わりです。

[ノンプロ研]VBA初級講座3期卒業LTについて
どうも。つじけ(tsujikenzo)です。今日は2020年11月から受講していたノンプロ研VBA初級講座3期の卒業LTで発表したことをまとめます。今回でこのシリーズとしては最終回になります。(実際にはブログを書きながらアウトライン作成した...

気付けば2020年大みそかの投稿となりました。皆さん良いお年をお迎えください。来年もプログラミングライフ楽しんでいきましょう~。

このシリーズの目次

  1. [VBA]初級講座受講メモ -Day1とDay2-
  2. [VBA]初級講座受講メモ -Day3とDay4-
  3. [VBA]初級講座受講メモ -Day5‐
  4. [VBA]初級講座受講メモ -Day6‐
  5. [ノンプロ研]VBA初級講座3期卒業LTについて
タイトルとURLをコピーしました