カテゴリー
Microsoft

【Excel VBA】ワークシートの入力内容をすべて削除してリセットするコード♪

ポイント

  • Range.Clear メソッドは次のメソッドの内容を含む。
    • Range.ClearComments メソッド → コメント
    • Range.ClearNotes メソッド → コメント
    • Range.ClearContents メソッド → 値と数式
    • Range.ClearFormats メソッド → 書式 (色や罫線、条件付き書式など)
    • Range.ClearOutline メソッド → ハイパーリンク
  • Range.ClearNotes メソッドと Range.ClearContents メソッドの処理は同じで、コメント削除 (詳細な検証はしていない)
  • リセット対象のワークシートをアクティブにする必要はない。
  • Range.Value = "" でもリセットが可能。ただし、Range.ClearContents メソッドならば計算式も更新される一方、Range.Value = "" は対象 Range を参照している計算式が更新されない。そのため、基本的に Range.ClearContents メソッドを使うのがよい。

準備

ワークシート “Sheet1” に次の内容を書き込んだセルを用意する。

  • 文字列
  • 太字の書式付きセル
  • コメント付きセル
  • 罫線つきセル
  • ハイパーリンク付きセル
  • テキストボックス
  • 図形
  • 画像

これらをすべて VBA からまっさらに削除してリセットいたします♪

カテゴリー
Microsoft

【Excel VBA】ワークシートに入力したマスタデータを VBA から簡単に利用できるようにしたクラスのコード!

追記。改善版を作りました♪こちらのコードの方がすっきりとしております。


エクセルワークシートにマスタデータを表現いたしました。

これを、VBA に取り込んで、VBA の他のコードから呼び出して検索して値を返すクラスを作りたいですの!

そのようにすることで、エクセルのワークシートから値を取得して何かの関数で絞り込んで、、、などと意識することなくマスタデータを取り出せるようにいたします♪

ポイント

  • マスタデータをユーザ定義型の Collection で扱おうと考えたが使えなかった
  • そこでクラス内にマスタの項目をプロパティとして定義する。そして自分自身のクラスをインスタンス化してマスタデータをプロパティに設定することでデータを扱えるようにする。
  • 自分自身のクラスには、データ構造以外に関数も含まれる。
  • 本来であれば構造を扱うクラス、処理を扱うクラスに分けるべき。
  • しかし、VBA にはクラス宣言のコードがないため、1つのファイルに両方を持たせるためにこれらを混在させた。
カテゴリー
Microsoft

【Excel VBA】「実行時エラー ‘1004’: Range クラスの Select メソッドが失敗しました。」への対処!

エラー再現手順

  1. Sheet2 を表示
  2. 標準モジュールで VBA を実行
  3. Worksheets(“Sheet1”).Range(“A1”).Select で次のエラー発生

実行時エラー ‘1004’: Range クラスの Select メソッドが失敗しました。

エラー再現エクセル・VBA コード

  • エクセルにシートを2つ用意する。「Sheet1」「Sheet2」
  • VBA では、標準モジュールを挿入してそこにコードを書く。
    Option Explicit
    
    Sub Test()
        Worksheets("Sheet1").Range("A1").Select
    End Sub
    

修正 VBA コード

  • Worksheets.Activate メソッドを Select の前に実行すればよい。
Option Explicit

Sub Test()
    Worksheets("Sheet1").Activate
    Worksheets("Sheet1").Range("A1").Select
End Sub
カテゴリー
Microsoft

【ASP.NET MVC5】Identity 2 をベースにした、ユーザー情報を DB に持つ独自の認証プロジェクトのチュートリアル

2016年8月18日11時12分追記: ソリューション全体をアップロードしました。

Identity をカスタマイズした独自の認証を持ったサンプルのアプリを作ってみました。Identity の拡張方法の習得を目標に、それ以外はシンプルに、あまりこだわらないようしております。

構築(勉強)の仕方

Visual Studio 2015 でプロジェクトを作成するときに認証処理を追加するように選択することができます。そうしますと、Identity を使用した認証ロジックと、ユーザーやロールを管理するデータベーステーブルが予め作られます。

このファイルやコードが大変参考になります。

そこで、ファイルの構成はプロジェクト生成時に自動作成される認証のあり方に近づけます。

コードの振る舞いや、内容の理解、実際に書くコードの内容は、参考ウェブページをお手本にいたします。

カテゴリー
Microsoft コンピューター

【Excel VBA】文字列の Date 型への変換判定、変換、年月日時分秒の取り出しコード♪

ポイント

  • 年月日を指定せずに時分秒のみを文字列指定した場合に Date へ変換すると、年: 1899、月: 12、日: 30、となる。
  • day 関数のみ、なぜか小文字からはじまる。

VBA コード

Option Explicit

