Vba 如何在不打开文件的情况下从另一个工作簿生成循环和计算公式
我想问一下如何从vba代码中执行此操作 工作簿1包含单元格A、单元格B、单元格C 工作簿2包含单元格D 每个单元格都包含数值 单元D=(单元A-单元B)*单元C 我想计算并将值返回工作簿2中的单元格D,这里是我的代码片段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
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