VBAで配列をソート Quicksort

quicksortも作ってみました
無限ループに何度もはまりました
コード表示のプラグインも入れてみました

ちなみにquicksortのアルゴリズムはここ
再帰プロシージャはここを参考にさせてもらいました。

最速です

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

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

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

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

こんな感じで

openrowsetで既存Excelファイルへexport

vb.netでSQLserverテーブルをクエリして既存excelファイルに出力

accessのVBAからなら
docmd.transferspreadsheet acexport,acspreadsheettypeexcel9,”クエリ”,”ファイルパス”
でしたがvb.netでは難しいです

SQLserverにはopenrowsetというクエリでexportできるようなのでvb.netからExecutenonqueryで操作

SQLserverで準備
SQLserverは64bitでaccess32bitがすでにインストされているのでACEの32bitが既存
SQLserverのリンクサーバに64bitのACEのプロバイダ登録が必要なので
https://knowledge.autodesk.com/ja/support/autocad/learn-explore/caas/sfdcarticles/sfdcarticles/JPN/How-to-install-64-bit-Microsoft-Database-Drivers-alongside-32-bit-Microsoft-Office.htmlを参照にACEの64bit版をちょっと強引にインスト

SQLserverのリンクサーバーにACE登録

SQLserverでmasterデータベースで以下クエリ発行
exec sp_configure ‘show advanced options’,1;
reconfigure;
exec sp_configure ‘ad hoc distributed queries’,1;
reconfigure;
exec sp_MSset_oledb_prop N’Microsoft.ACE.OLEDB.12.0′ ,N’AllowInProcess’,1;
reconfigure;
exec sp_MSset_oledb_prop N’Microsoft.ACE.OLEDB.12.0′ ,N’DynamicParameters’,1;
reconfigure;

exportするクエリは
insert into openrowset(‘Microsoft.ACE.OLEDB.12.0’,
‘Excel 8.0;DATABASE=ファイルパス;imex=0;hdr=1;’,
‘SELECT カラム FROM [excelのワークシート名$]’)
select カラム from sqlserverテーブル where 条件カラム=パラメータ

接続文字がとっても厳格、ここまで試行錯誤数日
vbaでは列名含めて新しいワークシートに出力できたが
openrowsetはワークシートと列名は作成しておく

クエリが問題なければvb.netからExecutenonqueryで出力

最初VB.NETのコードでゴリゴリとやっていたけど難しくて断念
openrowsetもかなり難しいし環境が違えば同様にはいかないだろうし後日再検討しよう

integer と long 続

たとえば
VBAのinteger -32,768 ~ 32,767
216=65536 だが
負数もあるので半分になっているらしい
.NET Framework の16 ビット符号付き整数と同じ?
符号付きは負数あり

VBAのLong -2,147,483,648 ~ 2,147,483,647
.NET Framework の32 ビット符号付き整数ということになるかな?
では
Long(VBA)=integer(VB.NET)=System.Int32=int(SqlServer)

SQL Serverにおいてtinyintだけは
符号なしなので
.NET Framework 風に言えば8ビット符号なし整数
0 ~ 255 

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
今更だけど

datagridview iifエラー

VB.NETでdatagridviewをGUIで作成するとき
クエリに
select iif(bit型カラム=0,’男’,’女’) as 性別,…from sqlserverTable
と書くとエラー
select 性別=case when bit型カラム=0 then ‘男’ else ‘女’ end,…
と書くと大丈夫

VBAのレコードセットも癖が強いがVB.NETも一筋縄では行かない気がする

新元号 Access

5/1夜だがまだwin10_1809は新元号和暦表示できない
LANの半分は表示できるのでなんとか業務は可能だがこのままGW明けまでMicrosoft未対応を想定して可及的にパッチみたいな物を・・
うちの業務システムでは和暦表示は gee/mm/dd 形式だけだから

Public Function FormatZ(paramA As Variant, paramB As Variant)

If IsDate(CStr(paramA)) = True Then
 If paramB Like “gee/mm/dd*” And CDate(paramA) >= CDate(“2019-5-1”) Then
  FormatZ = Replace(Format(paramA, paramB), “H3”, “R0”)
 Else
  FormatZ = Format(paramA, paramB)
 End If
Else
 FormatZ = Format(paramA, paramB)
End If

これで良いかな?

とりあえずしばらくしのげれば良いので関数作って
moduleで必要な物はFormatZに変えておく
クエリも令和が出そうなものは捜して置換
フォームのソースがクエリのものがあるはずだが面倒なので現場で対応しよう

新元号 windows WSUS

先月から気になっていたのですがWSUSサーバで新元号対応更新プログラムのKB4493473がインストール済みまたは該当なしになっていたのですがインストールはされてません
今日確認するとやはり新元号表示不能です
マニュアルで対応必要でした 以下参照
https://sccm.jp/2019/04/27/post-1484/

windows10 1809 は今日5/1調べたけどまだ未対応のようです
windows10でupdate最新状態にしておけば大丈夫とあちこちで見るけど
最新状態だと1809になってるはずなのでほとんどのPCが表示できない
ということになってないのかなあ