![見出し画像](https://assets.st-note.com/production/uploads/images/100595749/rectangle_large_type_2_0f553fd66b9baca12a65dec11b3913a6.png?width=1200)
第53回 配列入門!Array&Collection&Dictionary欲張りセット
今後のスケジュールはコチラ
投げ銭ページはコチラ
登壇者:和風スパ
日時 :2023年3月18日 20時
テーマ:配列入門!Array&Collection&Dictionary欲張りセット
![](https://assets.st-note.com/img/1679136893598-qF9Oqtdznx.png)
![](https://assets.st-note.com/img/1679137431373-5Cxcxi2wiM.png?width=1200)
はじめに
自己紹介
![](https://assets.st-note.com/img/1679137516955-bCjR9DUU1R.png?width=1200)
本日の内容
![](https://assets.st-note.com/img/1679137601799-FYCNwus3Kv.png?width=1200)
配列とは
![](https://assets.st-note.com/img/1679137768587-iia5aNOIj2.png?width=1200)
VBAを使うに至った過程で配列のとらえ方が違う。
ExcelVBAに限って言えば配列はWorksheetで事足りる。だから配列を使っていないVBAerが多い。
変数とは
![](https://assets.st-note.com/img/1679137942695-ZQnx9LXkQD.png?width=1200)
![](https://assets.st-note.com/img/1679137954640-orOGX5uw2h.png?width=1200)
実際にデータを保管している変数は、リンゴの売上額。
Rとかis100個売り上げた日があった などは、プログラムを動かすための道具に過ぎない。
![](https://assets.st-note.com/img/1679138077437-WNHbpQIEV9.png?width=1200)
変数の種類(概念的な種類)
つまり変数にも種類がある。あくまで概念的な種類であってVBAの規約ではない。主に使うものは上の3つ。データを保管する箱はシート上のセルで十分なのだが、主に配列にする変数は一番下のデータを保管しておく変数である。
![](https://assets.st-note.com/img/1679138156439-jXQxvSJIBx.png?width=1200)
配列の使いどころ
![](https://assets.st-note.com/img/1679138321833-6OMuLVcfY7.png?width=1200)
変数の数が動的とは
商品名が何種類あるか分からない。
![](https://assets.st-note.com/img/1679138429019-lu4ObPnqa9.png?width=1200)
んじゃDim 変数宣言をループで回せばいいんじゃない?
※このプログラムは動かないけど、やりたいことのイメージはこんな感じ。
![](https://assets.st-note.com/img/1679138390813-87Hqvv1pap.png?width=1200)
これをExcelシートでイメージするとこんな感じ。
商品コードの数だけ行を確保し、その右列で必要な計算を行う。
![](https://assets.st-note.com/img/1679138564693-c6udWoX4E8.png?width=1200)
2019までは事前に商品コードを記載するか、VBAで実施するしかなかったが2021以降のスピル機能でVBA使うことなく出力できるようになっている。配列数式はもともとあったがそれを出力に使える様にしたのがスピル。
こういうこともあってさらに配列の必要性が低くなってしまった。
![](https://assets.st-note.com/img/1679138670181-Jc4aYRtRmO.png?width=1200)
![](https://assets.st-note.com/img/1679138795119-13DrBWyYLp.png)
ワークシートで配列をイメージ
![](https://assets.st-note.com/img/1679138838856-eZ4gS1VZzL.png?width=1200)
![](https://assets.st-note.com/img/1679138955893-oroL1lXHRF.png?width=1200)
下の表から商品コード毎の件数、数量、金額の合計をセルに足し込んでいくプログラム。
![](https://assets.st-note.com/img/1679138888894-Hvm2wqWO0F.png?width=1200)
結果、これを作る。
![](https://assets.st-note.com/img/1679138280582-M3tZA0FsU5.png?width=1200)
そもそもExcelを利用していたユーザはフィルタしたりSUMIFやCOUNTIFSで十分なのです。なので配列必要ない・・・ってなる。
でも今日はそこをあえて配列使って勉強していく。
配列に組み合わせると有用なテクニック
Enum
例えば商品コードはCells(R,7)とかCells(R,"G")と記述されることが多いが、7とかGが何を意味してるか分かりにくい。こんな時使うのがEnum
![](https://assets.st-note.com/img/1679139377560-fZarKP1WMR.png?width=1200)
![](https://assets.st-note.com/img/1679139433206-j6ygYKrauZ.png)
![](https://assets.st-note.com/img/1679139506192-RDEn42QaUO.png)
![](https://assets.st-note.com/img/1679139814016-h3zJjSVzi2.png)
汎用関数化
![](https://assets.st-note.com/img/1679139773554-gBaowf57p7.png?width=1200)
![](https://assets.st-note.com/img/1679139998793-b0mXdoD2ts.png?width=1200)
これでコード中にWorksheetFunctionって長々と書く必要がない。
![](https://assets.st-note.com/img/1679140048985-td9qiMbgxV.png)
![](https://assets.st-note.com/img/1679140203031-SMPKgFVwxa.png)
Worksheet
Array/Collection/Dictionaryと書いたが、実はWorksheetを含めて4大配列。
地道に加算するのではなく、CountIfで計算してしまうコード。
![](https://assets.st-note.com/img/1679140112364-ECTrFcPiLt.png?width=1200)
![](https://assets.st-note.com/img/1679140218630-fnjipPANF4.png?width=1200)
毎ループ加算する人もいれば、CountIfしかしたことない人もいるのがExcelVBAerの面白いところ。
Worksheetを配列として使うことがまず第一。
Formulaを使う
まずは商品個コードだけを並べる
![](https://assets.st-note.com/img/1679140350905-4wcULKTDXd.png?width=1200)
![](https://assets.st-note.com/img/1679140546161-LyWiJIWLQC.png)
その後 はセルに数式を記入し、それを値化する。
![](https://assets.st-note.com/img/1679140412210-IqixZoq1ak.png?width=1200)
![](https://assets.st-note.com/img/1679140986637-ls5oiL9gdt.png?width=1200)
一番上のセルアドレスを指定した計算式を使うことで指定した範囲にはその行用の計算式に変換されて記入される。
![](https://assets.st-note.com/img/1679141146337-6S6lK9td3s.png)
![](https://assets.st-note.com/img/1679140390522-E8FcgSxmlb.png?width=1200)
![](https://assets.st-note.com/img/1679140602719-5SMIlVPPPs.png?width=1200)
しかもこれはめちゃめちゃ処理速度が速い!
理由はセルへの書き込む回数が少ないから。(1列毎に2回)
これが使えればArrayはいらない!
![](https://assets.st-note.com/img/1679140788384-XGvzxyj5HF.png)
Worksheet/Array/Collection/Dictionary
今日はこれらの概念の説明、良いところ悪いところを主に説明。
Worksheetの特徴
![](https://assets.st-note.com/img/1679141243122-LFeGn1MnXR.png?width=1200)
「目に見える」というのが非常にいい!
配列がないと記述できない言語と違って、このWorksheetが付属しているというのが最強!
WorksheetをVBAで扱うテクニック4選
![](https://assets.st-note.com/img/1679141509270-kzFt1qO7OL.png?width=1200)
![](https://assets.st-note.com/img/1679141627016-QoY28jFpXs.png?width=1200)
WorksheetをVBA用の配列として扱う
![](https://assets.st-note.com/img/1679141726554-X179tnl666.png?width=1200)
![](https://assets.st-note.com/img/1679141779893-wqxq3GyS9T.png?width=1200)
![](https://assets.st-note.com/img/1679141827314-1FF0MBEhBa.png)
開発中はこのDeleteをコメントアウトしておくことにより、配列に演算結果がのこる。これはデバッグ効率の向上につながる。
![](https://assets.st-note.com/img/1679141854547-4MKX6SdXiH.png)
Worksheetの弱点(遅い、1次元配列)
![](https://assets.st-note.com/img/1679141951855-bNjrrkiZrB.png?width=1200)
Arrayの特徴
![](https://assets.st-note.com/img/1679142034355-xw1Y2QbqTQ.png?width=1200)
![](https://assets.st-note.com/img/1679142085525-K3KKVZYaeC.png)
![](https://assets.st-note.com/img/1679142380689-LYZJ5OBCrH.png)
Array必修コード3選
![](https://assets.st-note.com/img/1679142308043-QmjNQKV7EX.png?width=1200)
必修コード1
![](https://assets.st-note.com/img/1679142390753-fkOGOHSvBi.png?width=1200)
必修コード2
![](https://assets.st-note.com/img/1679142531528-sbYXTzPfVi.png?width=1200)
必修コード3
![](https://assets.st-note.com/img/1679142712676-ecFStuONpe.png?width=1200)
![](https://assets.st-note.com/img/1679142896674-SoxzE831rT.png?width=1200)
![](https://assets.st-note.com/img/1679142703537-uuz2vfAh0q.png?width=1200)
![](https://assets.st-note.com/img/1679143013452-BjMbqgXKuh.png?width=1200)
Arrayは橋渡し役、Transpose関数の利用
![](https://assets.st-note.com/img/1679143075460-iCIcLliMpi.png?width=1200)
![](https://assets.st-note.com/img/1679143238599-pVFoomGrDS.png?width=1200)
サンプル
1次元配列はセルへ直接書き込めない
![](https://assets.st-note.com/img/1679143155740-dkUJVanuPI.png?width=1200)
![](https://assets.st-note.com/img/1679143203288-LooYv5jIqM.png?width=1200)
Collectionの特徴
![](https://assets.st-note.com/img/1679143263869-0vwp3LCCzv.png?width=1200)
Dictionaryとの違いは?・・・あんま違いない。
DictionaryはCollectionができないことをできる様にしたものなので、Dictionary使えればCollectionは出番がない。
![](https://assets.st-note.com/img/1679144192871-lG6umlSjh6.png)
Collection.Addが便利
![](https://assets.st-note.com/img/1679143431272-KKJRW9X048.png?width=1200)
.Addで要素が追加できるのが素晴らしい。Worksheetだと行番号などの変数用意してコントロールする必要があるが、Collectionはそれ不要。
Keyの指定で結果(登録データ)を抽出
![](https://assets.st-note.com/img/1679143570389-YBaYgOAoeR.png?width=1200)
これらを解決してくれるのがDictionary
Dictionaryの特徴
![](https://assets.st-note.com/img/1679143911174-ABuijS1fds.png?width=1200)
Dictionaryの基本コード
![](https://assets.st-note.com/img/1679144107602-hHTiy8S8ac.png?width=1200)
![](https://assets.st-note.com/img/1679144182433-p8jQetB1SN.png)
![](https://assets.st-note.com/img/1679144273423-p84dNGsHFq.png?width=1200)
Dictionaryで重複なしリストの作成
![](https://assets.st-note.com/img/1679144277904-mq7ywdlkCr.png?width=1200)
![](https://assets.st-note.com/img/1679144358163-GAla02K2Xt.png?width=1200)
商品コードと商品名を抽出
![](https://assets.st-note.com/img/1679144518324-oA6HezK4CE.png?width=1200)
短縮記法(.Addを省略)
![](https://assets.st-note.com/img/1679144574736-UWQ9uiSRYy.png?width=1200)
![](https://assets.st-note.com/img/1679144717732-OH2lcE8XfU.png)
DictionaryでCountIF
![](https://assets.st-note.com/img/1679144633987-nhpfznagoC.png?width=1200)
![](https://assets.st-note.com/img/1679144705748-Nyqx6kjCJB.png?width=1200)
DictionaryでSumif
![](https://assets.st-note.com/img/1679144725699-eYwdlf0qpV.png?width=1200)
![](https://assets.st-note.com/img/1679144740759-K3V6pPh0Yy.png?width=1200)
![](https://assets.st-note.com/img/1679144785645-42lolGLdCs.png)
ツール完成版
![](https://assets.st-note.com/img/1679144808304-ufpSTIgvPQ.png?width=1200)
![](https://assets.st-note.com/img/1679144824990-zF46F52geQ.png?width=1200)
![](https://assets.st-note.com/img/1679144886309-iomPIS55Zc.png?width=1200)
![](https://assets.st-note.com/img/1679144945270-lguig41nRv.png?width=1200)
![](https://assets.st-note.com/img/1679144988042-1ddMCaiH6s.png?width=1200)
![](https://assets.st-note.com/img/1679145029686-GNrMfxMWCi.png?width=1200)
![](https://assets.st-note.com/img/1679145078923-T5SVAQyTWm.png?width=1200)
![](https://assets.st-note.com/img/1679145150922-AfV9GnMWFV.png?width=1200)
![](https://assets.st-note.com/img/1679145332625-ZgmmrP7bjX.png?width=1200)
使ったファイル
今日のちゅんちゅん日誌
和風スパゲティのレシピ ブログ
![](https://assets.st-note.com/img/1679145912491-7whoGljPl8.png)
しゃあのココナラリンクはこちら
![](https://assets.st-note.com/img/1679145900540-x2O7gjryGt.png)