如何在没有打开文件的情况下从其他工作簿制作循环和计算公式

我想问如何从vba代码中做到这一点

工作簿1包含小区A,小区B,小区C工作簿2包含小区D,每个小区包含号码值小区D =(小区A – 小区B)*小区C

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

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中的行不是空的,它填充你的expression式D列):

 Sub mmacro() Dim path As String Dim workbookName As String Dim worksheetName As String Dim cella As String, cellb As String, cellc As String, celld As String Dim returnedValue1 As String, returnedValue2 As String, returnedValue3 As String Dim Hasil1 As Long Dim rownum As Integer Dim A As Integer, B As Integer, C As Integer, D As Integer path = "D:\tmp\" workbookName = "Book2" worksheetName = "Sheet1" cella = "F" cellb = "E" cellc = "D" celld = "A" rownum = 3'Data starts in row 3 in my example Do returnedValue1 = "'" & path & "[" & workbookName & "]" & _ worksheetName & "'!" & Range(cella & rownum).Address(True, True, -4150) returnedValue2 = "'" & path & "[" & workbookName & "]" & _ worksheetName & "'!" & Range(cellb & rownum).Address(True, True, -4150) returnedValue3 = "'" & path & "[" & workbookName & "]" & _ worksheetName & "'!" & Range(cellc & rownum).Address(True, True, -4150) A = CInt(ExecuteExcel4Macro(returnedValue1)) B = CInt(ExecuteExcel4Macro(returnedValue2)) C = CInt(ExecuteExcel4Macro(returnedValue3)) D = (A - B) * C Worksheets("Sheet1").Range(celld & rownum).Value = D rownum = rownum + 1 Loop While Not D = 0 End Sub 

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

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

注意 :下面的代码使用Early绑定,请设置对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