(VB Express Level:Beginner)
我想做以下,
工作簿1中的一列 一个
B'/ P>
C
d
Workbook2中的一列
e
˚F
g
h
输出到单个单元格
AE + BF + CG + DH
(输出是Sumproduct。)
工作簿1中有44行,工作簿2中有44行。但是工作簿1中有3列,工作簿2中有104列。工作簿3中的每列必须与工作簿2中的104列相乘。
以下是我的努力,它在列的所有单元格中写入相同的值。我的理解是我的循环在某处错了。但我无法弄清楚出了什么问题。
'link to workbooks
oWB5 = oXL5.Workbooks.Open("D:\1.xlsx")
oWB6 = oXL6.Workbooks.Open("D:\2.xlsx")
oWB7 = oXL7.Workbooks.Open("D:\outputs.xlsx")
'link to worksheets
oSheet5 = oWB5.Worksheets("Inputs")
oSheet6 = oWB6.Worksheets("Coef")
oSheet7 = oWB7.Worksheets("Sheet1")
' ranges to be considerd,
' oWB5 range C22 to C66
' oWB6 range C3 to C47
' oWB7 range C2 to C104 (because there are 104 columns in oWB6)
'multiplication of ranges
For j = 3 To 47
For i = 2 to 104
For k = 2 to 4
For l = 22 to 66
oSheet7.Cells(i, k).Value = (oSheet5.Cells(l, k).value * oSheet6.Cells(j, i+1).value) + (oSheet5.Cells(l+1, k).value * oSheet6.Cells(j + 1, i+1).value)
Next
Next
Next
Next
非常感谢帮助。我现在两天都在苦苦挣扎。
答案 0 :(得分:1)
感谢您更详细地重新发布此问题。 我已经写了一个带有评论的循环,我认为这些评论可以实现您的目标。
'link to workbooks
oWB5 = oXL5.Workbooks.Open("D:\1.xlsx")
oWB6 = oXL6.Workbooks.Open("D:\2.xlsx")
oWB7 = oXL7.Workbooks.Open("D:\outputs.xlsx")
'link to worksheets
oSheet5 = oWB5.Worksheets("Inputs")
oSheet6 = oWB6.Worksheets("Coef")
osheet7 = oWB7.Worksheets("Sheet1")
' ranges to be considerd,
' oWB5 range C22 to C66
' oWB6 range C3 to C47
' oWB7 range C2 to C104 (because there are 104 columns in oWB6)
'multiplication of ranges
Dim lngOutputCounter As Long
For i = 1 To 104 'for each column WB6
For j = 1 To 3 'for each column WB5
lngOutputCounter = 0 'reset to 0
For k = 1 To 44 'loop through 44 rows
'multiply the two cells and keep a running total
'- 21+k to start at row 22, 2+k to start at row 3, 2+j and 2+i because columns start at C
lngOutputCounter = lngOutputCounter + oSheet5.Cells(21 + k, 2 + i).Value * oSheet6.Cells(2 + k, 2 + j).Value
Next k
'whatever column sheet2 was on becomes row here, j is still the same column (1-3)
'- i+i to output to row 2 first, 2+j to output to column C first
osheet7.Cells(1 + i, 2 + j).Value = lngOutputCounter
Next j
Next i
答案 1 :(得分:1)
这是一个使用Excel的SUMPRODUCT公式的简单方法。这样你就可以让Excel为你做肮脏的工作。这样做的好处是它可以节省大量的循环:)
已经过测试
Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim xlApp As New Excel.Application
Dim oWB5 As Excel.Workbook = xlApp.Workbooks.Open("C:\1.xlsx")
Dim oWB6 As Excel.Workbook = xlApp.Workbooks.Open("C:\2.xlsx")
Dim oWB7 As Excel.Workbook = xlApp.Workbooks.Open("C:\outputs.xlsx")
Dim oSheet7 As Excel.Worksheet = oWB7.Worksheets("Sheet1")
With oSheet7
For i = 1 To 8
For j = 1 To 104
Dim Col1Nm As String = Split(.Cells(, j).Address, "$")(1)
Dim Col2NM As String = Split(.Cells(, i).Address, "$")(1)
.Cells(i, j).Value = xlApp.Evaluate("=SUMPRODUCT(([1]Inputs!" & Col1Nm & "1:" & _
Col1Nm & "44)*([2]Coef!" & Col2NM & "1:" & Col2NM & "44))")
Next
Next
End With
'~~> Close workbook and quit Excel
oWB5.Close (False)
oWB6.Close (False)
oWB7.Close (True)
xlApp.Quit()
'~~> Clean Up
releaseObject (oWB5)
releaseObject (oWB6)
releaseObject (oWB7)
releaseObject (xlApp)
MessageBox.Show("done")
End Sub
Private Sub releaseObject(ByVal obj As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject (obj)
obj = Nothing
Catch ex As Exception
obj = Nothing
Finally
GC.Collect()
End Try
End Sub
End Class
IMP注意:如果您的实际文件名不是1.xlsx和2.xlsx,那么请更改此部分代码
xlApp.Evaluate("=SUMPRODUCT(([1]Inputs!" & Col1Nm & "1:" & _
Col1Nm & "44)*([2]Coef!" & Col2NM & "1:" & Col2NM & "44))")
替换