ラベル Excel の投稿を表示しています。 すべての投稿を表示
ラベル Excel の投稿を表示しています。 すべての投稿を表示

2020年2月19日水曜日

SeleniumBasic:SendKeysを使わずにテキストを入力

VBAでブラウザを操作するのに、IEからSeleniumBasic+Chromeへ移行してしばらく経ちます。不便に感じていたのがテキストボックスへの文字列の入力です。
IEならValueプロパティに値を設定すればよかったですが、 SeleniumBasicではなぜかそれができません。ネットで調べるとクリップボードに値を設定して、テキストボックス上でCtrl+vをSendKeysで実行するのが定番のようでした。なので今まではこうしていました。

Dim objDriver As ChromeDriver
Dim objKeys As Selenium.Keys
Dim objTemp As Object

    Set objDriver = New ChromeDriver
    objDriver.Get (URL)
    objDriver.Window.Activate
    Set objKeys = New Selenium.Keys

(中略)

    Set objTemp = objDriver.FindElementByName("txtExample")
    objTemp.Clear
    objDriver.SetClipBoard Sheet1.Range("A1")
    objTemp.SendKeys objKeys.Control, "v"

1回入力するくらいなら問題ありませんが、数十回数百回とループさせる場合は実行速度が遅く感じます。また実行中にうっかり他のアプリケーションでコピーしてしまうと、当然それがペーストされてしまいます。

解決しようとさらに調べていたところ、 ExecuteScriptというメソッドがあることに気づきました。JavaScriptの文字列を実行できるようで、これならValueに値を設定できることがわかりました。
上の(中略)以下は1行で済みました。

    objDriver.ExecuteScript "document.getElementsByName('txtExample')[0].value=" & Sheet1.Range("A1")

とりあえずこれで解決です。

2015年12月13日日曜日

Excel:指数表示にされてしまった数値を一気に直すマクロ

Excelで指数表示にされてしまった数値は、区切り位置指定ウィザードを使えば列ごと直せるのに気づいたのはもうずいぶん前のことです。


今は同じことをマクロでやっています。


Selection.TextToColumns DataType:=xlDelimited, FieldInfo:=Array(1, xlTextFormat)


マクロを使う利点は、特に複数列を処理する場合にあります。手作業では1列ずつしかできないからです。


Dim r As Range

For Each r In Selection.Columns
         r.TextToColumns DataType:=xlDelimited, FieldInfo:=Array(1, xlTextFormat)
Next


仕事でCSV形式のデータを扱うことが多く、今だに頻繁に使っています。

ついでにおまけです。
YYYYMMDD形式の日付データをYYYY/MM/DD形式に変換したい時、昔は関数を使って年・月・日の文字列を取り出して・・・なんてことをやってました。これも上の方法でデータ形式を指定すれば、列ごと変換できます。


Selection.TextToColumns DataType:=xlDelimited, FieldInfo:=Array(1, xlYMDFormat)


なぜか数式バーの表示が変わっていませんが、セルを選択し直すなどすれば更新されます。


これも便利な機能です。

2015年4月13日月曜日

Excel 2013/2010:.xlsのFormatConditions.Add

以下はExcel 2003の頃に.xlsファイルへ書いたプロシージャの例です。A~C列に対して、同じ行のD列のセルが1の場合にセルが黄色になるという条件付き書式を設定しています。

With Sheet1
     With .Columns("A:C")
          .FormatConditions.Delete
          .FormatConditions.Add Type:=xlExpression, Formula1:="=RC4=1"
          .FormatConditions(1).Interior.Color = vbYellow
     End With
End With

このプロシージャはWindows 7上のExcel 2010でもWindows 8.1上のExcel 2013でも動作します。


ところがこのファイルを.xlsm形式で保存し直したところ、上のプロシージャを実行してもセルの色が変わらなくなってしまいました。


どうもFormula1のところの反映のされ方が.xlsと違うようです。

.xls上で実行した場合:


一方、.xlsm上で実行した場合:


Formula1のところを以下のように修正したら当然ながら直りました。

With Sheet1
     With .Columns("A:C")
          .FormatConditions.Delete
          .FormatConditions.Add Type:=xlExpression, Formula1:="=$D1=1"
          .FormatConditions(1).Interior.Color = vbYellow
     End With
