一言で言えば、私はクライアント用のスケジューラを作成していますが、制約のために、1つのExcelファイル可能)。したがって、ワークシートの1つはUIとして機能し、他のワークシートはテーブルまたは設定になります。ExcelワークシートとのVBA-SQLの更新/挿入/選択
1つのワークシート(「TblEmpDays」という名前)でスケジュールデータを処理するためにSQLを使用しようとしています。したがって、このワークシートとの間でレコードを追加/更新して取得する必要があります。私はSELECT
クエリをいくつかの任意のデータ(および範囲に貼り付ける)で動作させることができました。しかし、私はINSERT
またはUPDATE
を動作させることができません。私はそれがINSERT INTO [<table name>$] (<field names>) VALUES (<data>);
として構造化されているのを見ました。しかし、これは私に「『-2147217900(80040E14)』 INSERT INTOステートメントの構文エラーを。」実行時エラーを与える
を、私はこのすべてを書くためにVBAを使用していると私は作るためにSQLヘルパークラスを作りましたクエリの実行が容易になります。
私の質問は、INSERT
とUPDATE
のクエリをどのように構築する必要があるのですか?私は何が欠けていますか?私はできるだけ多くの関連情報を投稿しようとしていますので、私が何かを見逃していれば教えてください。
クラスSQL:
Private pCn ' As Database
Private pResult 'As Recordset
Private pSqlStr As String
Public Property Get Result()
Result = pResult
End Property
Public Function Init()
Set pCn = CreateObject("ADODB.Connection")
With pCn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=""Excel 12.0 Macro;HDR=YES;ReadOnly=False"";"
.Open
End With
End Function
Public Function Cleanup()
If Not (pCn Is Nothing) Then
pCn.Close
Set pCn = Nothing
End If
If Not pResult Is Nothing Then
Set pResult = Nothing
End If
End Function
Public Function CopyResultToRange(rg As Range)
If Not rg Is Nothing And Not pResult Is Nothing Then
rg.CopyFromRecordset pResult
End If
End Function
Public Property Get query() As String
query = pSqlStr
End Property
Public Property Let query(value As String)
pSqlStr = value
End Property
Public Function Execute(Optional sqlQuery As String)
If sqlQuery = "" Then
sqlQuery = query
End If
If Not pCn Is Nothing Then
Set pResult = pCn.Execute(sqlQuery, , CommandTypeEnum.adCmdText Or ExecuteOptionEnum.adExecuteNoRecords)
Else
MsgBox "SQL connection not established"
End If
End Function
実行機能は:
Dim s As SQL ' this is the SQL class '
Dim tbl As String
' rcDay=date string, rcIn & rcOut = time strings, rcVac=boolean string, rcSls=number string'
Dim rcName As String, rcDay As String, rcIn As String, rcOut As String, rcVac As String, rcSls As String
Dim qry As String
tbl = "[TblEmpDays$]"
qry = "INSERT INTO <tbl> (name, date, in, out, vac, sales)" & vbNewLine & _
"VALUES ('<name>', '<date>', '<in>', '<out>', '<vac>', <sales>);"
' Set rc* vars '
s.Init
s.query = Replace(Replace(Replace(Replace(Replace(Replace(Replace(qry, _
"<tbl>", tbl), _
"<sales>", rcSls), _
"<vac>", rcVac), _
"<out>", rcOut), _
"<in>", rcIn), _
"<date>", rcDay), _
"<name>", rcName)
MsgBox s.query
s.Execute
s.Cleanup
私は解決策を見つけることができない以上、すべてを見てきました。私はちょうど正しいフレーズや何かをシンプルに検索していないと確信しています。
Excelでデータベースを再作成するのは難しい作業です。 Jet/ACEデータベースを作成するためにMS Accessを使用しますか?注意:ユーザーはAccessを使用する必要はありませんが、UIブックを.accdb/.mdbファイルに接続してデータを格納し、使用可能なSQLをすべて使用できます。 Jet/ACE SQLエンジンは、Windowsユーザーが使用できる.dllファイルです(また、Accessにのみ限定されません)。 – Parfait
@パルフェット私はそれを掘り下げなければならないでしょう(矛盾する回答を得る...).dllは何ですか、そしてそれはどこにありますか?たぶん私は彼らがアクセスを持っていない場合はそれを見つけることができます。 (私はこのプロジェクト全体を考えて、Accessを使用することができればどれくらい簡単になるでしょうか) – CheeseMo
通常、Windows自体にインストールされているJet/ACEエンジンを使用するには、MS Accessはインストールされていません。 Notepad.exeのようなものです。 Registry、HKEY CLASSES ROOT: 'Microsoft.ACE.OLEDB.12.0'と' Microsoft.JET.OLEDB.4.0'を参照してください。また、ユーザーは.accdbファイルを使用するには**無料** [Access runtime](https://www.microsoft.com/en-US/download/details.aspx?id=39358)をダウンロードできます(ただし、開発者はフルプログラム)。 – Parfait