| 内容 | 指定文字 | 例 |
|---|---|---|
| 表示する桁数を指定する。"0"1つで1桁を表し、それより桁数が少ない数値の場合は"0"で埋められる。 | 0 | Format(12345,"0000000") → 0012345 Format(12345,"000") → 12345 |
| 表示する桁数を指定する。"#"1つで1桁を表し、それより桁数が少ない数値の場合は元の数値がそのまま返される。 | # | Format(12345,"#######") → 12345 Format(12345,"###") → 12345 |
| 0や"#"と組み合わせて小数点の位置を指定する。 | . | Format(12345.567,"0000000.00") → 0012345.57 Format(12345.567,"0000000.00000") → 0012345.56700 Format(12345.567,"#######.##") → 12345.57 Format(12345.567,"#.#####") → 12345.567 |
| 0や"#"と組み合わせて1000ごとにカンマで区切る。 | , | Format(12345,"0,000,000") → 0,012,345 Format(12345,"#,###") → 12,345 |
| 数値を100倍してパーセント表示する。 | % | Format(0.25,"#%") → 25% |
| 数値の先頭に¥マークを付ける。 | \\ | Format(12345,"\\#,###") → \12,345 |
| このマークのすぐ後1文字をそのまま表示する。 | \ | Format(12345,"\@#,###") → @12,345 Format(12345.56,"0.000\円/\ケ") → 12345.560円/ケ |
| ダブルクォーテーションで囲まれた文字列はそのまま表示する。 | Format(12345,"#,###""です""") → 12,345です |
2012年8月21日火曜日
excelの数値format
2012年8月17日金曜日
sql、カレンダー作成
2010/4/1から2012/5/31までのカレンダーを作成
Declare @date table(d datetime)
Declare @d datetime
set @d='20100401'
While @d<='20120531'
Begin
Insert into @date values (@d)
set @d=@d+1
End
Select d as date_ymd into calendar from @date
エクセルでデータベースを参照するサンプル、SQL ServerとmySQL対応
シート1の名前を「"テーブル一覧"」にして、ボタンを追加する
そして、I列の1から5行目、下記の情報を入れる
サーバー
DB名
ユーザ
パスワード
接続DBタイプ["SQL Server","MySQL ODBC 5.1 DRIVER"]
※今のところ、MS SQL Serverとmysqlしか対応していない
シート"テーブル一覧"は
モジュールに下記のコード
そして、I列の1から5行目、下記の情報を入れる
サーバー
DB名
ユーザ
パスワード
接続DBタイプ["SQL Server","MySQL ODBC 5.1 DRIVER"]
※今のところ、MS SQL Serverとmysqlしか対応していない
シート"テーブル一覧"は
Private Sub CommandButton1_Click()
Call getTables
End Sub
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
'MsgBox Target.TextToDisplay
getTableData Target.TextToDisplay
End Sub
モジュールに下記のコード
Public con As ADODB.Connection
Public wb As Workbook
Public st As Worksheet
Public gDB As String
Public gConDriver As String
Dim connectionString As String
Sub initDBcon()
Set wb = ThisWorkbook
Set st = wb.Worksheets("テーブル一覧")
'接続文字列
gConDriver = st.Range("I5")
Select Case gConDriver
Case "SQL Server"
connectionString = "Provider=Sqloledb;" _
& " Data Source=" & st.Range("I1") & ";" _
& " Initial Catalog=" & st.Range("I2") & ";" _
& " Connect Timeout=15;" _
& " user id=" & st.Range("I3") & ";" _
& " password=" & st.Range("I4")
Case "MySQL ODBC 5.1 DRIVER"
connectionString = "Driver={" & gConDriver & "};" _
& " SERVER=" & st.Range("I1") & ";" _
& " DATABASE=" & st.Range("I2") & ";" _
& " USER=" & st.Range("I3") & ";" _
& " PASSWORD=" & st.Range("I4") & ";"
End Select
gDB = st.Range("I2")
'ADODB.Connection生成
Set con = New ADODB.Connection
On Error GoTo Err
'MySQLに接続
con.Open connectionString
Exit Sub
Err:
Set con = Nothing
MsgBox (Err.Description)
End Sub
Sub getTables()
Dim rs As ADODB.Recordset
Dim sqlStr As String
Dim rowNo As Integer
Dim colNo As Integer
Dim item As Variant
Call initDBcon
If con Is Nothing Then
Exit Sub
End If
Application.DisplayAlerts = False
For Each stname In wb.Sheets
If stname.Name <> "テーブル一覧" Then
stname.Delete
End If
Next
Application.DisplayAlerts = True
'SQL文
Select Case gConDriver
Case "SQL Server"
sqlStr = "select table_name from information_schema.tables;"
Case "MySQL ODBC 5.1 DRIVER"
sqlStr = "show tables;"
End Select
'SQL文実行
Set rs = con.Execute(sqlStr)
'シートデータクリア
'st.Cells.Clear
st.Columns("A:A").Clear
rowNo = 1
Do While rs.EOF = False
'データ抽出
For Each item In rs.Fields
st.Range("A" & rowNo).Value = item.Value
st.Range("A" & rowNo).Hyperlinks.Add Anchor:=st.Range("A" & rowNo), _
Address:="", TextToDisplay:=item.Value
Next
rowNo = rowNo + 1
'次のレコード
rs.MoveNext
Loop
'クローズ
con.Close
Set rs = Nothing
Set con = Nothing
Exit Sub
End Sub
Sub getTableData(ByVal srtTableName As String)
Dim stname As Variant
Dim qt As QueryTable
Call initDBcon
For Each stname In wb.Sheets
If stname.Name = srtTableName Then
Exit Sub
End If
Next
wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count)).Name = srtTableName
On Error GoTo Err
Select Case gConDriver
Case "MySQL ODBC 5.1 DRIVER"
With wb.Worksheets(srtTableName).ListObjects.Add(SourceType:=xlSrcExternal, Source:=Array(Array( _
"ODBC;" & connectionString), Array("E=db35211_CustomerMasterList;DefaultTable=Customers;")), _
Destination:=wb.Sheets(srtTableName).Range("$A$1")).QueryTable
.CommandText = Array("Select * FROM " & srtTableName)
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "テーブル_" & gDB & "_" & srtTableName
.Refresh BackgroundQuery:=False
End With
Case "SQL Server"
With wb.Worksheets(srtTableName).ListObjects.Add(SourceType:=xlSrcExternal, Source:=Array( _
"OLEDB;" & connectionString), Destination:=wb.Sheets(srtTableName).Range("$A$1")).QueryTable
.CommandType = xlCmdTable
.CommandText = Array("""" & gDB & """.""dbo"".""" & srtTableName & """")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "テーブル_" & gDB & "_" & srtTableName
.Refresh BackgroundQuery:=False
End With
End Select
Exit Sub
Err:
Set con = Nothing
MsgBox (Err.Description)
End Sub
2012年8月15日水曜日
あるセルにとって、最終行、列を返す
ラベル:
vba
'rgStart 単一セル
'horv 縦か横か、デフォルト縦
'戻り値
' 縦の場合 0→エラー
' 横の場合 ""→エラー
Public Function getBounce(ByRef rgStart As Range, Optional ByVal horv As String = "V") As String
Dim blnVertical As Boolean
Dim rgBounce As Range
blnVertical = IIf(UCase(horv) = "H", False, True)
If blnVertical Then
Set rgBounce = rgStart.Worksheet.Range(ConvertToLetter(rgStart.Column) & rgStart.Worksheet.Rows.Count).End(xlUp)
If rgStart.Cells.Count > 1 Then
getBounce = IIf(blnVertical, 0, "")
Exit Function
End If
If rgStart.Value = "" And rgBounce.Row <= rgStart.Row Then
getBounce = 0
Else
getBounce = rgBounce.Row
End If
Exit Function
Else
Set rgBounce = rgStart.Worksheet.Range(ConvertToLetter(rgStart.Worksheet.Columns.Count) & rgStart.Row).End(xlToLeft)
If rgStart.Value = "" And rgBounce.Column <= rgStart.Column Then
getBounce = ""
Else
getBounce = ConvertToLetter(rgBounce.Column)
End If
Exit Function
End If
End Function
Function ConvertToLetter(iCol As Integer) As String
ConvertToLetter = Split(Cells(1, iCol).Address, "$")(1)
End Function
大量データのCSVをソート方法
Excelのソート機能を使う方法
大量のデータの時、65535行(excel2007以下),100万?を超えた時
ちなみに、下の順番にならないためには、
クエリーをこのようにclng関数を使う
sqlではcastやconvertなど使いますが、Microsoft.Jet.OLEDB(Access)ではclngなどで文字列を数字に変換する
Dim wb As New Workbook
Dim st As New Worksheet
Dim sortField As Range
Dim rg As Range
'csvファイルを開く
Set wb = Workbooks.Open("c:\abc.csv")
'シートをセット(csvファイルはsheet1しかない)
Set st = wb.Sheets(1)
For Each rg In st.Range("1:1")
If rg = "容器番号" Then 'ソートする列を探す
Set sortField = rg
Exit For
End If
Next
'ソート(容器番号)
st.UsedRange.Sort Key1:=sortField, Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin
大量のデータの時、65535行(excel2007以下),100万?を超えた時
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source='c:\';" & _
"Extended Properties='Text;HDR=YES'"
'c:\abc.csvというファイルをデータベーステーブルとして開く、「容器番号」という列を昇順でソート
Set rs = cn.Execute("SELECT * FROM abc.csv ORDER BY clng(容器番号) ASC")
Do Until rs.EOF
'データを書き出しなどの処理
'...
rs.MoveNext
Loop
"HDR=YES"は最初の行はタイトルという意味。ちなみに、下の順番にならないためには、
1
10
2
3
...
クエリーをこのようにclng関数を使う
SELECT * FROM abc.csv ORDER BY clng(容器番号) ASC
sqlではcastやconvertなど使いますが、Microsoft.Jet.OLEDB(Access)ではclngなどで文字列を数字に変換する
Excelのソートの話
Excel2007のソート
Order:=xlAscending→昇順、xlDescending降順
.SetRange Range("A5:CO90")→並び替え範囲
.Header = xlNo→ヘッダーありなし(xlYes,xlNo)、xlGuessの利用は避けたほうが無難。
Excel XP(2002)のソート
ActiveWorkbook.Worksheets("201210期").Sort.SortFields.Clear
Worksheets("201210期").Sort.SortFields.Add Key:=Worksheets("201210期").Range("B4"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With Worksheets("201210期").Sort
.SetRange Worksheets("201210期").Range("A5:CO90")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B4")→並び替え列Order:=xlAscending→昇順、xlDescending降順
.SetRange Range("A5:CO90")→並び替え範囲
.Header = xlNo→ヘッダーありなし(xlYes,xlNo)、xlGuessの利用は避けたほうが無難。
Excel XP(2002)のソート
Worksheets("201210期").Range("A5:CO90").Sort Key1:=Worksheets("201210期").Range("B4"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin
Excelは下位互換ですので、XPも2007も2010も使えるためには、excel xpのコードで実装したほうが無難
2012年8月2日木曜日
ランダム数字のcsvを作成するツール
固定でc:\abc.csvです
Sub csvRnd()
Dim txt As Integer
Dim lngidx As Long
Dim lngStart As Long
Dim lngEnd As Long
txt = FreeFile
Open "c:\abc.csv" For Output As #txt
Write #txt, "ID", "Name"
lngStart = 1
lngEnd = 120000
For lngidx = lngStart To lngEnd
Write #txt, lngidx, Int((lngEnd - lngStart + 1) * Rnd + lngStart)
Next
Close #txt
MsgBox "completed!", vbInformation
End Sub
登録:
コメント (Atom)