k01ken’s b10g

He110 W0r1d!

VBA(Excel)でオートフィルター関連についてのメモ

開発環境は、Windows 10 Pro(64bit)。

AutoFilterで指定する際に、Range("A1")で指定した場合、1行目を横に進んで空白の直前までがフィルターとして適用される。その場合、Range("A1:K1")のように指定すると、途中で空白があっても、A~K列までフィルターが適用される。

オートフィルターを設定する

'表全体を選択する
ActiveSheet.Range("A1").CurrentRegion.Select
'オートフィルターを設定する
Selection.AutoFilter

オートフィルターをクリアする(消去する)

ActiveSheet.Range("A1").AutoFilter

オートフィルターの絞り込みの条件を解除する

If ActiveSheet.FilterMode = True Then
  ActiveSheet.ShowAllData
End If

1つの列に複数の条件を指定する

条件を配列に入れて、Criteria1に指定する。

Dim ListArray(3) As String
ListArray(0) = "リンゴ"
ListArray(1) = "バナナ"
ListArray(2) = "ミカン"
ListArray(3) = "イチゴ"

ActiveSheet.Range("A1").AutoFilter Field:=9, Criteria1:=ListArray, Operator:=xlFilterValues

指定した条件を除外したい場合(単一、複数両方とも)

※除外するものは最大2つまでが限界。そこで、除外したいものが3つ以上ある場合、全体からその除外したいものを引いたものを配列に入れて、それを、Criteria1に渡せばよい。

'aaaを除外
ActiveSheet.Range("A1").AutoFilter Field:=9, Criteria1 := "<>aaa", Operator:=xlFilterValues
'aaaとbbbを除外
ActiveSheet.Range("A1").AutoFilter Field:=9, Criteria1 := "<>aaa", Operator := xlAnd, Criteria2 := "<>bbb",  Operator:=xlFilterValues

Pythonでパッケージを作成する

開発環境は、Windows 10 Pro(64bit) + Python 3.7.6。

1.TestPackgeディレクトリを作成する

2.TestPackgeディレクトリに空の__init__.pyを作成する

3.TestPackgeディレクトリに以下のコードをTest.pyで保存する

class Test():
  def __init__(self):
    self.name = "Test Class"

  def setname(self, new_name: string):
    self.name = new_name

  def getname(self) -> string:
      return self.name

4.TestPackageを使ってみる。
TestPackageディレクトリのある場所と同じ場所に、
以下のコードをtest_use.pyという名前で保存する。

import TestPackage.Test
# from TestPackage.Test import Test
# とすると、obj = Test()で読み込める。

if __name__ == '__main__':
  obj = TestPackage.Test.Test()
  print(obj.getname()) # Test Class
  obj.setname("Koiken")
  print(obj.getname()) # Koiken

■参考リンク
Pythonでパッケージを作成する方法
Pythonでモジュールをインポートする:import, from, as

Pythonで色んな日付を取得する

開発環境は、Windows 10 Pro(64bit) + Python 3.7.6。

先月の末日を取得する

import datetime
today = datetime.date.today()

# 当月の1日
thismonth = datetime.datetime(today.year, today.month, 1)
# 先月の末日
lastmonth = thismonth + datetime.timedelta(days=-1)

print(lastmonth.strftime("%Y")) // 2021
print(lastmonth.strftime("%m")) // 05


relativedeltaモジュールを使用するとより簡単そうです。ただ、事前に以下のパッケージを取得する必要がある。python-dateutil 2.8.1

pip install python-dateutil

今日から1か月前、2か月前を取得する

from datetime import datetime
from dateutil.relativedelta import relativedelta

# 2021-06-15
print(datetime.strftime(datetime.today() - relativedelta(months=0), "%Y-%m-%d"))
# 2021-05-15
print(datetime.strftime(datetime.today() - relativedelta(months=1), "%Y-%m-%d"))
# 2021-04-15
print(datetime.strftime(datetime.today() - relativedelta(months=2), "%Y-%m-%d"))


