Vba 如何在不打开文件的情况下从另一个工作簿生成循环和计算公式

Vba 如何在不打开文件的情况下从另一个工作簿生成循环和计算公式,vba,excel,Vba,Excel,我想问一下如何从vba代码中执行此操作 工作簿1包含单元格A、单元格B、单元格C 工作簿2包含单元格D 每个单元格都包含数值 单元D=(单元A-单元B)*单元C 我想计算并将值返回工作簿2中的单元格D,这里是我的代码片段 Dim path As String Dim workbookName As String Dim worksheetName As String Dim cella As String, cellb As String, cellc As Stri

我想问一下如何从vba代码中执行此操作

工作簿1包含单元格A、单元格B、单元格C 工作簿2包含单元格D 每个单元格都包含数值 单元D=(单元A-单元B)*单元C

我想计算并将值返回工作簿2中的单元格D,这里是我的代码片段

  Dim path As String
    Dim workbookName As String
    Dim worksheetName As String
    Dim cella As String, cellb As String, cellc As String
    Dim returnedValue1 As String, returnedValue2 As String, returnedValue3 As String
    Dim Hasil1 As Long

    path = "D:\"
    workbookName = "Workbook1"
    worksheetName = "Daily"

    cella = "F7"
    cellb = "E7"
    cellc = "D7"
    returnedValue1 = "'" & path & "[" & workbookName & "]" & _
          worksheetName & "'!" & Range(cella).Address(True, True, -4150)
    returnedValue2 = "'" & path & "[" & workbookName & "]" & _
          worksheetName & "'!" & Range(cellb).Address(True, True, -4150)
    returnedValue3 = "'" & path & "[" & workbookName & "]" & _
          worksheetName & "'!" & Range(cellc).Address(True, True, -4150)

    Worksheets("Workbook2").Cells(D).Value = CLng(ExecuteExcel4Macro(returnedValue1) - ExecuteExcel4Macro(returnedValue2)) * ExecuteExcel4Macro(returnedValue3)
就我的代码而言是好的,但是如何在一列中完成它,除了单元格A之外,我还有很多单元格。我想这样计算 D列=(A列-B列)*C列

感谢您的回答。

类似的内容(虽然列A中的行不是空的,但它填充列D中的表达式):


这只是一个例子。需要进一步改进

我的评论这里有一个更快的方法,它不使用循环。使用ACE.OLEDB将3列读取到临时表中,然后执行计算。是的,ACE.OLEDB将打开另一个excel文件,但它不像excel那样打开它

注意:以下代码使用早期绑定,请设置对ActiveX对象数据XX.XX库的引用

Option Explicit

Sub Sample()
    Dim sConn As String
    Dim rs As ADODB.Recordset
    Dim mySQL As String, sPath As String
    Dim wsI As Worksheet, wsO As Worksheet
    Dim wsILRow As Long, i As Long

    '~~> Change this to the relevant Excel File
    sPath = "C:\MyFile.xlsx"

    '~~> Change connection string if the above is not xlsx
    sConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
               "Data Source=" & sPath & ";" & _
               "Extended Properties=Excel 12.0"

    '~~> Assuming that workbook 2 has sheet1 from where you want data
    mySQL = "SELECT * FROM [Sheet1$A:C]"

    Set rs = New ADODB.Recordset
    rs.Open mySQL, sConn, adOpenUnspecified, adLockUnspecified

    '~~> Create a temp sheeet to get the data from closed file
    Set wsI = ThisWorkbook.Sheets.Add
    '~~> Dump the data in the temp sheet
    wsI.Range("A1").CopyFromRecordset rs

    '~~> Close the recordset
    rs.Close
    sConn.Close
    Set rs = Nothing
    Set sConn = Nothing

    '~~> Get last row from temp sheet
    wsILRow = wsI.Range("A" & wsI.Rows.Count).End(xlUp).Row

    '~~> This is where you want the output
    Set wsO = ThisWorkbook.Sheets("Sheet1")

    With wsO
        '~~> Insert values in one go
        .Range("D1:D" & wsILRow).Formula = "=(" & wsI.Name & "!A1 - " & _
                                           wsI.Name & "!B1) * " & _
                                           wsI.Name & "!C1"
        '~~> Change formulas to values
        .Range("D1:D" & wsILRow).Value = .Range("D1:D" & wsILRow).Value
    End With

    '~~> Delete tmep sheet
    On Error Resume Next
    Application.DisplayAlerts = False
    wsI.Delete
    Application.DisplayAlerts = False
    On Error GoTo 0
End Sub

你试过打圈吗?您可以使用for循环重复某些代码任意多次。请参见Excel应用程序中是否将此计算设置为自动?我的意思是,当您在关闭前保存工作簿2时,是否所有公式都在D列中更新?如果是,那么您可以直接从Col Dan中提取值。另一种更快的方法(我认为)是使用
ACE.OLEDB
将3列读取到临时表中,然后执行计算。是的,
ACE.OLEDB
将打开另一个excel文件,但它不像excel那样打开它。感谢您的回复。。。但我需要在某些行中,而不是在一列中。只建议第3行到第10行,如何做到这一点,您的循环只针对一列的所有内容。。请…@BudiSetiawan您可以用
Loop While rownum替换
Loop While D=0
,谢谢您的回复。。。但是我不理解SQLIt,如果您尝试一下,它并没有那么难:)
Option Explicit

Sub Sample()
    Dim sConn As String
    Dim rs As ADODB.Recordset
    Dim mySQL As String, sPath As String
    Dim wsI As Worksheet, wsO As Worksheet
    Dim wsILRow As Long, i As Long

    '~~> Change this to the relevant Excel File
    sPath = "C:\MyFile.xlsx"

    '~~> Change connection string if the above is not xlsx
    sConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
               "Data Source=" & sPath & ";" & _
               "Extended Properties=Excel 12.0"

    '~~> Assuming that workbook 2 has sheet1 from where you want data
    mySQL = "SELECT * FROM [Sheet1$A:C]"

    Set rs = New ADODB.Recordset
    rs.Open mySQL, sConn, adOpenUnspecified, adLockUnspecified

    '~~> Create a temp sheeet to get the data from closed file
    Set wsI = ThisWorkbook.Sheets.Add
    '~~> Dump the data in the temp sheet
    wsI.Range("A1").CopyFromRecordset rs

    '~~> Close the recordset
    rs.Close
    sConn.Close
    Set rs = Nothing
    Set sConn = Nothing

    '~~> Get last row from temp sheet
    wsILRow = wsI.Range("A" & wsI.Rows.Count).End(xlUp).Row

    '~~> This is where you want the output
    Set wsO = ThisWorkbook.Sheets("Sheet1")

    With wsO
        '~~> Insert values in one go
        .Range("D1:D" & wsILRow).Formula = "=(" & wsI.Name & "!A1 - " & _
                                           wsI.Name & "!B1) * " & _
                                           wsI.Name & "!C1"
        '~~> Change formulas to values
        .Range("D1:D" & wsILRow).Value = .Range("D1:D" & wsILRow).Value
    End With

    '~~> Delete tmep sheet
    On Error Resume Next
    Application.DisplayAlerts = False
    wsI.Delete
    Application.DisplayAlerts = False
    On Error GoTo 0
End Sub