カテゴリー
Microsoft

【Excel VBA】コレクションを 2 次元配列へ変換するいくつかの関数コード

ポイント

  • 配列の要素数がコレクションの要素数より多い場合、コレクション要素を入れられない配列要素には Empty が設定される。
  • 配列のインデックスは 1 次元目、2 次元目とも 1 から始まる。Range.Value に代入することを想定
カテゴリー
Microsoft

【Excel VBA】ダックタイピングでマップを実装するコード

【Excel VBA】Range.Value (2 次元配列) の行・列を操作するクラスのコード – oki2a24 にて RangeValue インスタンスに関数名を引数に渡してマップ処理をできるようにしてみました。けれども、支障があるくらい遅かったですの><。ですので結局マップで回す部分を取り出して、別の関数に渡してやり、結果を RangeValue インスタンスの元の場所に戻してやる、という方法を取りました。

別の方法として、ダックタイピングで関数をもつオブジェクトを RangeValue インスタンスに渡すのはどうかしら?と思いつきました。今回はその記録ですの♪

ポイント

  • ダック・タイピング – Wikipedia
  • ダックタイピングを試す前は、CallByName を使って擬似的にマップを実現した。
  • CallByName は遅かった。
  • 引数にオブジェクトを渡し、関数内でオブジェクトにあるはずの関数を呼び出してはどうか? → ダックタイピング
  • ダックタイピングでのマップも、思ったほど早くなかった。CallByName よりもわずかに早い程度。比較方法がよくないか?
カテゴリー

こねないピザ生地。3回目

かかった時間などメモ

  • 15分くらいで完了
  • テキトーに簡単に作れる。楽♪
  • 強力粉、ドライイーストなど、普段使わない食材を使うので、その準備だけ敷居が高い。

材料

カテゴリー
Microsoft

【Excel VBA】シートを追加してそのシートを変数に入れて扱うコードの書き方

VBA コード

Public Sub Test()
    Dim newSheet As Worksheet: Set newSheet = ThisWorkbook.Sheets.Add
    Debug.Print newSheet.Rows.Count
End Sub
カテゴリー
Microsoft

【Excel VBA】要素数、インデックス開始番号の不明な配列から配列へ値を詰め替えるコードの書き方

条件

  • 配列 A から配列 B へ値を詰めたい。
  • どちらの配列も、要素数とインデックスの開始番号が不明
  • エラーが発生しないようにしたい。
  • Step は 1 ずつ増える。

ポイント

  • ループしない方の配列のインデックス開始番号を予め取得し、インクリメントを自分で行う。
  • ループしている配列の現在のループ回数を、ループしない配列の要素数と比較することでインデックス外へのアクセスを防止する。
カテゴリー
Microsoft

【Vim】【Windows】_gvimrc、_vimrc の置き場所をユーザーの設定ファイルを置く場所に変更しました♪

今まで

  • グローバルな設定ファイル格納場所に置いていた。
  • gvim.exe のあるフォルダ(Kaoriya 版 Vim)
    C:¥Program Files¥vim74-Kaoriya-win32¥

変更後

  • 個人の設定ファイル格納場所に移動した。
  • C¥:Users¥username¥
カテゴリー
Microsoft

【Git】【Windows】diff で Excel の違いを見られるようにする方法

環境

  • Windows7 Professional 32bit
  • git version 2.7.2.windows.1

1. Go 言語および git-xlsx-textconv の導入

カテゴリー
Microsoft

【Excel VBA】配列の次元数を取得する関数コード

ポイント

  • わざとエラーを発生させ、次元数の判定に用いる。
  • On Error Resume Next でエラー発生時もコードの実行を継続させる。
  • UBound 関数を用いて次元を判定する。
カテゴリー
Microsoft

【Excel VBA】Range.Value (2 次元配列) の行・列を操作するクラスのコード

このクラスでできること

何種類もの表に対して、定期的に、同じ内容の編集を何度も繰り返し行う場合に役立つと存じます。同じ手作業を繰り返し行わなくて済むようになりますので、楽ができますの♪

  • 指定行の除去
  • 指定行の抽出
  • 指定した列内で、値の重複している行を削除
  • 指定した列内で、指定した値に一致した行を抽出します。
  • 値の一致した行を削除
  • 下側に 2 次元配列を追加

  • 指定列の抽出(列の入れ替え)
  • 指定した数分の列を最後に追加
  • 列を最後に追加し、指定文字列を挿入
  • 列を別の列へコピー
  • 指定した関数を、列のすべての要素に適用
  • 列の値を更新
  • 右側に 2 次元配列を追加 (指定した 2 次元目が一致する条件で)
  • キー、アイテムとなる列を指定して生成したディクショナリを返す。
  • 列を 1 次元配列として返す。
  • 列を 引数の 1 次元配列で更新

一方で、一度しか行わないのでしたら、本投稿のコードを使う必要性はない、という場合も多いかと存じます。

使うときのポイント

  • シートへの反映は、Range(Cells(起点行, 起点列), Cells(RangeValue.RowCount, RangeValue.ColCount)) のように起点となる行番号・列番号を指定すれば自動的にサイズを調整して反映するので楽。
  • 終点には RangeValue.RowCount・RangeValue.ColCount を指定するだけでよい。
  • MapCol 関数、MapColWithObj 関数はとても処理が遅い。数百ならば問題なかったが、数千処理させたら 1 分以上かかった。なお、配列操作で代替すると処理時間は 1 秒未満だった。
カテゴリー
Microsoft

【Excel VBA】配列をフラットなコレクションに変換する関数コード

Excel VBA には map reduce がございません。使いたいです (使いこなせているかどうかは別として)!これらのページ等を参考にすればできそうですの♪

map するためには、対象となる集合を用意する必要がございます。Excel VBA ですと配列、特に 2 次元配列を使うことが多いように感じます。これを map にかけるのは、、、なんだか難しそうですのでまずはコレクションで試してみたいですわ。

そのために、まずはコレクションを気軽に作れるようにしたいですわ♪そのようなわけで、どんな配列でもコレクションにする関数を書いてみましたの!