正規表現置換で行末のスペースを消す

よく私が使っている正規表現の小技を紹介します。

 ※サクラエディタ onigmoで動作確認済 たぶんほとんどの正規表現が使えるエディタで使えるはず

 

↓こんな風に行末にスペースが入っているのがかっこ悪いので消したいことがある。画像の黄色い箇所は半角スペース。

f:id:engineer-kiyo:20210119013419p:plain

これを手で消していってもよいが、スマートに一発で消す方法がある。

\s+$

をnullに置換する。

f:id:engineer-kiyo:20210119012030p:plain


置換後。行末のスペースがきれいに消えた。

f:id:engineer-kiyo:20210119012105p:plain

この例の行数ぐらいなら手で消してもいいが、行数が1000行とかたくさんあると手作業では時間もかかるし漏れも出る。正規表現置換なら一瞬な上に漏れがない。

 

正規表現の解説

\s は半角スペース。\s+ で半角スペース1個以上の繰り返し。$は行末。

これで行末の1個以上のスペースというのを検出できる。

 

はじめての正規表現 for Web Creator Kindle版

 

 

 

 

 

 

 

超軽量135g!BluetoothキーボードiClever IC-BK06Lite

またキーボードの紹介です。コンパクトで軽量で使いやすいキーボードを探して沼にはまってます。

 

今回はこれ

iClever 新型 Bluetoothキーボード 折りたたみ式 軽量 薄型 ワイヤレス ブルートゥース キーボードレザーカバー 財布型 充電式IOS/Android/Windows に対応 スマホ用 スタンド付 日本語説明書18月保証付き IC-BK06Lite

 

 

●対象となる人

 ・持ち運び用に軽量なキーボードが欲しい。
 ・変則的なキーがあっても気にしない。
 ・数字はブラインドタッチしなくてもいい。

 ・常にデスク上で使う。膝の上で使ったりしない。

 ・英語配列でも全然OK

 

このように中心で折れ曲がります。それ故に平らな台を必要とします。膝の上で使うとかは困難。

f:id:engineer-kiyo:20210119003247j:image

二つ折りにすると157mm X 104mm X 14mmで超コンパクト
f:id:engineer-kiyo:20210119003534j:image
f:id:engineer-kiyo:20210119003526j:image

 ●良いところ

・とにかく軽い。135gなのでカバンに入れても重さが気にならない。

・折りたたむとサイズが小さくてよい。

ローマ字入力はブラインドタッチできる。

 

●悪いところ

 ・数字キー(ファンクションキー)が小さくなっており、英字と同じ調子でブラインドタッチができない。慣れればできるかもしれないが。

・「・」のキー位置がなんと十字キーの右にある。

 私はこの字よく使うのでちとつらい。。。

英語配列なのでWindowsの設定で英語配列にしなければならない。そうするとこのキーボードは正常に使えるが、他の日本語キーボードが正常に使えなくなる。

・このキーボードを日本語配列のまま使用するとアンダーバーが入力できない。

Bluetoothのキーボード全般に言えるが、再接続に2、3秒かかってしまう。

 

ということでしばらく使ってみたんですが、英語配列に設定しなければならないのがネックで使わなくなってしまいました。 初めて使ったパソコンが英語配列だったのである程度慣れていたんですが、変則的なのが加わってずっと使おうとはなりませんでした。

 

超パフォーマンス改善!遅いExcelVBA処理を8倍高速化!2次元配列技

●読者対象は以下のような状況を改善したい人

・エクセルVBAの処理時間が長い。

・最初は早かったがデータが段々と多くなり時間がかかるようになった。

 

●この記事の技をマスターすると

・8倍高速なエクセルVBA処理を作れる。

 ※実際は縮まらない処理があり、大体1/4くらいに落ち着くと思われる。

 

 

エクセルVBAで物を作っていてある程度規模が大きくなってくると必ず、処理時間の壁にぶつかる。

初心者向けの解説では1セルずつ処理していくのが基本となっている。この方法はとても遅い。

 

1セルずつでなく一気に処理すれば約8倍の速さで処理できる。

具体的な例を示そう。

 

A列、B列の1~1,048,576行まで値が入っている。

A列、B列の値を少し加工してC列、D列に入れる処理を考える。

f:id:engineer-kiyo:20210116190242p:plain

A列の値の頭に"c"を追加してC列に書き込み

B列の値の頭に"d"を追加してD列に書き込み

f:id:engineer-kiyo:20210116191815p:plain

●まずは1セルずつ処理していく方法

