カテゴリー
Microsoft

【Excel VBA】Range の情報を取得する方法整理!

ポイント

  • フィルタ結果が飛び地(歯抜け、複数のセル領域)となり、その可視部分を Range として取得した場合、複雑な結果が得られる。
  • 飛び地可視部分を取得したコードは Range.SpecialCells(xlCellTypeVisible)
  • 飛び地のセルを Range に含めた場合、それぞれのセル範囲の Range が作られる。
  • 飛び地は Areas プロパティの中に含まれるようになる。
  • Range のプロパティメンバとして Areas があり、Areas のプロパティメンバとして飛び地の Range が含まれる。
  • Areas 内の Range のインデックスは 1 から始まる。
  • 飛び地の Range の数は Areas.Count で取得できる。
  • 飛び地の Range は Range.Areas(n) で取得できる。
  • Union 関数を使用して複数の Range を統合した変数は、フィルタ結果が飛び地の可視部分の Range を取得した時の構造と同じ。

以上のことに気がついたわけですけれども、それを学習できたコードを残しておきますの♪

カテゴリー
Microsoft

【Excel VBA】イテレータを作って、列の選択肢を順番に選んでフィルタをかけるコード

ポイント

Iterator クラスでは、もれなく反復するために、最低次の機能があればよい。

  • HasNext 関数を用意し、次の要素があるかを判定できる機能
  • Next 関数を用意し、次の要素を取得できる機能
カテゴリー
Microsoft

【Excel VBA】配列を横方向に、縦方向に、縦横範囲に 1 度の操作で書き込むコード

ポイント

  • Range オブジェクトに配列を代入すればよい。
  • Range のセル数と、配列の要素数は一致させること。
  • 1次元配列 ⇒ 横方向に書き込み。
  • 2次元配列 ⇒ 1次元目が行に、2次元目が列に書き込み。
  • 縦方向に書き込むには、1次元配列を WorksheetFunction.Transpose 関数にかけた結果を Range に代入すればよい。

横、縦、縦横方向に書き込むサンプルコード

カテゴリー
Microsoft

【Excel VBA】配列の要素数に変数の数字を設定する方法

ポイント

  • Dim lngArray(lngLength ) As Long といった書き方は不可能で、コンパイルエラーとなった。
  • [コンパイルエラー: 定数式が必要です。]
  • Dim lngArray(100) As Long ならば問題ない。
  • 変数を配列の要素数に割り当てたい場合は、ReDim でサイズを指定する。

サンプルコード

Public Sub Test()
  ' 配列の要素数となる変数
  Dim lngLength As Long
  lngLength = 100
  ' 配列を宣言し、要素数に lngLength を設定
  Dim lngArray() As Long
  ReDim lngArray(lngLength)
  ' 配列の要素数を確認
  Debug.Print UBound(lngArray)
End Sub
カテゴリー
Microsoft

【Excel VBA】値が入力されている下端の行番号、右端の列番号を取得するコード♪

VBA コードサンプル

  • ワークシートの一番下から上方向に登って行って、入力されたセルと最初にぶつかったところを値が入力されている下端の行番号として取得している。
  • ワークシートの一番右から左方向に戻っていって、入力されたセルと最初にぶつかったところを値が入力されている右端の列番号として取得している。
Public Sub Test()
  ' 右端の列番号を取得
  Dim lngMaxCol As Long
  lngMaxCol = Cells(1, Columns.Count).End(xlToLeft).Column
  Debug.Print lngMaxCol

  ' 下端の行番号を取得
  Dim lngMaxRow As Long
  lngMaxRow = Cells(Rows.Count, 1).End(xlUp).Row
  Debug.Print lngMaxRow
End Sub
カテゴリー
Microsoft

【ASP.NET MVC5】マスタの値が重複しないように、モデルのプロパティにインデックスユニークを付ける

ポイント

  • [Index(IsUnique=true)] という Annotation 属性をプロパティに付けることでそのカラムは一意となる。
  • プロパティの型が String の場合、MaxLength も付ける必要がある。一意性をチェックするためには、カラムへの格納サイズが無限とも思われる String だとパフォーマンスが大きく低下するためと思われる。

モデルのコード

    public class Sex
    {
        public int Id { get; set; }
        [Required]
        [Index(IsUnique=true)]
        [MaxLength(10)]
        public string Name { get; set; }
    }

もし MaxLength 属性を付けなかった場合は、どうなったか?

カテゴリー
Microsoft

【Excel VBA】クラスの雛形

