范围乘法VB.NET(这个代码有什么问题?)
(VB Express等级:初学者)
我想要做下面的事情,
工作簿1中的一列
一个
b
C
d
Workbook2中的一列
Ë
F
G
H
输出到单个单元格
AE + BF + CG + DH
(输出是一个Sumproduct。)
工作簿1中有44行,工作簿2中有44行。但是,工作簿1中有3列,工作簿2中有104列。工作簿3中的每列必须与工作簿2中的104列相乘。
以下是我的努力,它在一列的所有单元格中写入相同的值。 我的理解是我的for循环是错误的地方。 但我无法弄清楚什么是错的。
'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
帮助将非常感激。 我现在挣扎了两天。
这是一个使用Excel的SUMPRODUCT公式的简单方法。 这样你就可以让Excel为你做肮脏的工作。 这样做的好处是它可以节省很多循环:)
尝试和testing
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))")
更换
- [1]通过[实际文件名]
- [2]通过[实际文件名]
- input由[实际图纸名称]和
- Coef by [实际图表名称]
感谢您更详细地重新发布此问题。 我写了一个评论,我相信实现你想要做的一个循环。
'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