Public Sub OneByOne()

    Dim i As Long

    Dim nLastRow As Long

   

    ' C,D列の値をクリア

    Sheet1.Columns("C:D").Clear

 

    Debug.Print Now & " start"

   

    ' 最終行を取得

    nLastRow = Sheet1.Range("A1").End(xlDown).Row

 

    For i = 1 To nLastRow

        'A列の値を少し加工してC列にコピー

        Sheet1.Range("C" & i).Value = "c" & Sheet1.Range("A" & i).Value

        'B列の値を少し加工してD列にコピー

        Sheet1.Range("D" & i).Value = "d" & Sheet1.Range("B" & i).Value

       

        If i Mod 10000 = 0 Then

            Application.StatusBar = i

            DoEvents

        End If

    Next i

 

    Debug.Print Now & " end"

    Application.StatusBar = ""

End Sub

処理時間は160秒

セルの読み取りに2,097,152回シートにアクセスし、さらにセルに書き込むために2,097,152回シートにアクセスしている。

 

●次に2次元配列を使う方法

Public Sub twoD_array()

    Dim i As Long

    Dim nLastRow As Long

    Dim v1 As Variant

   

    ' C,D列の値をクリア

    Sheet1.Columns("C:D").Clear

 

    Debug.Print Now & " start"

   

    ' 最終行を取得

    nLastRow = Sheet1.Range("A1").End(xlDown).Row

 

    ' ■■■■■■■■■■■■■■■■■■■■■■■

    ' ■ 2次元配列にA,B列の内容を取得         ■

    ' ■ ※1 セル1個ずつ取得するよりも超高速! ■

    ' ■■■■■■■■■■■■■■■■■■■■■■■

    v1 = Sheet1.Range("A1:B" & nLastRow)

 

    ' ■■■■■■■■■■■■■■■■■■■■■

    ' ■ 加工処理                             ■

    ' ■ ※2 メモリ内での処理なので超高速! ■

    ' ■■■■■■■■■■■■■■■■■■■■■

    For i = 1 To nLastRow

        v1(i, 1) = "c" & v1(i, 1)

        v1(i, 2) = "d" & v1(i, 2)

    Next i

 

    ' ■■■■■■■■■■■■■■■■■■■■■■■

    ' ■ 2次元配列の内容をC,D列に挿入         ■

    ' ■ ※1 セル1個ずつ挿入するよりも超高速! ■

    ' ■■■■■■■■■■■■■■■■■■■■■■■

    Sheet1.Range("C1:D" & nLastRow) = v1

 

    Debug.Print Now & " end"

End Sub

 処理時間は19秒

セルの読み取りに1回シートにアクセスし、さらにセルに書き込むために1回シートにアクセスしている。

 

 ということで同じことをやっているにも関わらず処理時間は1/8以下になっている。 

 

私は大体以下のステップで処理を作る。このように作れば高速なExcelVBA処理になる。

※場合によって①はなく2次元配列を自分で定義する場合もよくある。

①エクセルシートから2次元配列を作る

 (1ステップ)

②2次元配列上で加工等を実施する

 (メモリー上での操作なので高速)

③2次元配列をエクセルシートに書き戻す

 (1ステップ)

 

時間のかかるエクセルシートへのアクセスがたったの2回である(これ重要)

エクセルシートへのアクセス回数はコストが高いので最小限にするべき。

 細かいソースの解説はしないが、ソースをじっくり見ていただければわかることだろう。

 

 ●注意点

・セルの数がもっと膨大になるとエラーになる場合がある。その場合10万行ずつ処理する等の対応が必要な場合がある。

 ・この2次元配列を導入する以前にセル結合をまずなくすのが先決である。セル結合があるとこのやり方も本領発揮してくれません。

セル結合しない方がExcelVBAは超高速パフォーマンス! - engineer-kiyoの日記

  実はセル結合ありまくりの状態からこの2次元配列を導入すると処理時間1/64も夢ではない。

事実8時間たっても終わらなかった処理が2分で終わるようになったこともある。←この時は他にもいろいろ改善したんだけども。

 

是非この記事を参考に高速なVBA処理を作り上げて貴重な時間を無駄にしないようにしてほしい。

 

直接教えてほしい方はツイッターから連絡ください。

→@EngineerKiyo

使える!エレコム ワイヤレスコンパクトキーボード TK-FDM109TXBK

またしてもキーボードです。

今回はこれ

エレコム キーボード ワイヤレス (レシーバー付属) メンブレン 薄型 コンパクトキーボード ブラック TK-FDM109TXBK

