最近のwindowsはsymbolなしでdebugできると書いたけど違っていました。
巨大なデータはどこに?と見てみるとちゃんと C:\symbols が知らぬ間にできてました
Just another WordPress site
最近のwindowsはsymbolなしでdebugできると書いたけど違っていました。
巨大なデータはどこに?と見てみるとちゃんと C:\symbols が知らぬ間にできてました
format関数はvba、SqlServer、VB.netにありますが少し入力値に違いありです
vbaは文字でも数字でも日付型でも良いみたい
format(“41″,”000”) は041
だけど
SqlServer、VB.netの入力値は数字または日付型のみ許されるようです。
sqlserverでは
format(cast(’41’ as int),’000′)
としないと思った通りに返ってこない
知らなかったがVBAで
strconv(“abc”,vbUpperCase) は ABC だけど
format(“abc”,”>”) も ABC
知らなくても良さそうだが書いておきます。
ストアドでエラー行とSSMSのストアド編集画面の行番号にズレがある。
その前に、表示はv17.5でツール、オプション、ダイアログ中の、テキスト エディタ、全ての言語、全般の中の行番号をチェック
話戻って、SSMSでクエリ発行 sp_helptext ストアドプロシージャ名
の行番号を見る
SqlServerのトリガーをいじって大失敗
select columnA= case when columnA is null and columnB(datetime)>cast(columnC(decimal) as datetime) then
として大失敗。columnCの値は20200101などdate型として通用するんですがなぜかdecimal型なんです。
一度文字型にしてから日付型へ変換が必要でした。
https://docs.microsoft.com/ja-jp/sql/t-sql/data-types/data-type-conversion-database-engine?view=sql-server-ver15 からです
decimalからdatetimeは暗黙的変換なら可能になっているけど明示的変換はできない?
まあ、いくら値の評価が合格でも不可能な型変換がある事を学びました。
バックエンドSQLserver リンクテーブルでaccessのクエリでフォーム作成している。
クエリのレコードロックを全部にすると他者はレコードを見ることもできない。
編集レコードロックはロックしないと同じ挙動。
MSACCESSのツール、オプションからエディタの設定でフォントを変えようとすると
フォントを選ぶコンボボックスの矢印が隠れて出てこない。
4Kディスプレイの高DPIスケーリング問題が原因のようです。解像度を一度落とすか、MSACCESS.EXEのプロパティ、互換性、高DPI設定の変更、スケーリングを上書きのところシステムにしてチェック入れる。
ソリューションを開く、イミディエイトウィンドウを開く、入力してもインテリセンスは出ない。
ブレークポイントなど置いてステップイン、エディターがデバッグモードになるとインテリセンスが出る。
その後はデバッグ中止して、普通の状態でも出る。
一度ソリューションを閉じて開く、デバッグ開始しなくても出る。
もう一度閉じて開くと出なくなる。
IDE再起動はもちろん出なくなる。
シンボルをローカルに置いても同じ症状。
4Kモニターのスケーリングを変えても同じ。
あまり困ることはないけど気になります。
visual studio2019で win10でもwindows server2019でも同様です。
前回の
1 2 3 4 5 6 7 |
Call Ary関数 For j = 0 To UBound(Ary関数, 1) For I = 1 To UBound(Ary関数, 2) objCells(j + 1, I + 2) = Ary関数(j, I) Next Next |
この部分耐えがたい遅さです。
vb.netの二次元配列はまあまあ我慢できますがVBAはデータが多くなるとだめです。
一次元目の要素(項目数)が少なければ一次元配列を並べた方が速いです。
さらに速いのはレコードセットから直接ループさせつつ書き込む。
すごく速いのでvb.netもデータテーブルから直接書き込むようにしました。
プロセスも今の所残っていません。コードが冗長になりますけど。
VBAからもできるでしょうと思ったけど・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
Public Function Excelbinding() Dim objExcel As Object Dim objExApp As Object Dim objWorkbook As Object Dim objWorkbooks As Object Dim fpath As String fpath = "xlsファイルのパス" Dim objSheets As Object Dim objSheet1 As Object Dim objSheet2 As Object Dim objSheet3 As Object Dim objCells As Object Dim I As Integer Dim j As Integer Set objExcel = CreateObject("Excel.Application") Set objExApp = objExcel.Application objExApp.Visible = True Set objWorkbooks = objExApp.Workbooks Set objWorkbook = objWorkbooks.Open(fpath) objExcel.DisplayAlerts = False 'System.Threading.Thread.Sleep(5000) Set objSheets = objExApp.Sheets Set objSheet1 = objSheets(1) objSheet1.Delete Set objSheet1 = objSheets(1) Set objSheet2 = objSheets("シート名") objSheet2.Copy Before:=objSheet1 Set objSheet3 = objSheets("シート名 (2)") '前回と同じコピーに流し込む Set objCells = objSheet3.Cells Call Ary関数 For j = 0 To UBound(Ary関数, 1) For I = 1 To UBound(Ary関数, 2) objCells(j + 1, I + 2) = Ary関数(j, I) Next Next objWorkbook.SaveAs (fpath) objExApp.Quit objExcel.DisplayAlerts = True Set objCells = Nothing Set objSheets = Nothing Set objSheet1 = Nothing Set objSheet2 = Nothing Set objSheet3 = Nothing Set objWorkbook = Nothing Set objWorkbooks = Nothing Set objExApp = Nothing Set objExcel = Nothing end function |
今までは意識してなかったけどVBAではオブジェクト解放は要らない?
プロセスは残らないが・・
とりあえずset=nothingで安心することに。
前回の続きです。
excelを開いて、あるワークシートのコピーを最前列に追加、
適当なセルから順に配列の値を流し込んで保存して閉じる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
Dim objExcel As Object = Nothing Dim objExApp As Object = Nothing Dim objWorkbook As Object = Nothing Dim objWorkbooks As Object = Nothing Dim fpath As String fpath = "ファイル.xlsのパス" Dim objSheets As Object = Nothing Dim objSheet1 As Object = Nothing Dim objSheet2 As Object = Nothing Dim objSheet3 As Object = Nothing Dim objCells As Object = Nothing Dim i As Integer Dim j As Integer Try objExcel = CreateObject("Excel.Application") objExApp = objExcel.Application objExApp.Visible = True 'objExApp.EnableEvents = False objWorkbooks = objExApp.Workbooks objWorkbook = objWorkbooks.Open(fpath) objExcel.DisplayAlerts = False 'System.Threading.Thread.Sleep(5000) objSheets = objExApp.Sheets objSheet1 = objSheets(1) objSheet1.delete '前回の入力は削除 Marshal.ReleaseComObject(objSheet1) objSheet1 = objSheets(1) objSheet2 = objSheets("シート名") objSheet2.Copy(Before:=objSheet1) Marshal.ReleaseComObject(objSheet1) Marshal.ReleaseComObject(objSheet1) 'なぜか2回解放が必要 Marshal.ReleaseComObject(objSheet2) objSheet3 = objSheets("シート名 (2)") objCells = objSheet3.Cells Call Ary関数() '別にpublic function Ary関数()で作成、二次元配列 For j = 0 To UBound(Ary関数, 1) For i = 1 To UBound(Ary関数, 2) objCells(j + 1, i + 2) = Ary関数(j, i) 'この辺は入れたい場所でいろいろ変化 Next Next Marshal.ReleaseComObject(objCells) Marshal.ReleaseComObject(objSheet3) Marshal.ReleaseComObject(objSheets) objWorkbook.SaveAs(fpath) Marshal.ReleaseComObject(objWorkbook) Marshal.ReleaseComObject(objWorkbooks) objExApp.Quit() objExcel.DisplayAlerts = True Marshal.ReleaseComObject(objExApp) Marshal.ReleaseComObject(objExcel) objCells = Nothing objSheets = Nothing objSheet1 = Nothing objSheet2 = Nothing objSheet3 = Nothing objWorkbook = Nothing objWorkbooks = Nothing objExApp = Nothing objExcel = Nothing Catch ex As Exception Throw End Try |
難しい