2014年10月30日木曜日

VBAでクエリーが日本語を含めると結果が文字化ける件

Sub hh()
Dim sql As String
Dim rs As New ADODB.Recordset
Dim con As ADODB.Connection
Dim dbConnStr As String
dbConnStr = "Driver={MySQL ODBC 5.2 ANSI DRIVER}; SERVER=localhost; DATABASE=landscape; USER=root; PASSWORD=mypass;"
Set con = New ADODB.Connection
con.Open dbConnStr
sql = "SELECT '東京都' AS tokyou"
rs.Open sql, con
Debug.Print rs!tokyou
rs.Close
Set rs = Nothing
con.Close
Set con = Nothing
End Sub
結果表示

東・

ここでは「Driver={MySQL ODBC 5.2 ANSI DRIVER}」を「Driver={MySQL ODBC 5.2 UNICODE DRIVER}」に変更すればOK
また、「rs!tokyou」は「rs.Fields("tokyou")」で書いたほうがいいと思います。

2014年10月22日水曜日

モジュールを新規ブックにimportするマクロ

モジュールを新規ブックにimportするマクロ
gTempPath = IIf(Environ$("tmp") <> "", Environ$("tmp"), Environ$("temp"))
ThisWorkbook.VBProject.VBComponents("module1").Export (gTempPath & "\module1.bas")
Workbooks.Add
ActiveWorkbook.VBProject.VBComponents.Import (gTempPath & "\module1.bas")
CreateObject("Scripting.FileSystemObject").DeleteFile gTempPath & "\module1.bas"

SQLでbit演算,合計値格納項目のクエリー方法

DB定義書ではこのような項目がありました

my_field NULL → 1:ああああ 2:いいいい 4:うううう 8:ええええ 16:おおおお (合計値格納)

つまり複数選択可能な列です。
例えば「1:ああああ 2:いいいい」が選択されてDBに登録したらmy_fieldの値は1+2=「3」です。

そうするとクエリーの書き方は:
例えば「8:ええええ」に含まれるレコードを抽出したいときは:

......... where my_field & 8 = 8

でOKです。

エクセルの入力規則の数式を使って複雑な制限を実現する例

エクセルの入力規則の数式を使って複雑な制限を実現する例です:
例えばA1セルで以下の入力を許可する:

①整数数字の入力(例)123
②整数数字-整数数字(例)123-456

以下やり方:
1.まず、「1-1」を入力すると「1月1日」とエクセルが余計のことをするので、まずセルを「文字列」にしましょう

2.数字を許す→データ→入力規則→ユーザー設定→数式:
  条件①整数数字の入力について、本来なら数式に「=ISNUMBER(A1)」で話は済んだが、こちら「文字列」にしたせいで、ISNUMBERは常にFALSE
  解決方法は「=NOT(ISERROR(INT(A1)))」を使います。

3.また、条件②整数数字-整数数字を追加すると、数式が一気に複雑になります
  「=OR(NOT(ISERROR(INT(A1))),AND(NOT(ISERROR(FIND("-",A1))),NOT(ISERROR(INT(MID(A1,1,FIND("-",A1)-1)))),NOT(ISERROR(INT(MID(A1,FIND("-",A1)+1,LEN(A1)))))))」

注意!!数式が複雑すぎで、長すぎで入れなくなってしまう可能性があります!! ↓↓↓
「A1」を自己参照の「INDIRECT(ADDRESS(ROW(),COLUMN()))」に変換しようとしたら、数式を長すぎで入れなくなってしまった…
  

2014年10月16日木曜日

VBA行・列ごとのResize

よくあるのはセルのResize
Debug.Print Range("A1").Resize(2,2).Address
    →$A$1:$B$2
そうします
Debug.Print Columns("A").Resize(1,2).EntireColumn.address
    →$A:$B