Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用宏用MySQL数据更新Excel表?_Excel_Vba_Adodb_Recordset - Fatal编程技术网

如何使用宏用MySQL数据更新Excel表?

如何使用宏用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

嗯。。。我的问题是,我试图在VBA中创建一个宏,以便在每次按下按钮时从数据库更新表的值。连接是本地的,我使用SQLWorkbench来管理数据库。创建的表是:

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