2016年12月6日火曜日

ADOレコーダーがあるのに、RecordCountが「-1」の場合の対処

レコーダーがあるのに、RecordCountが「-1」の場合の対処

connect.CursorLocation = 3 'クライアントカーソルにする
Set rs = execQuery(cn, sql, , adOpenKeyset, adLockOptimistic)
debug.print rs.RecordCount

2016年9月2日金曜日

列の値を一括更新(LOOP、Query、補助列を使わず!)

列の値を一括更新するときは、vbaで行ごとLOOPを書くか、ADODBでUpdateクエリーを書くか、補助列を挿入して数式で計算させるかでも、最近「Evaluate」知ったですよ

Range("B:B").Value = Evaluate(Range("B:B").Address & "*10")

これは神メソッドですね。気を付けなければならないのは、空欄が0に評価されてしまう、数字以外の文字列がエラーになる。

メソッド化にすると
Sub updateRangeValues(ByRef rg As Range, strFormula As String, Optional strFormat As String = "")
    rg.Worksheet.Activate '←ここが重要!!、なぜかこうしないと全部0と評価してしまう
    If strFormat <> "" Then
        rg.NumberFormatLocal = strFormat
    End If
    rg.Value = Application.Evaluate(rg.Address & strFormula)
    Application.Calculate
    Do While Application.CalculationState <> xlDone '←念のため、計算が終わまでDoEvents
        DoEvents
    Loop
End Sub
使い方:

Call updateRangeValues(Range("A1:A1000"),"*10.1","#.00")

LOOP、Query、補助列を使わずに、"A1:A1000"列の数値を全部*10.1,書式を小数点二桁にする


もう少し複雑な数式でもいけるらしい
Sub nn()
Dim rg As Range
Set rg = ThisWorkbook.Worksheets(1).Range("C1:C36")
strFormula = "=IF(" & rg.Address & "= """",""IS EMPTY""," & rg.Address & "*10)"
rg.Value = Application.Evaluate(strFormula)
End Sub

2016年8月24日水曜日

SVN Error handling externals definition for


[root@abc my_production]# svn up
svn: 警告: Error handling externals definition for 'lib/wired':
svn: 警告: OPTIONS (URL: 'http://svn.notexisted.jp/repos/wired/php/branches/0.2.x/lib'): サーバに接続できませんでした (http://svn.notexisted.jp)
リビジョン 1718 です。


svn propdel --recursive svn:externals .
svn ci -m"svn propdel --recursive svn:externals"

svn up
U lib
svn: 警告: Error handling externals definition for 'lib/wired':
svn: 警告: OPTIONS (URL: 'http://svn.notexisted.jp/repos/wired/php/branches/0.2.x/lib'): サーバに接続できませんでした (http://svn.notexisted.jp)
リビジョン 1719 に更新しました。

2016年7月15日金曜日

ado,sqlのunderline…自分かバカすぎで笑えない

sqlではアンダーライン"_"は、任意の一文字って意味か、ADOでもMysqlでも...、やられた、ADOでは"[]"でエスケープする、sqlでは"\"でエスケープする。
正規表現とごっちゃまぜしちゃダメよ。(;_;)


SELECT * FROM tbl WHERE tname LIKE 'abc[_]%'

SQL

SELECT * FROM tbl WHERE tname LIKE 'abc\_%'

2016年6月30日木曜日

VBAのRoundの罠

ROUND(38.5)
結果:38

ROUND(39.5)
結果:40

「銀行家の丸め (bankers' rounding)」、「銀行丸め」ともいう。
5が切り捨てられたり切り上げられたりするので「五捨五入」と呼ばれたり、
端数がちょうど0.5の場合に整数部分が偶数なら切り捨て奇数なら切り上げる
ので「偶捨奇入」と呼ばれたりもする。



本当の「四捨五入」したい場合は

WorksheetFunction.Round()

が有効だそうです。
しかし、ADODB,Jet.OLEDBなどでQuery(クエリー)で運用時は使えないので

sql = "UPDATE MyTable SET `Ammount` = ROUND(35*1.1)"
Call csv_cn.Execute(sql)

=ROUND(38.5) = 38



sql = "UPDATE MyTable SET `Ammount` = FORMAT(35*1.1,""#"")"
Call csv_cn.Execute(sql)

=ROUND(38.5) = 39

ちなみに、小数点以下2位の四捨五入は

sql = "UPDATE MyTable SET `Ammount` = FORMAT(35*1.111,""#.00"")"
Call csv_cn.Execute(sql)




2016年6月24日金曜日

Scripting.Dictionaryのkeyまたはitemをindexで参照する方法

Dim dic As New Scripting.Dictionary
dic.Add "a", "apple"
dic.Add "b", "banana"

'For Eachで
Dim vntKey As Variant
For Each vntKey In dic.Keys
    Debug.Print vntKey & ":" & dic(vntKey)
Next

'または Forで
Dim intX As Integer
For intX = 0 To dic.Count - 1
    Debug.Print dic.Keys(intX) & ":" & dic.Items(intX)
Next


'Indexで指定でもいい←これは面白い
Debug.Print dic.Keys()(0) & ":" & dic.Items()(0)
Debug.Print dic.Keys()(1) & ":" & dic.Items()(1)
'最後のkeyとvalue
Debug.Print dic.Keys()(dic.Count - 1) & ":" & dic.Items()(dic.Count - 1)

2016年3月26日土曜日

OSが64bitでも64bitのODBC Connectorを使ってはいけません!Officeのbit数を確認べし…そうなの?!!

ぬぬぬ、罠だ!
64bitのOSも絶対64bitのMySQL Connector/ODBC

https://dev.mysql.com/downloads/connector/odbc/

64bitを使うと
「データ ソース名および指定された既定のドライバーが見つかりません」がでます

32bitを使うとすーっと通る

なぜた?!!!

うわー、Officeが32bitじゃん!!バカが!!!っと脱力した…