スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【VBA】桁数・バイト数を数えるワークシート関数


以下のLEN関数で文字列の桁数を取得することができる。

= LEN(文字列)

ひとつ注意なのが、LEN関数はあくまで桁数、つまり文字数を取得する関数であること。
全角文字が含まれる場合、LEN関数で取得できる桁数は想定しているものとは異なるかもしれない。

全角文字が含まれるか判定したい場合は
文字列のバイト長を取得するLENB関数を使うと良い。

例えば、以下の二つの結果はどちらも「4」となる。
= LEN(123a)
= LEN(123あ)

また、文字列のバイト数を数えたい場合は、以下のLENB関数を用いるとよい。

= LENB(文字列)

先ほどの例の数式はLENB関数では結果が異なり、それぞれ「4(バイト)」、「5(バイト)」となる。

= LENB(123a)
= LENB(123あ)


1_20141210234955fa6.png
スポンサーサイト
【VBA】範囲選択のワナ

エクセルで、ctrl+Shift+Endを押すと、入力のある範囲すべてを選択することができる。

しかし、この機能では、過去に入力がある範囲も含めて選択してしまう。
エクセルの仕様っぽい。。。



例えば、
新規シートにて、G7セルに「a」と入力後、セルA1にフォーカスがある状態でctrl+shift+Endを押下してみる。
すると、セルA1~G7までが選択された状態になる。

ここまでは何の問題もないのだが、一度G7に入力した「a」を消してから、
セルA1にフォーカスがある状態でctrl+shift+Endを押下してみる。
実際に入力された値は見えていないにも関わらず、先ほどと同じ結果で、
セルA1~G7までが選択された状態になる。

1_20141112231157f9b.png


どうやらエクセルにおいて、ctrrl+shift+Endでの範囲選択では、
過去に入力のある範囲も含めて選択状態になるらしい。
そう。エクセルの仕様なのだ。

2



このような仕様のために、VBAで範囲選択するときは注意しなければならない。

※この現象は、一旦ブックを保存すると再現しなくなります※
VBA forループ、step

さっき知ったけど、forループを回すときに、カウンタ変数の加算値を指定できるのな。
単純にループの中の最後の処理として

i = i + 1

とか書いてたけど・・・

下の例はiを0から10まで2ずつ加算してループを回す処理の例。もちろんstepにはマイナスも指定できるっぽい。

Sub test()

Dim i As Integer

For i = 0 To 10 Step 2

'処理
Debug.Print (i)

Next

End Sub
VBA 処理速度の改善


覚書のために、簡単にまとめとく。

エクセルVBAの処理速度改善の方法はたくさんあります。

根本的な解決としては、無駄のない適切なアルゴリズムを使うことなんだろうけど、
簡単な対応方法としては何個か。

たった1文加えるだけで、処理速度が大きく改善するかもしれません。

1.画面更新を止める。
2.いちいちselectしない。
3.ループを途中で抜ける。
4.処理をOSに戻す。


ぱっと思いつくのは、こんなもんでしょうか。
順に説明します。

1.画面描画を止める。

以下の1文を処理開始時に入れることで、画面の描画(ちらつき)を止めることができます。
(処理開始時に「処理を開始します。よろしいですか。」といった
メッセージを出力する場合は、処理の先頭ではなく、メッセージを出した後に追加しましょう。
描画更新を止めたにも関わらず、メッセージを出力するなんて処理の流れは矛盾しています。)

Application.ScreenUpdating = False


処理の最後には、

Application.ScreenUpdating = True

としておきましょう。処理終了時に自動的にこの設定値はTrueになるようですが、
念のため元に戻しておきましょう。
まれに不具合が生じることがあるようです。設定が戻らなかったり?

参考ページは忘れましたが、実際に思い当たる節として、
処理の途中にエラーで処理を中断した際、ワークシートをクリックしても反応しないことがあった気がします。

これって、処理開始時に画面描画を停止したままだからって考えると話が通る気がします。




2.は、いちいちセル選択しなくても値をぶち込めますってことです。
マクロの記憶なんかでは、どこどこのセルをselectして~とかあると思いますが、
そんな記述は特に必要ないです。直接ぶち込みましょう。

3.Forループとかをぐるぐるまわしすぎるのはよくありません。
ループの途中でほしい値が取得できたりして、それ以降のループを回す必要がないならループを抜けましょう。
VBAにはcontinueはありませんので、gotoを使えってのがよくある話ですが。。。
個人的にはgotoは嫌いです。処理が追いづらくなるからです。

ForEachを使ったり、何らかの方法でgoto文を書かずに済む方法を模索しましょう。

4.ループを回しすぎると負荷がかかります。処理が途中で停止したままなんてことも。

やけに処理に時間がかかるなんてことありませんか?
でも、実行中にマウスをぽちぽちクリックしてやるとすんなり処理が進むなんてことありませんか?

ループを回すときは適度にOSに制御を戻してやってください。
DoEvents


これで、処理が極端に遅くなるのを回避できるかもしれません。
VBA 選択行の文字色を変える


エクセルで、横長の表を見るときとか、編集するときとか、
今どの行を編集しているか分かりやすいように、選択セルの存在する行の文字色を赤字に変更する。

コードを記述する場所は、シートオブジェクトのWorksheet_SelectionChangeイベント。
選択セルが変わった時に発生するイベント。

しょぼいけど、見た目はちゃんと動作してるっぽい。こういうのが、ユーザビリティかな?

aaa_201408270105241b7.png


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'選択されたセルが
'2行目以降かつ1列目に値が入っている場合、
If Target.Row >= 2 And Cells(Target.Row, 1).Value <> "" Then

'文字色を初期化
Rows("2:" & Rows.Count).Font.ColorIndex = xlAutomatic

'選択されている行の文字色を赤色に変更
ActiveCell.EntireRow.Font.ColorIndex = 3

End If

End Sub
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。