范围乘法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. [1]通过[实际文件名]
  2. [2]通过[实际文件名]
  3. input由[实际图纸名称]和
  4. 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