End With

こんな落とし穴があったとは。

2014年12月14日日曜日

Excel 2013:ActiveXコントロールが認識されなくなった件

今月のOfficeのセキュリティ更新後にActiveXコントロールが認識されなくなった件です。

本日実施した Windows Update 後から Excel 2010 の VBA が動作しなくなった - マイクロソフト コミュニティ

今のところ2010では直接確認していないのですが、2013・2007では同様のケースを確認できました。
下図は2013でシート上に配置したコマンドボタンです。


別のPCでこのシートを開いてコマンドボタンをクリックしたところ、2010(セキュリティ更新済み)では問題ありませんでした。一方、2013では下図のようになりました。デザインモードになっているわけではありません。


カーソルの形が変わるだけで押し下げすることはできません。CommandButton1_Clickプロシージャも実行されません。

下図は元のPC、別のPCそれぞれでデザインモードにしてみたところです。別のPCの方ではプロパティウィンドウにCommandButton1が表示されません。

シートを作成した元のPC
 
別のPC
当然ながらコードからCommandButton1を参照すればエラーになります。また、この状態から新たにActiveXコントロールを挿入しようとしてもエラーになりました。


なお図の通り元のPCは8.1、別のPCは7でした。Windowsのバージョンの違いが関係あるのかはわかりません。

この不具合を起こしているセキュリティ更新は特定されており、アンイストールすれば解決すると言われています。しかしセキュリティ更新なので削除はやめた方がいいように思います。
もう一つの回避策として冒頭のリンク先でも紹介されている、MSForms.exdを削除する方法を試してみました。


このファイルは、削除してもActiveXコントロールを含むシートを開けば自動的に再作成されます。

ところがこれだけでは解決しませんでした。それどころか2013で再作成されたMSForms.exdだと、同じPC上でなんともなかった2010でも同様の不具合が発生するようになりました。
うっかりしてたのですが、2013はWindows Updateとは別に更新が行われます。確認したところ元のPCも別のPCも最新のバージョンになっていませんでした。手動で更新を実行しました。


更新後、再度MSForms.exdを削除・再作成したところ不具合は起きなくなりました。
逆に、元のPCで不具合が発生するようになりました。こちらもMSForms.exdを削除・再作成したら直りました。要は更新前のバージョンで作成されたMSForms.exdが問題を起こすということでしょうか。

公式でもこの問題は認識されていて、対応中のようです。

Office 2010 ActiveX Disabled - December Update KB2553154 - TechNet Blogs

早く修正パッチが出るといいんですが。

2014年8月4日月曜日

Excel 2013/2010:意図しないListBoxコントロールのリサイズ

ListBoxコントロールのサイズが勝手に変わってしまうことがあります。IntegralHeightをFalseにすれば避けられると思っていたのですが、どうもそう単純ではないようなので少し試してみました。

下図はWindows 7上のExcel 2010でシートに配置したListBoxコントロールです。AddItemで項目が追加されるようになっています。これをWindows 8.1上のExcel 2013で実行すると、見た目の結果が異なりました。


IntegralHeightがTrueの場合、Windows 8.1上ではListBoxコントロールが元のサイズより大きくなってしまいました。 IntegralHeightがFalseの場合このリサイズは起こらず、代わりに中の文字が小さくなりました。

逆にWindows 8.1上のExcel 2013で同じものを作ってみると、Windows 7上のExcel 2010で実行してもこのようなことは起こりませんでした。


実際には若干サイズが変わっているようですが、冒頭の例ほど大きな違いはありません。

念のため、画面の解像度が異なる場合も見てみました。同じWindows 7上のExcel 2010でも、解像度が異なると冒頭と同じ結果になりました。8.1上の2013でも同様でした。

Windows 7(解像度:1920×1200)・Excel 2010で作成

一方、8.1上の2013で作ったものは解像度が違ってもこのようなことは起こりませんでした。また、7上の2010でも結果は同じでした。

Windows 8.1(解像度:1920×1200)・Excel 2013で作成