VBA クラスの雛形のポイント

  • mstrClassName はログ出力用にすべてのクラスに付けている。
  • コメントは、C# のドキュメントコメントに倣っている。正しいかどうかは不明
  • クラス名を、TypeName(Me) で取得し、コンストラクタでプロパティにセットしている。
  • 完全コンストラクタを意識する場合、セッターは使用しないが書いておく。
  • コンストラクタに引数を持たせることができないため、Init という名前の関数をコンストラクタの代わりとして使う。
カテゴリー
Microsoft

【ASP.NET MVC5】NuGet のパッケージアップデートを簡単に一発で行います♪【プロジェクト作成後にどうぞ】

NuGet コマンド

# アップデート対象となるパッケージを確認する
Update-Package -WhatIf
# アップデート実行
Update-Package
  • Visual Studio 2015 でプロジェクトを作成すると、様々なパッケージが予めインストールされる。しかし大体バージョンが古い。
  • 依存性を崩さないようにアップデートしたい。
  • 簡単にアップデートしたい。ツール > NuGet パッケージ マネージャー > ソリューションの NuGet パッケージの管理、からでも可能。しかし、1つ1つ手動で行う必要があり、手間がかかり、時間もかかる。
  • そこで、Nuget のパッケージマネージャーコンソールからコマンド1発でパッケージをアップデート
カテゴリー
Microsoft

【Excel VBA】はじめて VBA でクラスを使う時のためのメモ

ポイントメモ

  • 挿入 > クラスモジュール、で追加
  • クラスモジュールを入れるフォルダが出現し、その中にクラスファイルが追加される。
  • クラスモジュールフォルダ内に、更にフォルダを作ることはできないようだ。
  • 左の窓、プロパティでクラス名(ファイル名)編集
  • クラス宣言をファイル内に書かない。よって、ファイル内を見てもクラス名は分からない。
  • 引数を渡してのコンストラクタは無い。
  • インスタンス化時に自動で行われる初期化処理はある。
    • クラスに次を書く。Private Sub Class_Initialize()
    • Set CInstance = New ClassSkeleton、したときに呼ばれる。
    • 宣言したプロパティ変数を、明示的に初期化するのによい。
  • デストラクタがある
    • クラスに次を書く。Private Sub Class_Terminate()
    • Set CInstance = Nothing すれば呼ぶことができる。
  • プロパティについて。プロパティプロシージャを使う。セッターと、ゲッターがある。
    • 変数宣言は、クラス内で Private で宣言し、クラス外からはセッター、ゲッターを使用して操作する。
private _hoge As String
  • セッター。
Public Property Let Hoge(strValue As String)
    _hoge = strValue
End Property
  • ゲッター。
Public Property Get Hoge() As String
    Hoge = _hoge
End Property
  • クラス外からセットするとき。
    CInstance.Hoge = "セッターに格納"
    
  • クラス外からゲットするとき。
Dim hoge As String
hoge = CInstance.Hoge
  • TypeName(Me) でこれを書いたクラス名を取得することができる。
  • インスタンス化するときは、変数宣言とまとめないで、2行に分けて行う。
    Class_Initialize プロシージャ呼び出しのタイミングを制御するため。
Dim fuga As Fuga
Set fuga = New Fuga
カテゴリー
Microsoft

【ASP.NET MVC5】今度は CSV インポートのサンプルプロジェクト作成チュートリアル

にて DB データをエクスポートする機能を紹介いたしました。

今回は、対となるインポート機能を開発いたします♪

インポート機能のポイント

こちらのシステムでインポート機能を考えます。ポイントは次の 2 点です。

  • CSV の 1 行に Parent とその Child を記入する。
  • インポートできる子ども (Child) は 2 人まで。

Parent 1-n Child という関係を持っております。

ですのでシステム上は、Parent は必ず 1 つですけれども、それに紐づく Child はいくつあっても問題ありません。

ですけれども、インポート機能におきましては子どもの数の最大数を制限しませんと CSV ファイルの仕様を固めることが難しくなります。

したがいまして、今回は Child の数を最大 2 つとし、それ以上登録したい場合はウェブブラウザから追加する、という運用方法を想定いたしました。

CSV インポート開発の流れ

に沿ってサンプルプロジェクトを作成したところからスタートです。

ソリューションおよびプロジェクト名は Sample3 といたしました。

  1. コントローラー CsvController.cs をスキャフォールディング作成
  2. アップロードファイルに対応するモデル CsvFile.cs を作成
  3. アップロードするファイルの種類を検証する属性クラス UploadFileAttribute の作成
  4. ビュー Import.cshtml の作成
  5. インポート処理を司るサービスクラス CsvImportService の作成
  6. テスト CSV ファイル作成と、インポートの確認