Sub test()
  Dim s As String
  s = "2015/11/23 16:43"

  ' Date 型への変換判定
  Debug.Print IsDate(s)

  ' Date 型への変換
  Dim d As Date
  d = CDate(s)

  ' Date から年月日時分秒の取り出し
  Debug.Print Year(d)
  Debug.Print Month(d)
  Debug.Print day(d)
  Debug.Print Hour(d)
  Debug.Print Minute(d)
  Debug.Print Second(d)
End Sub
カテゴリー
Microsoft

【Excel VBA】重複しないリスト作成や、要素が 1 種類のみかどうかを判定するコード!

重複なしのリストは、VBA の辞書オブジェクトの Key を使用することで実現可能ですの!

今回はそのコードを書くときに使えるテクニックですわ♪

応用すれば、要素が 1 種類のみかどうかを判定するチェックにも使ますわね。

ポイント

  • objDictionary.Add Key:=keyValue, item:=itemValue という形だと、Key が重複した場合に実行時エラーとなる。
    「実行時エラー ‘457’ このキーは既にこのコレクションの要素に割り当てられています。」
  • このエラーを避けるには、objDictionary.Exists(keyValue) で重複チェックが必要。
  • objDictionary(keyValue) = itemValue と書けば、既存のキーであっても上書きするのでエラーとならない。
カテゴリー
Microsoft

【Excel VBA】配列やコレクションの定数クラスを用意するコード♪

追記。改善版を投稿しました!抽象度を上げ、よりシンプルになりましたの♪


ポイント

  • 標準モジュールでは、Const は定義できるが、Const で配列を定義できない。
  • クラスモジュールでは、Const を定義できないが、コンストラクタで値をセットしてゲッターから取り出すようにすることで Const のような配列を定義できる。
  • したがって、様々なパターンの定数を網羅するには、標準モジュールで 1 つ、クラスモジュールで 1 つの、合計 2 つの定数用ファイルを用意する必要がある。
  • Excel 2013 で試した。
  • ファイル名に「Const」が使用できないことを考慮し、「ConstM」「CstM」や、「ConstC」「CstC」といったファイル名を付けると良いのではないかと思う。

経緯

カテゴリー
Microsoft

【Excel VBA】オブジェクトがブーリアンに変換可能か判定するコード!

ポイント

  • VBA には対象オブジェクトがブーリアンに変換可能か確かめられるプロシージャを見つけられなかった。。。
  • 引数をブーリアン型へ変換する CBol プロシージャを使い、確かめる方法を採った。
  • 変換できれば 「True」を返す。
  • 変換できなければエラーを発生させるので、それをキャッチして変換できなかった結果「False」を返す。
  • 例外を判定に使うのは、例外の本来の用途の観点から、本当は採用したくなかった。。。

VBA コード

Option Explicit

' オブジェクトがブーリアンかどうかを確かめる。
Sub Test()
  If IsBoolean("False") Then
    Debug.Print "Boolean!"
  Else
    Debug.Print "Not Boolean><"
  End If
End Sub

''' <summary>
''' 引数がブーリアンに変換可能か判定します。
''' </summary>
''' <param name="vntTarget">判定対象オブジェクト</param>
''' <returns>ブーリアンに変換可能な場合は True、そうでない場合は False</returns>
Private Function IsBoolean(ByVal vntTarget As Variant)
  On Error GoTo ErrorHandler

  Dim blnCheck As Boolean
  blnCheck = CBool(vntTarget)
  IsBoolean = True
  Exit Function

ErrorHandler:
  IsBoolean = False
End Function
カテゴリー
Microsoft

【Excel VBA】現在年月日時分秒文字列を yyyyMMddHHmmss 形式で得るコード♪

ポイント・気がついたこと

  • yyyy → 4桁の年
  • mm → 2桁の月
  • dd → 2桁の日にち
  • hh → 2桁の時
  • nn → 2桁の分
  • ss → 2桁の秒
  • Excel 2013 で試したが、yyyyMMddHHmmss、yyyymmddhhmmss、の結果が同じだった。最初の MM は月で、次の mm は時間。大文字小文字が変わっても、月と時間が正しく表示された。なぜ?

VBA コード

Sub Test()
    Dim strNow As String
    strNow = Format(Now, "yyyymmddhhnnss")
    Debug.Print strNow
End Sub
カテゴリー
Microsoft

【Excel VBA】特定の ActiveWorkbook.Names (Names オブジェクト) を削除するコード!

の派生版ですの!

引数に Names オブジェクトの一部を渡すと、その文字列を含む Names オブジェクトをすべて削除するプロシージャを書きましたのでノートいたします♪

ActiveWorkbook.Names のポイント

  • Names オブジェクトは、セルやセル範囲に付けられる名前を指す。
  • Excel 2013 では、数式 > 名前の管理、で開いたウインドウの「名前」にあたる。
  • ActiveWorkbook.Names(1).Delete や ActiveWorkbook.Names(“名前”).Delete で削除可能
  • 名前指定で削除する場合は、シート名を含めないと一致せず、その結果削除できない場合があるので注意。
  • シート名を含めた Names オブジェクトの Name プロパティは、「シート名!名前」というフォーマットで格納されている。