ExcelよりWindowsのバージョンの違いに原因があるのでしょうか。
ちなみにWindows 7上のExcel 2013で作成した場合は結果が少し異なりました。AddItemを実行する前、ActiveXコントロールをアクティブにした時点でリサイズが起こりました。

Windows 7(解像度:1920×1200)・Excel 2013で作成

これはIntegralHeightの値は関係ありませんでした。

8.1上で作成できれば問題はなさそうです。7で作成せざるを得ない場合は、AddItem実行後にHeightとWidthを設定し直すくらいしか対処法は思いつきませんでした。なんか腑に落ちませんが。

2014年2月20日木曜日

Excel 2010:フィルターと書式のコピー

シート上の表の書式を新規の別シートへコピーしようとした時のことです。
図はWindows 7上のExcel 2010です。


列幅もコピーしようと列ごと選択したのですが、うっかりフィルターがオンのままやってしまいました。


可視セルの部分しかコピーされず、列幅はコピーされていません。

さて、この後おかしなことに気づきました。コピー先のブックを2003形式(.xls)で保存しようとしたところ互換性チェックで引っかかりました。


図の通り5列×4行しか使用していないのに、256列か65536行を超えていることになっています。
最終セルへ飛んでみると、なぜかシートの最下部付近に同じものがコピーされていました。


どうもフィルターのかけ方に何らかの規則性があるようで、フィルターオンで列ごと書式をコピーしたからと言って必ずこの現象が起きるわけではありませんでした。ただし一見何も起きていないように見える場合でも、最終セルは同じように最下部付近が認識されました(保存すると見た目通りの最終セルへリセット)。

Excel 2003でも試したところ同様で、以前からあった挙動のようです。またExcel 2013でも同様でした。どういう理由なのかはわかりません。

2013年7月26日金曜日

Excel 2010:SP2で図のコピペに変化?

下図のシート上で選択されているのは、その下のセル範囲を「図としてコピー(ピクチャ)」して貼り付けた図です。

Excel 2010 SP1 - Windows 7

Excel 2010でこのシート全体をコピーして他のシートに貼り付けると、上の図が縮んでしまうという現象がありました。Excel 2003ではこのようなことは起こらなかったので困っていました。

Excel 2010 SP1 - Windows 7

一昨日リリースされたOffice 2010 Service Pack 2をインストールしたところ、この挙動に変化が見られました。

Description of Office 2010 SP2 - Microsoft サポート

コピー元が2003形式(.xls)だとコピペしても図が縮まなくなりました。ただし2007形式(.xlsx)ではSP1と変わりませんでした。

Excel 2010 SP2(コピー元が.xls形式の場合) - Windows 7

2007形式では変わらないということは、この現象自体が修正されたのではないでしょう。ただ、なんらかの変更の影響なのかなと思いました。

Office 2010 and SharePoint 2010 Service Pack 2 Availability - TechNet Blogs

上のリンク先にある「changes list」を見るとExcelの変更箇所も解説されています。Copying imagesうんぬんというのもあります。これとはまた別の話のようですが関係あるでしょうか。

ちなみに同様のコピペをExcel 2013でやった場合、コピー元が2007形式であれば問題は起きません。

Excel 2013(コピー元が.xlsx形式の場合) - Windows 7

一方、コピー元が2003形式だと図が伸びるという現象が起きます。

Excel 2013(コピー元が.xls形式の場合) - Windows 7

いちおう解決はしてるけど、2003形式までは面倒見れないということですかね。

2013年6月21日金曜日

Excel 2013:別インスタンスのシートへ数式を貼り付け

通常Excelをわざわざ別インスタンスで起動する必要はありません。しかしそうしたいケースもたまにあります。
ちなみに2013はふつうにもう一つ起動しようとしても別インスタンスにはならないみたいです。Altを押しながらもう一つ起動したら、メッセージが出て別インスタンスになりました。


今さら気づいたのですが、数式を含んだセルは別インスタンス上のシートにそのままコピペすることができません。やろうとすると「貼り付け元の範囲には、Excelのこのインスタンスに貼り付けられない数式が含まれています云々」と言われて値貼り付けにされてしまいます。Excel同士でもリッチテキストに変換されるようです。