●このキーボードの対象の方

 ・据え置きで使う。

 ・なるべくコンパクトなキーボードがよい

 ・普通に日本語配列で使いたい。 


f:id:engineer-kiyo:20210106083735j:image

サイズはそれほどコンパクトではありませんが、テンキーがない分コンパクト。

 

キー配列は本当に普通オブ普通な日本語配列。変則的なところはなく、普通に使えます。 


f:id:engineer-kiyo:20210106083751j:image

Boyataのキーボードと比べると非常に大きい。いやフルキーボードよりコンパクトなんだけど。

 

なんだかんだ言ってPageUp、PageDownがないとやはりきついです。

結局Boyataからこの普通キーボードに戻ってきました。Boyataも使ってるんだけど、プログラム作ったりするときはこっちだね。

 

このTK-FDM109TXBKは約452g(電池含まず)なので持ち歩きはできないが、普通に使えるのがよい。

キータッチももメンブレンで私好み。

 

このキー配置のまんまでぎゅっとコンパクトにしたキーボードがあれば文句なしなんだが。エレコムさん次回作お願いしますm(_ _)m

  

エレコム キーボード ワイヤレス (レシーバー付属) メンブレン 薄型 コンパクトキーボード ブラック TK-FDM109TXBK

 

Boyataの超絶コンパクトなワイヤレスキーボード

コンパクトなキーボードを探して沼にはまってるEngineer-Kiyoです。

 

今回紹介するのはこちら

amzn.to

 

今回はBluetoothではなく、USB受信機のあるタイプである。

Bluetoothタイプはスリープから復帰時に必ず数秒のタイムラグがある。

長い動画とか見ててキーボードでちょっとスキップしたい、となってもBluetoothだとちょこちょこ待たされてイライラするのである。

USBタイプならばスリープから1回目の打鍵で復帰。2回目の打鍵から通常の動作が可能である。

動画を見るPCでの使用を想定して購入した。

 

サイズは29.8cm * 13.6cmで342g(電池込)

持ち運ぶには少々重い。ちゃぶ台の上で使うにはちょうどいい大きさ。

 
f:id:engineer-kiyo:20210103215719j:image

レッツノートCF-S10との比較。少しこのキーボードの方が大きい。

正直言ってレッツノートのキーボードのピッチのをそのままコンパクトキーボード化してもらいたい。なかなかそういうものがない(あったら教えて!)

ピッチが狭いものはどれもキー配置が変速的である。

 
f:id:engineer-kiyo:20210103215731j:image

 このキーボードも「¥」「ろ」がスペースキーの右にある変態っぷり。

使用頻度が少ないキーなので許せる範囲ではある。

 キー配列は日本語なので普通に使える。ただ、かな入力をする人にはお勧めではない。

 
f:id:engineer-kiyo:20210103215919j:image
キーピッチは狭くしてもっとコンパクトにしてほしい。

 

●良いところ

・下に滑り止めがあって滑らない。

ローマ字入力なら全く問題ない。

・かなり高速なタイピングでも使用できる。

 Bluetoothキーボードのような遅延は皆無!

・打鍵感は結構よい。安物感がない。

 ・CAPS LOCKランプある。

 

●悪いところ

・PAGEUP、PAGEDOWNはない。

 これは結構イタイ。Boyataさん次回作では実装お願いします!

・Pauseボタンがない

 のでマクロの一時停止ができない。

 →必要な時はWin+Rでoskと入力しソフトキーボードで操作すればできる。

・Home、End、Insertキーはない。

 

ということでPAGEUP、PAGEDOWNがないのがかなり足を引っ張っている。いまのところマウスでのスクロールで問題なく使ってるけどね。

 

いろいろ使った中では、コンパクトだし使いやすい。

デメリットが受け入れられる人は買ってもいいと思う。 

 

amzn.to

 

正規表現置換でアマゾンの長いURLから必要な部分のみ抜き出す

以下のようなAmazonの長いURLから必要な部分のみ抜き出す正規表現の置換を考える。

サクラエディタ Onigmo 5.15.0で検証済

https://www.amazon.co.jp/%E5%B1%B1%E5%96%84-YAMAZEN-%E3%82%B7%E3%83%A5%E3%83%BC%E3%82%BA%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9-CSB-6045-%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%882%E5%80%8B%E7%B5%84/dp/B00IFW4NH6/ref=pd_sbs_13?pd_rd_w=N2cT0&pf_rd_p=c295905f-82f9-4d73-8142-c393a4211258&pf_rd_r=H9BGRBT50Y7849HH6QVD&pd_rd_r=12d8e31f-f259-4b8c-81e3-be65b74fee62&pd_rd_wg=bPsS6&pd_rd_i=B00IFW4NH6&psc=1

