2013年07月25日

ExcelVBA 小ネタ集

1.Selection

 例えばこういうシートがあったとします

excel.PNG

で、セルをクリアする。


 ' Rangeを取得してクリア
 Dim rs as Range
 set rs = thisworkbook.WorkSheets(1).Range("A1,A2,A3")
 rs.ClearContents ' エラー(実行エラー1004 結合されたセルの一部を変更することはできません)

 'Selectでやってみる
 rs.Select
 Selection.ClearContents ' 正常終了
 Selectionはレイトバインディングですが、当然Rangeに解決されますので、結局は同じになるはず。
 デバッガで確かめてみても同じ。なのになぜSelection使うとうまくいくのかが分からず軽く悩みました。
 ※ クリアするだけならClearContents使わずにrs.Value=""でもいいんですが。
 
 結論としてはエラーメッセージ通り。
 最初のは結合されたセルの一部を変更しようとしてたからNG。
 次のは結合されたセルの全てを変更しようとしてたからOK。
 つまり、rs.Selectの時、結合してるセルの全てを選択する処理が走るんですよ。

 最初のrs.Addressは"$A$1,$A$2,$A$3"ですが、
 次のSelection.Addressは"$A$1,$A$2,$A$3:$b$3"なんです。
 そういや手入力で選択しても普通にそうなりますよね。
 Selectionってほぼ使わないので頭から抜けてました。
 
 ちなみにValue=""でうまくいくのは実際の値を保持してるのはA3で、
 かつClearContentsと違いValue=""は変更とはみなさないからでしょう。

2.Cells.Count
 
 Excel2007以降で、
 なんらかのシート.Cells.Count
 とすると、オーバーフローエラーになります。
 代入しようがしまいが関係なく、Callしただけでエラー。
 
 理由は縦横合計34bitあるのでlongに入らないからだそうですが、お茶吹きました。
 31bit超えるセル用意しておいて内部ロジックほったらかしですか(笑)
 
 MSって本当にもう過去遺産捨てたいんだなあとか思ったんですが、
 CountLargeを代わりに使うそうです。

3.longlong
 
 ついにVBAでもlonglongが使えるようになりました!
 
 やり方
 Dim v as Variant
 v = Cells.CountLarge
 '後はvに対して好きなように演算
 
 そのまんまですね、すいません。
 使える条件はVarType=20の値が存在すること。32bitOfficeでもOK。
 longlongを返すなにかが存在すれば使えます。
 
 まあDoubleなりCurrencyなりが代わりになるので
 使い道は思いつかないんですが。
posted by Nick at 06:07| Comment(0) | TrackBack(0) | 小ネタ

2013年06月28日

小ネタ色々3

in Oracle11g
 
SELECT CASE WHEN 'A' = 'A' THEN 'EQ' ELSE 'NOT EQ' END RESULT FROM DUAL
 これ、変なとこわかりますかね?

 =が全角なんですが、EQが帰ってきます。正常終了します。
 どうやら、比較記号は全角でも半角に直して実行してるらしいです。

 なので、こんな書き方も出来ます。
SELECT CASE WHEN 'A' <> 'A' THEN 'NE' ELSE 'NOT NE(EQ)' END RESULT FROM DUAL
 うわ気持ち悪い。でも正常終了。
 これ対応しようって言い出した人、何考えてたんでしょうね?

仮想マシンを使いまわし

 VMWare → グラフィック系最強
 VirtualBox → 全体的に速い
 VirtualPC → VHDだけで動く

 これらの利点を全部採用する方法
 
 1.VirtualBoxでOSインストール(vmdk形式で)
 2.セーフモードでAdditionsを入れて再起動&シャットダウン
 3.VMWareで1.のvmdkをマウント
 4.Additionsを入れて再起動&シャットダウン
 5.vmdk以外全部削除
 
 これで、使いたいときにどっかにコピーしてマウント
 (検証不足なので参考程度に)

OS管理外メモリ仮想HDDの使い方
 
 1.ダウンロードフォルダ
  ダウンロードしたファイルは使うか消すかのどちらかなので。
  インストールや解凍もそこでやれば一瞬。
  消してはいけない系は保存時に対応。
  
 2.手動一時フォルダ
  よくやるのがHDD→仮想HDDへのrarファイル解凍。
  これでもランダムリードになるっぽいので
  最近はrarをコピーしてから解凍したり。
 
 3.仮想マシンのハードディスク置き場
  isoもHDDもここに置いとくとOSインストールに10分かからない。
  仮想だとさすがに遅いですが、SSDRAID0程度の速度は出ます。
 
 さすがに10GBあると色々出来ますね。
 まだまだ使い道ありそうで楽しいです。
posted by Nick at 06:06| Comment(3) | TrackBack(0) | 小ネタ

2013年06月22日

最近のフォント事情

OS再インストールすると色々いじりたくなるもんでして、
今はもっぱらフォントに嵌ってます。

大体は色々いじくったあげく普段使ってるのに戻るんですが、
とりあえず今はこんな感じです。

