どーでもいい知識

セルへの出力で配列を使う場合の注意点

Excelで大量の値を連続したセルに代入したい場合、値を2次元配列に格納しておいて、それを同じサイズのセル範囲のValueプロパティに代入するということはよく行われます。 これは、高速化のテクニックとして非常にポピュラーなものです。 1セルずつ出力し…

コピペとセル先頭の ' の削除

Excelは、数値や日付等に変換できる値をセルに入力した場合、自動的に数値や日付等に変換してセルに格納します。 セルの書式設定を「標準」にしたまま、これらの値を文字列として入力する場合には ' を先頭につけて入力します。 セルの書式設定「標準」のま…

MsgBox デバッグに御用心

Excel VBA でプログラムを作っている途中で、「この場合、この変数に何が入るのかな?」と確かめたくなった場合に、一時的に MsgBox を入れておいて実行し、その変数の中身を確認するということをしばしば私はやります。 しかし、API等から取得した文字列の場…

四捨五入にご用心

↓のマクロを実行すると、 Sub Test() Dim X As Currency X = 12.34567 Debug.Print X Range("A1").Value = X X = Range("A1").Value Debug.Print X End Sub 12.3457 12.35 となります。 (セル A1 の書式はデフォルトの状態とします。) 一つ目の Debug.Prin…

TIME関数と TIMEVALUE関数

ここんとこ自分のサイトに関数のことをぼちぼち追加しているので、 たまには、一般機能の関数ネタをば。 セル A1 に、時 セル A2 に、分 セル A3 に、秒 を入れることにして、別セルに =TIME(A1,A2,A3) =TIMEVALUE(A1&":"&A2&":"&A3) とそれぞれ関数を入れて…

1つのシートモジュールに複数の Change イベントプロシージャをば

1つのシートモジュールに書ける Change イベントプロシージャは1つ… とは限りません。 実は、いくつでも書けます。 やり方は単純で、Sheet1 モジュールに Public WithEvents sht1 As Worksheet Private Sub Worksheet_Change(ByVal Target As Range) MsgBo…

そのシート指定は何のためにあるの?

ちょっとばかり思うところがあって、↓の Macro1 を書いて実行してみました。 Sub Macro1() Sheet1.Range("A1").Copy Sheet2.Paste Destination:=Sheet3.Range("A1") End Sub こんなもん、Paste でエラーになるに決まっているだろ!と思ったのですが、、、 さ…

同じなのにNG、違うのにOK?

ユーザーフォームにコンボボックスとボタンを配置して、↓のコードを書いたとします。 Private Sub UserForm_Initialize() Me.ComboBox1.List = Array(1, "2") Me.ComboBox1.Style = fmStyleDropDownList End Sub Private Sub CommandButton1_Click() MsgBox …

Cells ダメなようでダメじゃない?

↓のマクロは1つだけNGなんです。 2つNGじゃなくて。 Sub Macro1() MsgBox Cells(1, 1).Address End Sub Sub Macro2() MsgBox Cells(1, "1").Address End Sub Sub Macro3() MsgBox Cells("1", 1).Address End Sub ちょっと考えれば理由は推測できるので…

1は1じゃないし、2も2じゃない?

Evaluate って、てっきり定数の場合はそのまんま返すだろうと思っていたのですが、そうとは限らないと今頃知りました。 Sub Macro1() Debug.Print Application.Evaluate("1") Debug.Print Application.Evaluate("2") Debug.Print Application.Evaluate("3") …

書式設定に全角スペースを入れてみると…

セルの書式設定のユーザー定義で全角のスペースをVBAで入れてみます。 Sub Macro1() Dim S As String Range("A1").Value = 99 S = "0 0" Range("A1").NumberFormatLocal = S End Sub なんだか変です。 半角分しか空いていないように見えます。 気を取り直し…

重複排除して二次元配列を作る(Dictionary版)

Q&Aで割とよくある質問で、シートにあるデータから重複を排除してリストボックス(あるいはコンボボックス)に入れたいってのがあります。 データが1列しかない場合は割と素直にできるのですが、2列以上となるとちょっちメンドクサイです。 方法はいくつかあ…

重複排除して二次元配列を作る(Collection版)

単に重複排除の判定だけなら、わざわざ Dictionary を使わなくても Collection で充分です。 ただ、Collection の場合もちょっと注意が必要です。 Addメソッドの Key は文字列しか受け付けてくれません。 なので、前回のように KEY が数値の場合は、CStr 関…

Word の OnTime

