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年07月12日

Hello, Linux world!

色々思う所あって、最近はLinuxいじってます。
メインには出来ないんですが、それなりに少しずつ。

Linux…というより、UNIXのカーネル思想を今更知り、それがまた刺激的でして。

以下Wikipediaより。
UNIXの設計段階で、全ての高レベルのデバイスをファイルとして抽象化することが決定された。
何故ならUNIX設計者は情報処理の目的をデータの変換であると考えていたからである

すんごいわかります。てか私の考え方もそう。
「結局HDDのビットいじるだけなんだから」とかよく言ってたんですが、
コンピュータ使ってやることって、結局のとこデータ変換だけなんですよね。

mp3もh264も、スマホもC++もCGもDTMも全部そう。流れとして、
アナログからの入力をデジタルへ→0回以上の操作→デジタルをアナログへ出力
という形は、ENIACからCDやPCを経てiPadに至るまで、何一つ変わってはないんです。

これを前提にして作られたOSとかワクワクしませんか?
…しませんよね。たぶん。PG仲間でもあまりいませんでしたし。でも私はします。

今は色々調べたりいじったり、それなりに少しずつ。
posted by Nick at 07:23| Comment(0) | TrackBack(0) | Linux

RamDisk

OS管理外メモリ仮想HDD(以下RamDisk)について少しわかったこと。

1.ぶっちゃけ遅い
 いや、速い。SSDよりはずっと速い。でもベンチの数字ほどではないんです。
 大体1〜3GB/Secぐらいの速さ。実用でも5GB/Sec程度は行くと思ってたんですが。
 
 色々やってみて理由がなんとなく分かってきました。
 適当にリードベンチの処理書いてて、あれ?って思ったんです。
 …そういや当たり前だけど、データをメモリに移して処理してる。
 これってもしかして、メモリから見ると、同一ドライブ上のファイルコピーと同じように、
 ランダムアクセス主体になる・・・?
 
 それが正しいなら、HDD→メモリ→HDDという流れは全てのアプリが
 大なり小なりやってるから、結局ほぼランダムアクセスになってしまいます。
 となると・・・ああ、なるほど、大体納得。ベンチのランダムアクセスもそんなもんでした。
 シーケンシャルの値はデータ自体をアプリが作ってるから伸びたんでしょうね。
 
 しかし逆に考えればランダムアクセス前提でも1GB/Secは出るということ。
 そりゃインストールなんて一瞬で終わることでしょう。
 
2.スタンバイ
 メモリに通電してるのでRamDiskが消えません。
 最初は驚きましたが、省電力周りを調べて納得。
 そんな基本的なこと今更知るってどうなんだろうとも思いますが、
 ソフト屋の専門外知識なんてこんなもんです(たぶん)
 
3.RamPhantom
 設定は全部OFF。バックアップもリンクも一時ファイルもなんもなし。
 むしろ何も残さないで欲しい。それがお前のいいところ。
 でも金払った理由がちょっと悔しい。
 無料と有料の違い、おそらくは1行変えるだけだろうに・・・!
 (デバッグやテストその他考慮せず)