2024年11月15日金曜日

vbaで列の削除は一発でやれ

複数行の削除は、1行ずつやると、意図した行を消せないので、一発でやること。
 Columns("A:A,C:C,E:E,G:J").deleteで列削除は一発でやること。
 ちまちまと、Columns("A:A").Delete、次にColumns("C:C").Deleteとやると、意図した行が削除できない。

vbaで「インデックスが有効範囲にありません。」というエラーが出た時にはスペルミスを疑え

シート名やブック名に誤りがあると「インデックスが有効範囲にありません。」という謎のエラーが出る。ことがまま、ある。そういうとき、大体、スペルミスをしている。

vbaでシートをcopyすると、新ブックのシートにコピーされる、ActiveSheetはコピーされたシートになる。そして、新ブックをcloseすると、元のシートがアクティブになる。

アクティブシートは、スタックされている。新しいブックがcloseすれば、元のシートがアクティブになる。
 今、どのシートがアクティブなのかを把握していないと、プログラムは暴走し始める。

vbaをデバッグするときの作法について(how to debug for vba)

vbaのデバッグに便利なコマンド

  • イミディエイト・ウィンドウで、?ActiveSheet.Nameでアクティブシート名を出力する。
  • イミディエイト・ウィンドウで、?ActiveWorkBook.Nameでアクティブブック名を出力する。
  • イミディエイト・ウィンドウで、?Sheet("シート名").Range("A1").CurrentRegion.addressでセル範囲のアドレスを出力する。
  • ちょいちょいdebug.printせよ

2024年10月1日火曜日

SQL Serverのwhere句の%nnnnnnnn%と8桁の数字文字列を部分一致で抽出する際に9桁の文字列を除外する、ひとつの方法

 9桁目が数字以外のもの、[^0-9]とすればよい。
 例えば、where field名 like ’%12345678[^0-9]%' or field名 like ’%12345678'と書けば良い。
 これで、9桁以上の数字文字列が抽出されることはなくなる。
 ただし、9桁目に何らかの文字列(改行コード)でも可が必要だ。
でもないこともある。その場合は、お手上げだ。終わりを示す文字、例えば#を最後尾に付与するなどで、唯一無二、つまりユニークであることを保証する構造にする必要がある。
 いやいやそんなことないよ。where field名 like ’%12345678[^0-9]%' or field名 like ’%12345678'と書けば、9桁目に文字列がなくても良いと思う。

2024年7月22日月曜日

マイクロソフトからの「アクションが必要です」というメールになんとか対応してみた。

 マイクロソフトからのメールの本文によると、ワタシのoutlook.conへの接続方法は、「Microsoft の先進認証方法」になっていないため、2024 年 9 月 16 日以降はoutlookメールへ接続できなくなるというものだった。ちなみにワタシのソフト(macのメールapp)である。
 さて、どうしたらいいのか?
 メールには「ヘルプ記事「Modern Authentication Methods now needed to continue syncing Outlook Email in non-Microsoft email apps」を参照してください。」と記載されていた。誠に、不親切だ。
 このフレーズをぐぐると、macのメールappの場合、一旦、outlookのアカウントを削除し、再び、追加すれば(macのメールappは自動的にMicrosoft の先進認証方法になる)いいようだ。そして、やってみた。簡単にできた。
 これぐらいの話であれば、何故、メールの本文に書いてくれればいいのだがと、いつもながらの対応にイヤハヤ、感服してしまった。やれやれ、それそれ。

2024年4月27日土曜日

vbaのautoFilterで日付を指定してフィルターをかけるも思った通りにできない。なんでだろう?

 色々とグぐってみたら、どうやら、日付のフィルターには癖がある。というのは、例えば、2024/4/7と2024/04/27は別物になるようだ。
 これを回避するには、検索の対象列の書式に応じたフィルターをかけるということらしい。
 つまり、検索の列nの書式に応じて、AutoFilter n,Format(検索日,"yyyy/m/d")か、AutoFilter n,Format(検索日,"yyyy/mm/dd")にするを選択するわけだ。
 あるいは、AutoFilter n,Format(検索日,Cells(2,n).NumberForamatLocal)とする。