■参考リンク
Pythonで昨日や明日、来年、去年などの日付を計算する方法

VBA(Excel)で列をずらした際に修正するのが面倒なことに対する対策

開発環境は、Windows 10 Pro(64bit)。動作検証はExcel 2019。

Excelでテーブル形式のデータをVBAで処理する場合、完成したファイルの列の位置を変更するような修正をした場合、関係する部分をすべて修正しなければいけないので、非常に面倒くさく、保守性が悪いです。そこで、どうすればいいか考えたところ、列の見出しと列のアルファベットをディクショナリ型の対応関係にして、処理すれば、何とか、いちいち修正することなくできるのではないか?と思い、以下のコードを書いてみました。

'[関数名]
'列の自動設定
'[関数の機能]
'列を追加するとズレてしまう対策として、列の見出しとアルファベットを対応させることにした
'ただし、前提条件として、見出しが重複しないこと、かつ、空白でないこと
'[使用するタイミング]
'列を追加、削除、移動するたびに起動させる
'[引数]
'rng Range - "A1"などの、列の開始(一番左)のセルを指定
'dict Object(Scripting.Dictionary) - データを入れるための連想配列のオブジェクト
'[戻り値]
'なし
'[動作検証]
'検証済み

Function 列の自動設定(ByRef rng As Range, ByRef dict As Object)
  'リセットする
  Set dict = CreateObject("Scripting.Dictionary")
  Dim 行番号 As Long
  Dim 最初の列番号 As Long
  Dim 最後の列番号 As Long
  
  行番号 = rng.Row
  最初の列番号 = rng.column
  rng.End(xlToRight).Select
  最後の列番号 = ActiveCell.column
  
  '対応するデータが完成
  For i = 最初の列番号 To 最後の列番号
    dict.Add cells(行番号, i).Value, Split(cells(行番号, i).Address(True, False), "$")(0)
  Next i
End Function

'使い方
Sub Main()
  Dim dict As Object
  Set dict = CreateObject("Scripting.Dictionary")
  '例えば、見出しが一行目にあって一番左のアドレスがA1だった場合
  Call 列の自動設定(ActiveSheet.Range("A1"), dict)

  For Each itm In dict
    Debug.Print(itm & ":" & dict(itm))
  Next itm

  '後は、列のアルファベットを指定する部分で、dict("列の見出し")の変数を渡すだけ
  'そして、列を変更するたびに、『列の自動設定』関数を起動して修正するだけ
  'dict.Item("年齢")
  'のように指定する。
End Sub

使ってみると、修正が、かなり、楽になり、面倒くさいなぁという気持ちも軽減しました。

Evernoteが使えない。本当に。

環境は、Windows 10 Pro(64bit)。

いつもは、Evernote Desktopを使っていて、久々にアップデートしてみると、新しいバージョンは同期するためのボタンがない。
そこで、Evernote Webにアクセスしてみると、以下のように「Evernote Web を読み込めませんでした。ページを再読み込みしてください。」となって、ページを再読み込みボタンをクリックしても、同じ状態が続くだけのお手上げ状態になってしまった。
f:id:k01ken:20210707231157p:plain
Firefoxだからダメなのかと思い、Chromeでやっても同じ調子。

ネットで検索しても、同様のことでハマっている人が見受けられず、途方に暮れてしまう。

また、メールアドレスは、Gmailで登録してるんですが、なぜか、gmail.comではなくて、gmai.comとして、設定されていて、登録したメールアドレスにメールを送ろうとしても、gmai.comとなっているので、Gmailのメールサーバーに到達せず、どうしようもない、お手上げ状態。
f:id:k01ken:20210707233106p:plain