置換前↓

(https://www.amazon.co.jp)/[^/].*(/dp/.*/).*

置換後↓
$1$2

 

置換結果

https://www.amazon.co.jp/dp/B00IFW4NH6/

 

必要な部分のみにできた。

 

(https://www.amazon.co.jp)/[^/].*(/dp/.*/).*

上記の置換前の文字列について少し解説。


(https://www.amazon.co.jp)/  は固定文字列。キャプチャする為に括弧で括っている。変数$1にキャプチャされる。

 

[^/] スラッシュ以外の文字列のパターン。
.* をつけて、スラッシュ外の文字列の0回以上の繰り返し、となる。

 

/dp/ 固定文字列。

.*/  何らかの文字列のあとスラッシュ

括弧で括っているので変数$2に入る。上記URLだと「/dp/B00IFW4NH6/」が入る。

 

.* 何らかの文字列の0回以上の繰り返し。これは捨てる部分。

 

 

なんでこうなるのかは以下書籍を読めばわかる。

amzn.to

 

セル結合しない方がExcelVBAは超高速パフォーマンス!

セル結合をするとExcelVBAはものすごく遅くなるのを実例で解説しようと思う。

 

1.結合してない50万セルをA列からB列にコピー

2.結合してる50万セルをA列からC列にコピー

 

主に2では読み取る動作が遅くなる。

 

1.まずは結合セル無しを見ていく。

A列の1~500000行まで数値が入っている。

f:id:engineer-kiyo:20201229001338p:plain

↓「A列からB列に値をコピー」ボタン押下で実行されるVBA

※nowtimeは自作関数なのでもしコピペして試す場合は、Nowの方をアンコメントして使ってください。
Public Sub noUnion()

    Dim i As Long

    Dim nLastRow As Long

   

    ' B列の値をクリア

    Sheet1.Columns(2).Clear

 

'    Debug.Print Now & " start"

    Debug.Print nowtime & " start"

   

    ' 最終行を取得

    nLastRow = Sheet1.Range("A1").End(xlDown).Row

 

    For i = 1 To nLastRow

        'A列の値をB列にコピー

        Sheet1.Range("B" & i).Value = Sheet1.Range("A" & i).Value

       

        If i Mod 10000 = 0 Then

            Application.StatusBar = i

            DoEvents

        End If

    Next i

 

'    Debug.Print Now & " end"

    Debug.Print nowtime & " End"

    Application.StatusBar = ""

End Sub

処理時間は18秒

2.次に結合セルありを見ていく

A列の1~500000行まで数値が入っている。A列とB列は結合されている。

f:id:engineer-kiyo:20201229002608p:plain

↓「A列をC列にコピー」ボタン押下で実行されるVBA

※B列がC列に変わっただけである。※nowtimeは自作関数なのでもしコピペして試す場合は、Nowの方をアンコメントして使ってください。

Public Sub Union()

    Dim i As Long

    Dim nLastRow As Long

   

    ' C列の値をクリア

    Sheet1.Columns(3).Clear

 

'    Debug.Print Now & " start"

    Debug.Print nowtime & " start"

   

    ' 最終行を取得

    nLastRow = Sheet1.Range("A1").End(xlDown).Row

 

    For i = 1 To nLastRow

        'A列の値をC列にコピー

        Sheet1.Range("C" & i).Value = Sheet1.Range("A" & i).Value

       

        If i Mod 10000 = 0 Then

            Application.StatusBar = i

            DoEvents

        End If

    Next i

 

'    Debug.Print Now & " end"

    Debug.Print nowtime & " End"

    Application.StatusBar = ""

End Sub

処理時間は150秒

なんとセル結合なしの8倍もの時間がかかる。

 

セル結合すると遅いのである。

 

今回はセルの値を読み取るところだけの話であるが、セルに値を挿入、行のコピー等、とにかくすべての動作が遅くなるので大量に処理するエクセルではセル結合は絶対に使わないことをお勧めする。少ないデータ数なら遅くなっても全然気にならないが、普段からセル結合はしないようにすることをお勧めする。

 

 エクセルの帳票に結合セルが1個でもあると処理が非常に遅いものになります。何千ページもの帳票を作る場合は特に気を付けましょう。