アイコンフォント
 画面のプロパティのアイコンのこと。これはメイリオ一択ですね。
 Tahomaもいいんですが、メイリオ以上にフィットするものは 
 今のところ見当たりません。
 この項目はExplorerのフォントと同義なので、
 相当な割合で目にするフォントです。

メッセージボックスフォント
 Chromeのタブがこのフォントを使います。(Ver27)
 Chromeのタブサイズって変更できないので、
 フォントの方を調整するしか無いんですよ。
 今はメイリオUI使ってますが、なかなか良い感じ。

日本語(文章)フォント
 普段使ってるのはHGPれいしっくですが、
 今回はFontLink使ってCorbel+HGPれいしっくにしてみました。

 ・・・おおお、これはいい。思ってたよりかなりいい。

 れいしっくってネットじゃあんまり見ませんが、
 昔筆まめかなんかを買った時についてきてまして、一目惚れ。
 MSUIGothicがあっても、メイリオが出てきても、
 後述するOSAKAを使ってても、私の日本語文章は基本的にこれです。

 なんというか馴染むんです。
 見やすいじゃなく、読みやすい。手書きに近い感触ですかね?

 れいしっくで唯一気になってたのが明朝のような英数字なんですが、
 それをCorbelで補ってみました。

 Corbelってのは分かりやすく言えばタクティクスオウガのダメージの数字。
 …え?分かりにくいですか?

ちなみにCorbel+れいしっくにしたサンプル画像はこんなんです。
cor_rei.png

プログラムフォント
 OSAKA。絶対にOSAKA。MSゴシック8ptを使ってた時に
 これに出会った衝撃は忘れない。有志の皆さん、有難う!

 ・・・と思ってたんですけどね。
 Rictyフォントってのを知りまして、見てみたんです。

 あー!これSyntaxHighlighterのデフォルトフォント!

 試してみた時、妙に気に入ってそのまま使ってたやつです。
 それにMiguっていう日本語フォントを合成したのがRictyらしいです。

 で、Windowsで試してみたんですが・・・うーん。(やり方はぐぐってね)
 私的には、ここまでアンチエイリアスかけられると、
 滲んでるようにしか見えないなぁ…

 アンチエイリアスって凄く重い処理ですし、出来れば避けたい。
 (ClearTypeですら、切ればTextOut系の処理速度が桁違いになる)

 てことで私なりにやってみました。

Windowsの作法に則ったRictyっぽい何か
 Windowsが用意してるFontLinkとClearTypeとConsolasを使います。
 (Rictyの英字フォントはConsolasをベースにしたらしいので)

 1. Miguフォント、Consolasをインストールします。
 2. レジストリに以下を追加。
  場所:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink
  値型:複数行文字列
  名称:Consolas
  中身:migu-1m-regular.ttf
 3. OSを再起動

 あとはフォントにConsolasを選べばRictyっぽくなります。

Visual Studioで実践
 できません。VS独自でフォントリンクしてるからです。

 ・・・・・・いやいや、なぜ?多言語対応ですか?
 いやそれはOS(君のとこの会社)がやってるのだけど・・・

 何やってるんでしょうね彼らは。

 仕方ないので独自フォントリンクをいじります。

 1. %USERPROFILE%を開く
 2. VsFontLk.dat というファイルを探して開く
  (VSインストールしてればどっかにあります)
 3. 0411の日本語リンクフォントを好きなのに変更。
 例)
 0411|Migu 1M|Migu 1M

 これでフォントにConsolas指定すれば完成。

サンプル画像はこんなん。
clip_1.png
うん、それっぽい。

ちなみにSHだとこうなります
#include "windows.h"

void main()
{
// とりあえず適当になんか作ります
// ...画面にルーラーでも書いてみますか

// DC取得
HDC hdc = GetDC( 0 );

// 超適当に4096を100ピクセル間隔で
for( int x = 0; x < 4096; x += 100 )
{
for( int y = 0; y < 100; y ++ )
{
// うわSetPixelVとか超懐かしい
SetPixelV( hdc, x, y, ( ( y >> 16 ) % 2 ) * 0xffffff );
}

// TextOutもするよ
WCHAR ch[ 64 ];
_itow( x, ch, 10 );
wcscat( ch, L"Pixel" );
TextOut( hdc, x, 100, ch, wcslen( ch ) );
}
MessageBox( 0, L"おしまい", L"Rictyっぽいなにか", 0 );
return;
}
posted by Nick at 08:10| Comment(0) | TrackBack(0) | 小ネタ

2013年05月25日

VB.NETの文字列

ちょっと気になったこと

'初期化
Dim lst As New List(Of String) From {"hello", "world"}

'最初のやつを持ってくる
Dim lzt As String = lst(1)

'typo(lstとlztを勘違いした)
MsgBox(lzt(1))


まあ実際こんな変数名にはしないでしょうけど、
これ、コンパイルエラーになるもんだと思ってました。

でもこれ通っちゃうんです。

Stringクラスの()演算子、Charを返してくれるらしいんですよ。

・・・な、なんていらない子・・・

続きを見る

タグ:Program VB.NET
posted by Nick at 05:09| Comment(0) | TrackBack(0) | 小ネタ