VBAからExcelを操作2

前回の

この部分耐えがたい遅さです。
vb.netの二次元配列はまあまあ我慢できますがVBAはデータが多くなるとだめです。
一次元目の要素(項目数)が少なければ一次元配列を並べた方が速いです。
さらに速いのはレコードセットから直接ループさせつつ書き込む。
すごく速いのでvb.netもデータテーブルから直接書き込むようにしました。
プロセスも今の所残っていません。コードが冗長になりますけど。

VBAからExcelを操作

VBAからもできるでしょうと思ったけど・・

今までは意識してなかったけどVBAではオブジェクト解放は要らない?
プロセスは残らないが・・
とりあえずset=nothingで安心することに。

選択ソート 二次元配列

ついでに選択ソートも

QuickSort 二次元配列

もともとはDictionaryでソートする必要があったので配列のソートを調べたのでした
dictionaryに入っているkeyとitemを二次元配列にしてソートする
もっと良い方法があると思いますが・・とりあえず
関数化したけど要素で型変換必要なので意味がなかった

VBAで配列をソート テーブルを使う

テーブルに入れると言う手もあります
これが一番簡単
SQLserverとつながっているなら一時テーブルに入れ込む

VBAで配列をソート 選択ソート

バブルソートは時間がかかる
quick sortはササッと書くのは難しい
ので選択ソート

こんな感じで

integer と long

VBAでは
integer -32768 から 32767
long  -2147483648 から 2147483647
vb.netでは
integer -2147483648 から 2147483647
long -923372036854775808 から 9223372036854775807

vbaで
dim i as long
for i=0 to ..
と書いていたがvb.netで同様に書くとなぜだかインテリセンスによく怒られる
vbaのlongはvb.netではinteger
今更だけど

複数ステップのOLEDBエラー nvarchar(max) 改行

SQLserverテーブルのnvrachar(max)のカラムに対して
ODBC接続のレコードセット取って

Str=”文字” & vbCrLf
rs!カラム=Str
rs.update
など更新や追加行うと複数ステップの・・・エラー

OLEDB接続では起きない
nvarchar(max)をmaxを500など変更すれば起きない
cn.execute “insert into・・・values・・・” では起きない

サロゲートペア SQLserverの場合

以前もMySQLで書いたけど
AccessからSQLServerへサロゲート文字保存について

AccessはVBエディターに表示はできないけどテーブル、フォームに表示保存可能
SQLserverも保存できる

接続文字を書いてexecuteメソッドで
insert into Table(column) values(“サロゲートペア文字”)
とVBAから更新クエリ発行すると保存できない

OLEDBはだめ
oledbはhttps://docs.microsoft.com/ja-jp/sql/connect/oledb/features/utf-16-support-in-oledb-driver-for-sql-server?view=sql-server-2017
難しいけどだめだと書いてあるようです

ODBCならといろいろ試したけどこれも今のところだめです
ODBCからリンクテーブルにしてフォーム作って入力すると可能なのだがなぜ?
接続文字列にオプションか何かあるのかな?引き続き要調査

OLE DB

詳しくはわかりませんが何年か前から
Microsoft OLE DB Provider for SQL Server(SQLOLEDB) 
はもうサポートしないから新規開発に使用するのはやめてほしい
とMicrosoftがアナウンスしているが今でも使えています
でも突然消えると困るので調べてみると
代わりに
Microsoft OLE DB Driver for SQL Server(MSOLEDBSQL) 
をリリースしてるようです
問題はSQLOLEDBはOSに付属してるので何も考えずに良かったけどMSOLEDBは別途インスト必要らしいです
挙動も少し違うようで安全性は向上する、計算列の操作が今まで甘かったけど今度は厳しく行きますよ という感じのことがアナウンスされてた
今日開発機にインストして使ってみましたがaccdbは特に問題なく動きました。
OSは64bitですがAccessが32なのでx86をインストだろうと思ったらX64でした
接続文字もSQLOLEDBをMSOLEDBSQLに書き換えるだけで良いようです
アプリ配布先にはインストされてないのでパッケージ作るとき困るけどSQLOLEDB消えてから考えよう