投稿

映画「ウイッシュ」のエア感想

 ディズニー100周年記念作品として作成された映画「ウイッシュ」  私は見てないし、今後見る予定も特に無いんですが、YouTube で批評動画をいくつか見て、自分も視聴済みのような気がしてきたので、エア感想というかエア考察してみようと思います。実際にはみていないので、間違ったことばかりと思いますが、まあいいでしょう。  この映画、悪役である マグニフィカ王 が、国民から集めた「ウイッシュ」を集めているが、国益に反する可能性がある「ウイッシュ」はかなえることがないという思想が、国王の考え方としてはあたりまえじゃないかという感想が多いようです。  そのような意見もその通りではあるのですが、この作品における「ウイッシュ」というのは、希望とか夢、望みという物ではありません。この作品は 寓話 であり、見た目をそのまま受け取るのは必ずしも正しくありません。  この作品における「ウイッシュ」というのは、観客に夢・希望を与えるために、ディズニーが今まで作ってきた作品、これから作られる作品のことを指しています。  アーシャ の おじいさん の「ウイッシュ」がかなった結果、「星に願いを」が奏でられたり、 マグニフィカ王 がかなえなかった「ウイッシュ」が、ピーターパン や メリーポピンズ であったりすることからも、それがわかります。  そう考えると、不都合な「ウイッシュ」をかなえない マグニフィカ王 というのは、作品を制作するか決定する ディズニー の経営陣に当たります。ロサス王国 の 国民たち は、作品を作ろうと企画する制作スタッフです。制作スタッフたちは、いろいろな作品をつくりたいという「ウイッシュ」を抱きますが、経営陣たる マグニフィカ王 は、ディズニーという会社としての思想に反しているもの、例えば 反ポリコレ思想 のようなものは、会社の思想に不都合であるため、かなえられる( = 制作する)ことはありません。  つまり、この 映画「ウイッシュ」という作品は、自由に作品を作れないでいる制作スタッフの抗議なのです。  いや、本当のことは知らないですけどね。

VBA 引数として渡す変数とその宣言

 以前、VBAを使用してエラーが出たため、検索してみた内容で、 他のプロシージャや関数に引数を渡すときに変数を使用しようとするとエラーが出ることがあるんですが、 Dim で変数を宣言するときに、複数の変数を一つの行で同時に宣言しているとエラーが出ることがあるので、変数はひとつずつ宣言しましょうというのを見た。 当時、何でだよ?とか思ってたんですが、最近調べていたら、 Dim Param1, Param2 As String のように宣言した場合、String型として宣言されているのは Param2 だけで、Param1は型が宣言されておらず、Variant型になるそうな。 Param1 と Param2 両方を String型として宣言したい場合は、 Dim Param1 As String, Param2 As String とそれぞれ型を指定してやらないといけなかった。 あ~、このせいで引数に設定したときにエラーが出るんだなぁとおもったけど、引数の型が Variant型だとエラーになるという状況がよくわからず再現できていない。もうちょっと調べてみよう。 1/25 追記 引数を参照渡しの ByRef で設定されているところに、型が違う変数(Variant型含む)を渡すとエラーになる。ライブラリに登録されている メソッド・プロパティは大抵 ByRef に設定されているので、そこに 上記のように Dim Param1, Param2 As String のように宣言してしまって Variant型になっている変数を渡してしまうとエラーになってしまう。

VBAのRangeでセル範囲を動的に取得しようとすると「400」というエラーが発生する

 VBAでセル範囲を動的に取得しようとしたときに、「400」と書かれたダイアログが表示され、デバッグモードにもならずマクロが終了してしまうことがあります。 VBAのコードとしてはこんな感じで、指定したシートのセル範囲を取得しようとしています Dim WS As Worksheet Dim Rng As Range Dim AX, AY, BX, BY As Long Set WS = Worksheets("名簿") 'AX, AY, BX, BY の値は別途設定されているものとします Set Rng = Range(WS.Cells(AX, AY), WS.Cells(BX, BY)) 実行してみると、「400」というエラーが発生する場合があります。 検索してみると、存在しない範囲を取得しようとするとエラーが発生するとか書かれていたりするんですが、セル座標に使用している変数の値に問題はない。そもそも同じようなやり方で以前は動いたはず・・・。と悩んでいましたが、このエラーの原因がわかりました。 その理由は、 コードを書く場所を間違っている 正確に言うと、 コードを書く場所によって記述方法が異なる というものでした。 VBAのコードを記述する場所には、 標準モジュール・クラスモジュール・ブックモジュール・シートモジュールの4種類があります。シートモジュール以外であれば、上記の書き方でも動作します。 しかし、シートモジュールに記述して、他のシートの範囲を取得しようとすると、エラーが発生します。 シートモジュールに記述する場合は、 Set Rng = WS.Range(WS.Cells(AX, AY), WS.Cells(BX, BY)) このように、Range関数、その引数として使われているCells関数、どちらもどのワークシートのセル範囲なのかを明記してやれば、シートモジュール上でも問題なく動作します それ以外の方法として、 Set Rng = WS.Range(Chr(AX+64) & AY & ":" & Chr(BX+64) & BY) みたいな感じで、セル範囲のアドレスの文字列を作ってやる方法でも動作しますが、ちょっと面倒ですね

