如何使用宏用MySQL数据更新Excel表?
嗯。。。我的问题是,我试图在VBA中创建一个宏,以便在每次按下按钮时从数据库更新表的值。连接是本地的,我使用SQLWorkbench来管理数据库。创建的表是:如何使用宏用MySQL数据更新Excel表?,excel,vba,adodb,recordset,Excel,Vba,Adodb,Recordset,嗯。。。我的问题是,我试图在VBA中创建一个宏,以便在每次按下按钮时从数据库更新表的值。连接是本地的,我使用SQLWorkbench来管理数据库。创建的表是: CCREATE TABLE EMPLEADO ( Cod_empleado INT NOT NULL, Nombre VARCHAR(90) NOT NULL, Fecha_inicio DATE NOT NULL, Referencia VAR
CCREATE TABLE EMPLEADO
( Cod_empleado INT NOT NULL,
Nombre VARCHAR(90) NOT NULL,
Fecha_inicio DATE NOT NULL,
Referencia VARCHAR(20) NULL,
Direccion VARCHAR(30) NOT NULL,
PRIMARY KEY (Cod_empleado));
它有数据。因此,我使用ADODB连接和记录集创建了这个宏(“tEMPLEADO”是Excel表的名称,“EMPLEADO”是工作表和SQL表的名称)
代码不会抛出任何错误,但不会执行任何操作,它应该用SQL表中的值替换Excel表中的所有值。正如你们所看到的,我试着用两种不同的方式粘贴值,但都不起作用。
提前感谢。试试这个:
Sub Actualizar_Empleado()
Dim tbl As ListObject, rng As Range
Dim con As ADODB.Connection
Dim com As New ADODB.Command
Dim rs As ADODB.Recordset
Dim fila As Long
Set con = New ADODB.Connection
con.Open "DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=localhost;DATABASE=bdferreteria;USER=PruebaUser;PASSWORD=Passw0rd;"
com.ActiveConnection = con
com.CommandText = "SELECT * FROM EMPLEADO"
com.CommandType = adCmdText
Set rs = com.Execute
If Not rs.EOF Then
Set tbl = ThisWorkbook.Sheets("EMPLEADO").ListObjects("tEMPLEADO")
DeleteTableRows tbl 'remove existing data
fila = 1
Do While Not rs.EOF
If fila = 1 Then
Set rng = tbl.ListRows(1).Range 'empty row 1 already exists
Else
Set rng = tbl.ListRows.Add.Range 'add a new row
End If
With rng
.Cells(1).Value = rs("Cod_empleado").Value
.Cells(2).Value = rs("Nombre").Value
.Cells(3).Value = rs("Fecha_inicio").Value
.Cells(4).Value = rs("Referencia").Value
.Cells(5).Value = rs("Direccion").Value
End With
fila = fila + 1
rs.MoveNext
Loop
rs.Close
con.Close
Else
MsgBox "Recordset is empty"
End If
con.Close
End Sub
'https://stackoverflow.com/questions/20663491/delete-all-data-rows-from-an-excel-table-apart-from-the-first
Sub DeleteTableRows(ByRef Table As ListObject)
On Error Resume Next
'~~> Clear Row 1 `IF` it exists
Table.DataBodyRange.Rows(1).ClearContents
'~~> Delete all the other rows `IF `they exist
Table.DataBodyRange.Offset(1, 0).Resize(Table.DataBodyRange.Rows.Count - 1, _
Table.DataBodyRange.Columns.Count).Rows.Delete
On Error GoTo 0
End Sub
试试看。这将把您的数据库连接设置为一个函数,接受选项卡和单元格的输入以存储结果,并接受要执行的SQL。此外,查询返回的记录没有不必要的循环:
Public Function adoQuery(targetSheet As String, StartCell As String, sSQL As Variant)
Dim ws As Worksheet
Dim myConn As ADODB.Connection
Dim myRS As ADODB.Recordset
Set myConn = New ADODB.Connection
Set myRS = New ADODB.Recordset
Dim strConn As String
strConn = "DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=localhost;" & _
"DATABASE=bdferreteria;USER=PruebaUser;PASSWORD=Passw0rd;"
Set ws = Worksheets(targetSheet)
myConn.Open strConn
myRS.Open sSQL, myConn, adOpenStatic, adLockReadOnly, adCmdText
If Not myRS.EOF Then
ws.Range(StartCell).CopyFromRecordset myRS
Else
MsgBox "No records were returned!"
End If
myRS.Close
myConn.Close
End Function
然后,在子系统中工作时,您可以灵活地定义希望执行的SQL语句,而不会每次干扰所有连接。下面是一个例子:
Sub GetData()
sSQL = "SELECT * FROM EMPLEADO"
adoQuery "EMPLEADO", "A1", sSQL
End Sub
是否粘贴了错误的mySQL表定义?工作表中是否有要更新的现有数据,或者只是添加新行?您的Excel“表”是一个实际的表/列表对象,还是一个常规的命名范围?我想更新Excel表中的现有数据,并且我的Excel表是一个实际的表,是的,对不起,我粘贴了错误的SQL表,我将在MediaTlywon中更正它。powerquery不能为您这样做吗?我必须使用记录集来执行此操作,但是如果没有其他选择,我可以试试powerquery
Sub GetData()
sSQL = "SELECT * FROM EMPLEADO"
adoQuery "EMPLEADO", "A1", sSQL
End Sub