accessのクエリでパーセントを表示するには、Format([式],"0.0%")でいい。式にフィrールド名(必要ならテーブル名!を付ける)を書けばいい。
2022年2月18日金曜日
2022年2月8日火曜日
accessのフォームのテキストボックスに更新後処理のイベントプロシジャを設定する。
accessのフォームのテキストボックスに更新後処理のイベントプロシジャを設定する。
Private Sub 当月_AfterUpdate()
With Me!当月
msgBox Me!当月
End With
end sub
2022年2月6日日曜日
access にexcelファイルの特定列をインポートするvbaコードを書いてみた。
access にexcelファイルの特定列(例えば、シート名が顧客リストのセルA2からc列まで)を顧客リストというテーブルにインポートするvbaコードを書いてみた。
Sub ImportExcel()
Dim file1 as String
file1 = "C:¥Users¥username¥Documents¥importedEXCEL.xlsx"
if DCount("*", "MSysObjects", "[Name] = '顧客リスト'") > 0 Then DoCmd.DeleteObject acTable,"顧客リスト" ' 顧客リストがあれば削除する
DoCmd.TransferSpreadsheet acImport,acSpreadsheetTypeExcel12Xml,"顧客リスト",file1,True,顧客リスト!A2:C
End Sub
2022年1月29日土曜日
accessでexcelファイルを取り込むにはインポート(acImport)か、リンク(acLink)か、どっちがよろしいのか?比べて、自動化のコードをvbaで書いてみた。
accessでexcelファイルを取り込むのにインポートが良いのか、或いはリンクが良いのか? 元のファイルを明確にする(しておきたい)必要がある場合は、リンク(acLink)を使うのが良い。 accessを開いた状態では、リンクしているexcelファイルがロックされるので、他のユーザがexcelファイルを更新できない(読み取り専用となる)。 勿論、accessを閉じれば、いいだけだ(他のユーザはexcelファイルを更新できるようになる)。 そんな使い勝手は、窮屈で嫌だというのであれば、元ファイルをその度にコピーし、複製をリンクしておくのがよろしいのではないか。 リンクした場合、データの型変換エラーがあると、そのフィールドが#num errorと表示されるが、実際、その値が使用されるまでわからない(と思う)。 また、リンクしたテーブルが空(タイトル行のみで、データ行がない)の場合、そのテーブルを参照するクエリは、全て型エラーになる(タイトル行のみで、データがないため、データ型を決められない=型が一致しないというチグハグなエラーで怒られる)ので、テーブルが空、つまり、タイトル行しかない場合は、そのクエリをスキップするとかの対応が必要となる。 vbaで書くと、If dcount("フィールド名","テーブル名") > 0 で判定し、成立した場合にクエリを出すというのがよろしい。 excelファイルをリンクするvbaを書いてみた。これでリンク操作を自動化できる。
Sub ImportExcel()
Dim file1 as String
file1 = "C:¥Users¥username¥Documents¥importedEXCEL.xlsx"
if DCount("*", "MSysObjects", "[Name] = 'テーブル1'") > 0 Then DoCmd.DeleteObject acTable,"テーブル1" ' テーブル1があれば削除する
DoCmd.TransferSpreadsheet acLink,acSpreadsheetTypeExcel12Xml,"テーブル1",file1,True,シート名
If Dcount("フィールド1","テーブル1") > 0 then 'テーブル1が空でなければ(フィールド1のデータが存在する)、クエリ1を実行する
DoCmd.Query "クエリ1"
End if
End Sub
元のファイルを明確にする必要がなければ、インポート(acImport)を使うのが良い。
インポートを使えば、元のexcelファイルがロックされることはない。
インポートを使うと、型変換エラーがあったら、インポート直後にその旨のエラーメッセージが出るので、対応しやすい。ただし、エラーを見逃さない執念深さが必要である。
excelファイルのインポート操作を自動化するvbaは、以下の通りだ。
Sub ImportExcel()
Dim file1 as String
file1 = "C:¥Users¥username¥Documents¥importedEXCEL.xlsx"
if DCount("*", "MSysObjects", "[Name] = 'テーブル1'") > 0 Then DoCmd.DeleteObject acTable,"テーブル1" ' テーブル1があれば削除する
DoCmd.TransferSpreadsheet acImport,acSpreadsheetTypeExcel12Xml,"テーブル1",file1,True,シート名
End Sub
2022年1月18日火曜日
access vba excel基本のコード
access vba excel操作の基本のコードは、以下の通り。 とりあえず、excel文書をオープンし、Sheet1を削除、上書き保存するコードを書いてみた。
Dim exApp As Object
Dim Wb As Object
Dim buf As string
Set exApp = CreateObject("Excel.Application")
exApp.Visible = False
exApp.DisplayAlerts = False
Set Wb = ExApp.Workbooks.Open("¥¥dir1¥dir2¥filename.xlsx")
or
buf = "¥¥dir1¥dir2"
file1 = dir(buf & "filename.xlsx")
exApp.workbooks(file1).open file1
With Wb
.Worksheets("Sheet1").Delete
other codes
.Save
.Close
End With
exApp.DisplayAlerts = True
exApp.Quit
Set exApp = Nothing
2022年1月12日水曜日
excelの複数シートコピーで、他シートへのリンクがあるシートは、参照元と参照先のシートを指定し、同時にコピーしなけばならない。
2021年12月31日金曜日
accessからexcelへDoCmd.TransferSpreadsheetでexportできるのは新規ファイルのみだ。
accessからexcelへDoCmd.TransferSpreadsheetでexportできるのは新規ファイルのみだ。既存ファイルへexportするとtoo many filedsみたいな訳がわからないメッセージでDoCmd.TransferSpreadsheetがエラーになる。(と思う)
どうしても既存のEXCELに落としたい場合、adoとかdaoとかで1レコードずつ、EXCELの既存シートに上書きするという方法(荒技)もあるようだ。
でも、どうしても既存ファイルと同じ名前のファイルにエクスポートしたければ、それを削除し、エクスポートするという荒技もある。
buf = "¥¥dir1¥dir2" file1 = buf & "filename.xlsx") if dir(file1) <> "" then kill file1 DoCmd.TransferSpreadsheetでfile1へexport