Excel のライブラリと Word のライブラリを比較していて気付いたネタでもう1つ。 Excel の OnTime メソッドと Word の OnTime メソッドは結構違うようです。 構文そのものも 式.OnTime(EarliestTime, Procedure, LatestTime, Schedule) と 式.OnTime(When, …

単位なら同じだろう…

Excel のライブラリと Word のライブラリには、 Application.CentimetersToPoints メソッド Application.InchesToPoints メソッド という単位変換用のメソッドがあります。 勿論、センチメートルやポイントってのは、Excel や Word の専用の単位じゃないので…

Run は Run でも微妙に違う

Excel にも Word にも、Run メソッドがあります。 Excel2007 と Word2007 で Run の実験をしてみたら、少々おもしろい結果になりました。 まず、Excel と Word について、それぞれ標準モジュールを2つ挿入しておき、Module1 に Public X As String Sub Test…

再び、ちかんを…

"長〜〜〜〜〜い文字列"シリーズ(其の五) (Excel2007では 8222文字以上) Excel2003以前では、911文字超の文字列が入っているセルに対しては、置換文字がどこにあろうと置換はできない ということを前回の日記に書きました。 # 前回の日記のテーマは「置換…

ちかん してみたら、、、やっぱりダメ

"長〜〜〜〜〜い文字列"シリーズ(其の四) (Excel2003以下では、911文字以上) 「検索」を試したついでに、「置換」についても書いておくことにします。 やってみれば分かりますが、エラーになります。 「検索」の場合は、[数式]で検索しても、911文字目以内に検…

存在するけど見つからない

"長〜〜〜〜〜い文字列"シリーズ(其の参) (Excel2007では 8222文字以上、Excel2003以下では、1025文字以上) 今回のお話は単純です。 "長〜〜〜〜〜い文字列"の後ろの方の文字列は、「検索」でヒットしないというだけの内容です。 それでは、実験、実験。 …

じゃ、Formula プロパティは?

"長〜〜〜〜〜い文字列"シリーズ(其の弐) (Excel2007では 8222文字以上、Excel2003以下では、1025文字以上) 「Textプロパティは見た目どおり?」には書きませんでしたが、セルの値を取得するプロパティには、 Formula プロパティ ってのもあります。 これ…

Text プロパティは見た目どおり?

"長〜〜〜〜〜い文字列"シリーズ(其の壱) (Excel2007では 8222文字以上、Excel2003以下では、1025文字以上) セルの値を取得するプロパティには、 Value プロパティ Text プロパティ とそれぞれ違うものがありますね。 どう違うのかというと、 Value プロ…

再び、ちかんを…

"長〜〜〜〜〜い文字列"シリーズ(其の五) (Excel2007では 8222文字以上) Excel2003以前では、911文字超の文字列が入っているセルに対しては、置換文字がどこにあろうと置換はできない ということを前回の日記に書きました。 # 前回の日記のテーマは「置換…

ループの後(その1)

Integer は、ヘルプの「整数型 (Integer)」のトピックに 整数型 (Integer) の変数は、16 ビット (2 バイト) の変数で、 -32,768 〜 32,767 の範囲の値をとります。 と書いてあるとおり、最大値は 32767 です。 # Longで話をしてもいいけど、桁が多くてめんど…

ループの後(その2)

その2は、For Each...Next ステートメントです。 こちらは、コレクションに対するループの場合は Nothing に、Variant配列に対するループの場合は Empty になります。 ループを抜けた後のことは、考えなくていいよってことです。 ↑その1と言っていることが…

文字を Integer 型に入れてみよう

タイトルで、何をバカなことを言っているんだって感じですが、 実は文字を Integer 型に入れることは可能です。 勿論、 Dim X As Integer X = "ビ" なんてのは、ダメダメですけど。 という訳で? 今回のビックリドッキリメカ・・・じゃなくて、コードはコレ…

Byte 型ってメモリの節約になる?

ヘルプを見るまでもなく、 通貨型 (Currency) … 8 バイト 長整数型 (Long) … 4 バイト 整数型 (Integer) … 2 バイト バイト型 (Byte) … 1 バイト ってのは、VBA をやる人なら頭の中に入っていることかと思います。 ということは、メモリをケチケチ使いたいな…

違うセルと言われるけど同じセル

シートの Move 後は、元のシートを参照していたオブジェクト変数は使い物にならなくなるってことを「シート移動後はご用心」に書きましたが、今度はセルのお話です。 セルには Move はないけど、Cut & Paste が同じようなもんなので、これを試してみました。 …

空の文字列と言っても…

VBAの(可変長)文字列は、ちょっとばかしオブジェクト変数と似たところがあります。 いや、Variantの方が近いかな? 普段は全然そんなこと意識しませんけどね。 という訳で?、今日の日記のネタは、StrPtr関数です。 # どういう訳でだよ!ってツッコミは却下…

セルの移動後にもご用心

シートの Move 後は、元のシートを参照していたオブジェクト変数は使い物にならなくなるってことを昨日の日記に書きましたが、今度はセルのお話です。 セルには Move はないけど、Cut & Paste が同じようなもんなので、これを試してみました。 一応、テスト…

シート移動後はご用心

シートをオブジェクト変数に割り当てて、シートの移動をすると、そのオブジェクト変数は移動後どうなるでしょう? どうも、それはやっちゃいけないことのようです。 試しに↓を実行すると、MsgBoxのところでエラーになります。 Sub Test() Dim shtA As Worksh…