同じExcelなんだから同じインスタンス内で貼り付けるようにできないんだろうか。試したら、形式を選択して貼り付けでできました。XMLスプレッドシート形式で貼り付けると数式がそのまま維持されました。


別形式に変換するわけなので、なんでもそのままとはいかないですけど(例えばアウトライン)。

<参考>XML スプレッドシート形式の機能と制限 - Office.com

2013年4月16日火曜日

Excel 2003→2010/2013:コントロールに登録した引数付きマクロでエラー

引数付きのプロシージャを、コマンドボタンなどのコントロールにマクロとして登録しているとします。

Public Sub Message_Show(ByVal sMessage As String)
    MsgBox sMessage
End Sub

登録は下図のようにシングルクォーテーションで囲み、引数の前に半角スペースを入れればできます。


実行結果:


さて、このマクロを登録したブックが2003形式(.xls)だった時、Excel 2010や2013で操作していたらおかしなエラーが発生するのに気づきました(図は2013)。まず、ブックを2007形式(.xlsm)で保存し直そうとするとエラーメッセージが表示されました。

名前 <登録マクロ名> は有効な参照範囲と競合するか、Excelでは無効です。名前は _1<プロシージャ名>(アンダーライン)<引数> に置き換えられました。
この時点ではメッセージだけで何も変化はありません。しかし一度ブックを保存して閉じてから再度開くと、登録してあったマクロが警告通りに書き換えられていました。


もちろんそんなプロシージャはありませんので、実行してもエラーになります。元から2007形式のブックで上のようにマクロを登録していれば、この現象は起きません。

これと原因は同じなのか、もう一つおかしなことがありました。
上の2003形式のブックから、2007形式のブックへシートをまるごとコピーするとします。コピーするのは新規のシートで、データもコントロールも何もありません。


これでもエラーになりました。

移動またはコピーする数式に名前<登録マクロ名>が含まれていますが、この名前は有効なセル範囲またはExcel 2013で内部的に使用されている名前と重複するため、変更する必要があります。
ちょっと何言ってるかわかりません。
ちなみにここで「いいえ」を選択すると、「重複する」名前を変更するためのダイアログが表示されました。


妙なのは、ここで新しい名前を指定しようと先のメッセージで「はい」を選択しようと、コピー自体は完了するということです。手作業でやってるならいいんですが、VBAで自動化している場合は実行が中断してしまうので困ります。

いずれにしても、最初から2007形式で作っていればこんな問題は起きません。早く2003と2007以降が混在した環境がなくなるといいんですが。

2013年3月3日日曜日

Excel 2013:WebBrowserコントロールでエラー

Excel 2013では一部のActiveXコントロールがシート上で使えなくなっているようです。気がついたのはWebBrowserコントロールでした。


挿入しようとするとエラーになります。


念のためWindows 8・7両方で試しましたが結果は同じでした。調べたら公式に書いてありました。

Office 2013 returns an error inserting Scriptable ActiveX controls onto a worksheet - The Microsoft Excel Support Team Blog

いくつかのスクリプト可能な ActiveX コントロールが Office 2013 のドキュメントに挿入することはできません。(機械翻訳版) - Microsoftサポート

いちおう回避方法があるらしいですけけど、おすすめではないみたいですね。

2010以前のExcelであらかじめWebBrowserを挿入してあった場合、コードから操作しようとした時点でエラーが出ます。 ただしファイル形式がxlsm(2007形式)とxls(2003形式)で異なりました。

シート上に置いたWebBrowserでNavigateメソッドを実行するとします。

Sheet1.WebBrowser1.Navigate "http://bardiel-of-may.blogspot.jp/"

2010では問題ありません(Windows 8・7で確認)。


2013ではこれがエラーになりました。xlsm形式の場合:


WebBrowser1が認識されません(Shapeオブジェクトの"WebBrowser1"としては認識されてます)。

xls形式の場合:


WebBrowser1自体は認識しているものの「作成されていない」そうです。ちょっと何言ってるかわかりません。

なお、2013でもユーザーフォーム上では問題ありませんでした。



先のリンク先によれば、これ以外にもエラーになるものがあるようです。自分では元々こういうコントロールを使うことがあまりないので試してはいません。この件も他の方に作っていただいたシートで気づきました。