タグ

ブックマーク / akashi-keirin.hatenablog.com (12)

  • シート名の変更を検知する(Excel) - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    シート名の変更を検知する(Excel) 各所から集めた大量のExcelブックを処理するとき、配布した様式ブックに保護をかけ忘れると、それはもう、好き放題にシート名をいじくられるw マクロで処理しようにも、シート名とかシートの順序を変えられると、ちょっと対応がむつかしいので、シート名が来のあるべき姿から変わり果ててしまったブックを検出するメソッドを作ってみた。 コーディング Worksheetsコレクションのインデックスに、ブックに存在しないシート名を指定すると、実行時エラーが出るので、その性質を利用した。 リスト1 標準モジュール Public Function hasAppropriateSheetNames( _ ByVal targetBook As Workbook, _ ByRef shNamesArray() As String) As Boolean '……(1)' On

    シート名の変更を検知する(Excel) - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2019/05/11
    “取得したWorksheetオブジェクトのNameプロパティの値(要するにシート名の文字列)を変数stalkingHorseにぶち込む。”
  • Outlookのメールを作成するクラスを作った - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    Outlookのメールを作成するクラスを作った 一気にOutlook版も行っちゃうよ! 今回も、 akashi-keirin.hatenablog.com このときのRecipientクラス、Senderクラスと併用するのが前提。 ソースコード クラスモジュール OutlookApp Option Explicit Implements IMailCreatable 'Module Level Variables' Private olApp As Outlook.Application Private isAvailable As Boolean 'Constructor' Private Sub Class_Initialize() On Error Resume Next Call Err.Clear isAvailable = False Set olApp = GetObject

    Outlookのメールを作成するクラスを作った - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2019/04/28
    “おわりに これで、普段使っているメールアプリが出揃ったぞ”
  • Filter関数というものがある - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    Filter関数というものがある こないだ、オブジェクト・ブラウザをぐりぐりやっていたら、「クラス」欄にStringsというものを発見。 ただし、オブジェクト・ブラウザ上では、「クラス」としてではなく、「モジュール」として記載されている。 Stringsを選ぶと、下の説明のところに、 Module Strings VBA のメンバー と表示される。 ご覧のように、メンバとして見たことのあるメソッド(関数)名がズラリ。 へえ~。知らんかった。 Filter関数 だいたい、どこかで見たことのある関数名ばかりだったのだけれど、 この「Filter関数」というやつは、知らなかった。(……っていうか、有名?) 説明書きには、 Function Filter(SourceArray, Match As String, [Include As Boolean = True], [Compare As V

    Filter関数というものがある - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2019/04/01
    “Filter関数というものがある こないだ、オブジェクト・ブラウザをぐりぐりやっていたら、「クラス」欄にStringsというものを発見。”
  • シートモジュールへのインターフェース実装の代案 - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    シートモジュールへのインターフェース実装の代案 ごく一部の(?)VBAerの間では、「シートモジュールにインターフェースをImplementsすると派手にバグる」というのは有名だと思う。「ごく一部で有名」であるということを「有名」と称するのかどうかはともかくとして。 参考 akashi-keirin.hatenablog.com akashi-keirin.hatenablog.com 大規模なExcelブックで生じがちなこと Excelはいろいろな使い方ができる。来の表計算から割と離れた用途で使われていることも多いと思う。うちの業界もその一つ。簡易なデータベース的な使い方が多い。人間のデータを元に名簿を作るとか。 そうなると、いきおい、〈一つのブックに大量のシート〉ということが生ずる。そして、ブックの中に、〈類似の特殊な役割を持った似たようなシート〉が複数生ずることも多い。 同じメンバ

    シートモジュールへのインターフェース実装の代案 - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2019/03/10
    “次に、NormalSheetプロパティ。こいつは、シートオブジェクトをWorksheet型にキャストして返す。シートオブジェクトはObject型で受け取っているので、ExSheetプロパティだと入力補完が効かない”
  • ThisWorkbookモジュールにインターフェースを実装することはできるのか - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    ThisWorkbookモジュールにインターフェースを実装することはできるのか 前回 akashi-keirin.hatenablog.com ブックのThisWorkbookモジュールにメソッドを搭載したら、まるでブックのメソッドであるかのように呼び出すことができることを示した。 では、ThisWorkbookモジュールにインターフェースをImplementsしたら、各ブックに共通メソッドの搭載を強制させることができるのだろうか。 ちょっとやってみた。 インターフェース作り クラスモジュールを挿入。 ChokiShowableというアホなオブジェクト名のインターフェースを作成。 で、次のようなコードを書いておく。 リスト1 クラスモジュール Option Explicit Public Sub showChoki() End Sub showChokiというメソッドを書いておく。 このイ

    ThisWorkbookモジュールにインターフェースを実装することはできるのか - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2019/02/24
    ChokiShowable でメソッドを作って、“ Workbooks.Open(ThisWorkbook.Path & "\ち~んw1号.xlsm")”に委譲すればいいのでは?ちょっと用途が違いますかなぁ。
  • ポート名(?)付きのプリンタ名を返すFunction - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    ポート名(?)付きのプリンタ名を返すFunction 前回、 akashi-keirin.hatenablog.com 前々回 akashi-keirin.hatenablog.com の集大成。 コード プリンタの名前を渡したら、ポート名(?)付きのプリンタ名を返すFunctionを作ってみた。 前回同様、オブジェクト名は「InstalledPrinter」とし、PredeclaredIdをTrueにしている。 リスト1 クラスモジュール Public Function getPrinterNameWithPort( _ ByVal printerName As String) As String getPrinterNameWithPort = "" Dim printersCount As Long printersCount = getPrintersCount Dim tmp A

    ポート名(?)付きのプリンタ名を返すFunction - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2018/09/29
    “プリンタ名の取得はできるので、ユーザーフォームでプリンタ名を選ばせるかして、このFunctionと組みあわせたら、端末を問わずにプリンタを適切に指定できるようになるのではなかろうか。”
  • プリンタの数を返すFunction - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    プリンタの数を調べるFunction Application.ActivePrinterにプリンタ名をセットしたくても、プリンタ名の後ろにくっついている「on NeXX:」の部分がわからないとセットできない。 同じプリンタに接続していても、端末ごとに「NeXX:」の部分が異なるので困ることになる。 そこで、「XX」の部分を「00」からインクリメントしてプリンタ名にヒットするかどうか確認することを考えた。 そのためには、ループ回数を決めるためにインストールされているプリンタの数を取得しないといけない。 プリンタの数自体は、 akashi-keirin.hatenablog.com このときのように、Shell.Applicationオブジェクトを取得したら簡単に取得できるので、Shell.Applicationオブジェクトをラップしたメソッドを作った。 コード 前回 akashi-keiri

    プリンタの数を返すFunction - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2018/09/29
    参照設定すればshellが型として使えるのか~、いいなー
  • 列挙体にはメンバを何個列挙できるか - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    列挙体はいくつまで列挙できるか 列挙体のメンバ数の最大って、いくつなのだろうか。 ちょっと調べてみた。 Integer型の最大値 Integer型の最大値は32767。へえ。意外と小さいな。 標準モジュールの宣言セクションに次のように書いてみる。 Public Enum MaxSize maxElement = 32767 End Enum んで、イミディエイトに Debug.Print maxsize.maxElement と打ち込んで[Enter]。 とりあえずクリア。 少なくとも3万2千768+1個までは列挙できるみたい。 Integer型の限界を超える 次に、Integer型の限界を超えられるかどうかテスト。 Public Enum MaxSize maxElement = 32767 nextElement End Enum 32767の次はあるのか。イミディエイトに次のように打

    列挙体にはメンバを何個列挙できるか - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2018/04/22
    すげ。面白実験。Enum値のLong境界超えたら補数の負のLong値になるのか。勉強になりました。#VBA #はてなブログ
  • isAutoFilteredメソッドの修正 - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    isAutoFilteredメソッドの欠陥 isAutoFilteredメソッドとは 自作のFunction。 akashi-keirin.hatenablog.com このときに作ったもの。 こんなふうにフィルターで絞り込まれていないときにFalseを返す。 イミディエイト・ウインドウに ?isAutoFiltered(Sheet1) と入力して[Enter]を押すと、 このとおり。 こんなふうに、フィルターで絞り込まれていると、Trueを返す。 このとおり。 重大な欠陥 しかし、このisAutoFilterメソッドには、重大な欠陥があったのだった。 AutoFilterオブジェクトのことが分かっている方は、すでにお気づきだったかと思うが、たとえば、 この状態のワークシートを指定して 実行しようと[Enter]を押すと、 実行時エラーになる。 理由は簡単。 そもそもAutoFilterオ

    isAutoFilteredメソッドの修正 - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2018/04/14
    こんなメソッドもあったんですね。ユーティリティ関数化されると確かに便利。でもテストに落とし穴が。自分もテストニガテ・・・
  • VirtualTableクラスは今 - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    VirtualTableクラスは今 VirtualTableクラスの現状 VLOOKUPにせよ、INDEX & MATCHの合わせ技にせよ、セルに数式がずらずらと書き込まれているというのはちょっとイヤなので、表引きは極力VBAでやっている。 んで、VLOOKUPみたいな働きを持ったクラスを作ったのが akashi-keirin.hatenablog.com このときの試み。 いろいろと使っていくうちに、今こんなふうになっている、というのをうpしておくことにした。 リスト1 クラスモジュール オブジェクト名は「VirtualTable」。 Option Explicit Private Type Exception Number_ As Integer Discription_ As String End Type Private Const NUM_NOT_INIT As Integer

    VirtualTableクラスは今 - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2018/04/01
    これは便利。
  • 値の重複を調べる[Excel] - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    値の重複の有無をチェックする(マクロ無し縛り) 久しぶりにマクロ無し縛りでExcelのシートを作ることになり、半分忘れかけていたことがあったので、備忘録的に記しておく。 1億2000万余名マイナス1億2000万名の非常に数少ないこのブログの読者の方ならおよそ見当がついていると思うが、私はExcel体の機能に精通する前にVBAにハマってしまい、畸形的な発達を遂げてしまっているので、ツッコミどころがたくさんあると思う。遠慮無くツッコミを入れてくださるとありがたい。 範囲内の値の延べ個数を求める COUNTA関数を使う まあ、これは初歩中の初歩でしょう。 こんな表があるとする。範囲はD2:D15。 んで、テキトーなセルに =COUNTA(D2:D15) と入力するだけ。 ご覧のように、引数で指定した範囲(D2:D15)の値を返してくれる。 ちなみに、私は「COUNTA」の「A」ってどういう意味

    値の重複を調べる[Excel] - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2018/03/20
    SUMPRODUCT天才すぐる!
  • 部屋割りマクロ(Excel)のリファクタリング(3) - 素人がExcelVBAによる「一人働き方改革」に挑むブログ

    部屋割りマクロのリファクタリング 傍流の処理を外に出す 前回の akashi-keirin.hatenablog.com のリスト2では、大まかに言って 引数のチェック 定員表の配列化 振り番処理 の3つの処理を行っていた。 メインの処理は、当然 3. の振り番処理。あとの2つは、そのための準備という位置づけだ。 今回は、とりあえず行数をっている 1. を外に出すことを試みた。 引数チェックの過程を外に出す 引数をチェックするFunctionを別途作って、メインのプロシージャからはそのFunctionを呼び出す、という形にする。 もちろん、全ての引数をチェックするFunctionを1つ作ることも可能だが、なるべく 1プロシージャ1機能 を旨とする。まあ、 血盟団 の 一人一殺 みたいなもんだな。←違う 引数チェック用プロシージャの数々 リスト1ー1 標準モジュール Private Fun

    部屋割りマクロ(Excel)のリファクタリング(3) - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
    kabacsharp
    kabacsharp 2018/02/18
    すげ。
  • 1