これは、何なんでしょうか?「有料会員に、ならないと、お前が今まで貯めこんだデータは、返さないぞ」という新手のランサムウェアなのでしょうか?ここまで、ひどいサービスになるとは思わなかった。なんて使いづらいんだ!!!

そこで、別のサービスに乗り換えることにしました。そのために参考にしたのか以下のブログの記事。
Evernoteの大型アップデートでガッカリして乗り換えを決意

まず、Evernote Legacyで以前のバージョンに戻してから、段階的にOneNoteなど、他のクラウドサービスに移行させます。

OneNoteを使ってみたけれども、

  • 入力しても反映されるまでに時間がかかる
  • ノート自体が変な枠で覆われている
  • フリーズしていないのに、入力が反映されない

など使いづらい面があるので、これも除外します。

正規表現についてのメモ

開発環境は、Windows 10 Pro(64bit)。

■直前の表現が0文字か1文字

?

[具体例]

a?sagao

「asagao」もしくは「sagao」にマッチする

■直前の表現が0文字以上

*

[具体例]

a*sagao

「asagao」もしくは「sagao」もしくは「a....asagao」(....はaの繰り返し)にマッチする

■直前の表現が1文字以上

+

[具体例]

a+sagao

「asagao」もしくは「a....asagao」(....はaの繰り返し)にマッチする

■任意の1文字

.

[具体例]

.sagao

「asagao」や「isagao」や「usagao」などがマッチする

■カッコ内にあるどれか1文字

[]

[具体例]

[abc]defg

「adefg」「bdefg」「cdefg」のどれかにマッチする。他にも、

[a-zA-Z0-9]

のように、アルファベットや数字をまとめて書くことが可能。上記の場合は、小文字のa~z、大文字のA~Z、数字の0~9のどれかにマッチする。ハイフンは、カッコ内の最初か最後に指定することで、リテラルとしてマッチさせることができる。
ハイフン以外の、+や*や.や?など、正規表現として使うものも、並べる順番を考えないといけないがそのまま組み込むことができる。

■カッコ内にあるどれか1文字以外

[^]

[具体例]

[^abc]defg

「adefg」「bdefg」「cdefg」以外にマッチ。

■文章の始めか最後であること

^ - 一番最初に設置することで、続く表現が一番最初に来るとマッチ
$ - 一番最後に設置することで、直前の表現が最後に来るとマッチ

[具体例]

^abc
abc$
^abc$

上から、abcで始まるとマッチ、abcで終わるとマッチ、abcの3文字ちょうどだとマッチ。

Electron Forgeを使ってみる

開発環境は、Windows 10 Pro(64bit) + node v14.17.0 + npm 6.14.13。

簡単に、Electronのプロジェクトを簡単に作成/配布できるElectron Forgeを使ってみます。

1.公式サイトへアクセス。

2.コマンドプロンプトを立ちあげて、electron-forgeディレクトリを作成して、カレントディレクトリに

cd c:\ && mkdir electron-forge && cd electron-forge

3.Electron Forgeをインストールする

npm i -g @electron-forge/cli

4.Electron Forgeでプロジェクトを作成する。プロジェクト名は今回は、my-appとしておきます。

npx create-electron-app my-app

インストールに時間がかかります。

5.インストールが完了したら、Electronを起動してみる

cd my-app
npm start

以下が表示された結果。
f:id:k01ken:20210704165414p:plain

6.作ったアプリを配布したい場合は、以下のようにします。

npm run make

outディレクトリ内に完成品ができています。試しに、make/squirrel.windows/x64ディレクトリ内のmy-app-1.0.0 Setup.exeを起動すると、ローディング中のアニメーションが表示され、パソコン内にインストールが開始されます。最終的にウィンドウが表示され、デスクトップにアイコンが作成されます。
f:id:k01ken:20210704171436p:plain
次からは、そのアイコンをダブルクリックすると、アプリが起動します。使わなければ、インストールしたソフト一覧から、単に、アンインストールするだけでOKです。