VBAで「このページから移動しますか」というダイアログを閉じる

 前回の続きでもありますが、ブラウザでページを閉じようとしたり、他のページに移動しようとした時に、「このページから移動しますか」というダイアログが表示される場合がありますが、VBAでスクレイピングしようとした時に邪魔になったりします。 Pythonとかでやるのであれば、リンク先のURLを直接GETして、BeartifurSoupに放り込むだけなので、ページ遷移とか気にしなくていいんでしょうが、VBAだとIEを間接的に操作して行うので、このダイアログをなんとか閉じなければいけないようです。 WindowsAPIから、SetForeGroundWindow とSendKeysを使用して、無理やりENTERキーとか、スペースキーを押してやるという方法もありますが、その瞬間フォーカスを奪われてしまうので、VBAを走らせながら、他の作業を同時にやってたりすると、ちょっとストレスになってしまいます。 というわけで、VBAからなんとかこのダイアログを閉じる方法を探してみましたが、微妙にうまく動作しないので、あれこれと組み合わせたりちょっと修正を加えたりした結果です。  ObjIE.Document.Script.SetTimeout "javascript:open('about:blank', '_self'),close();",10  Application.Wait Now() + TimeValue("00:00:01")  hWnd = FindWindow(vbNullString, "Winows Internet Explorer")  If hWnd <> 0 Then     PostMessage hWnd, &H111&, vbOk, 0  End If もちろん、WindowsAPI の FindWindow とPostMessage をしようしているので、それぞれDeclare で宣言しておく必要があります。 "Winows Internet Explorer" の部分はもちろん IE の場合なので、このあたりは環境によって変更が必要でしょう。 いろいろ見て回ったので、どこのサイトかわからなくなってしまいましたが...

システムのシャットダウンは既にスケジュールされています

「システムエラーです: &H800704A6(-2147023706) システムのシャットダウンは既にスケジュールされています」 というエラーメッセージが出ました。 作成したVBAは、IEで2つのページをスクレイピングするマクロでした。 1つ目のページを読み込み終わった後、2つ目のページを開く前、 具体的には Dim objIE As New InternetExplorer もしくは、 Set objIE = CreateObject("InternetExplorer.Application") という行で、IEオブジェクトを作成しようとしたときにエラーが出ます。 このエラーって、マクロで開くページとは別に、 IE で他のページが開かれている状態だと、発生しません。 ここからは推測になりますが、 Quit で IE を終了させても、裏で終了処理が動いており、 完全処理が終了する前に、新たに IEオブジェクトを作成しようとすると、 まだ IE を終了させている途中だからダメだよっていうエラーが出るようです。 他のページが開かれていると、IEのプロセスは終了されず、 残ったままですから、エラーが発生しません。 回避策は…、よくわかりません。15秒くらい待てば大丈夫ですけどね。 あるいは IEを完全に終了させないように、別のページを開いたままにしておくとか、 全ての作業が終わってから IEを終了させるかでしょうか?

VBAでOutlookメールのフォントを変更する

まあ、ぐだぐだと愚痴も書いていきますが、本題から書いておきます Sub FontTest()     Dim myOutlook As Object     Set myOutlook = CreateObject("outlook.application")     Dim myItem As Object     Set myItem = myOutlook.CreateItem(olMailItem)     Dim myDoc As Word.Document     Set myDoc = myItem.GetInspector().WordEditor     myItem.Body = "hogehoge"     myDoc.Content.Font.Name = "Meryo UI"     myItem.Display End Sub こういうのってブログに載せる際の作法とかあるのかな? まあ、よくわからないので気にしないでおきます。 エクセルVBAから新規にOutlookメールを作成するというのは 以前にやったことありまして、 今回、同僚が、私が以前作成したものを改変して作ったけど、 添付ファイルの前後でフォントが違ってしまう、との相談。 正直、なぜそうなったのか原因不明だし、私の環境じゃ その現象の再現もできなかったんですが、 フォントを全部変更しちゃえばいいでしょとか、 軽く答えてみたが、その方法がよくわからなかったわけです。 VBAでOutlookのメール本文を編集しようとすると、 ものすごくめんどくさいんですよね。 メールがテキスト形式なら、bodyを適当に置き換えてやれば済みますけど、 HTML形式やリッチテキスト形式だと、 何が何だかわからない感じになります。 まあ、それはさておき、フォントの変更ですが、 ネットで検索するとなかなか答えが見つからず、 特にリッチテキスト形式のフォント変更の方法が見つけられませんでした。 リッチテキスト形式では変更できないから、 HTML形式にしてstyleタグを付け足せというものと、 一旦HTML形式に変換してフォント変更し...
 ブログというか自分用の備忘録です てきとーにノンジャンルで書こうかなとも思いますが、 とりあえずしばらくはVBAのことを書きます 仕事をしていて、エクセルをよく使わされるわけですが、 その時に、「こんなのひとつひとつ手作業でやるのめんどくさい、 マクロ組んでやればいいんじゃないの?」っていう、 おそらく職場でやらないほうがいいムーヴランキング上位に入ると 思われる、「VBA使えます」アピールをしてしまって、 あれこれと頼まれるようになってしまいました。 正直、VBAについて教室とかで教わったわけでもないし、 書籍とかで勉強したわけでもないので、 ググったりして調べながらポチポチと作成する程度なので、 他の人の参考にはならないし、 それは間違っているとか怒られそうですが、 気にしないで、VBAで気づいたことなどを書いていこうと思います。