vb.net - 范围乘法 VB.NET(这段代码有什么问题?)

标签 vb.net excel range multiplication

(VB Express 级别:初级)

我想做以下事情,

工作簿 1 中的专栏
一个

b

c

来自 Workbook2 的专栏

f

小时

输出到单个单元格

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 

我们将非常感谢您的帮助。我已经为此苦苦挣扎了两天。

Source Worksheets

required output

最佳答案

这是使用 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))")

替换

  1. [1] [实际文件名]
  2. [2] [实际文件名]
  3. 按[实际工作表名称] 和
  4. 输入
  5. [实际工作表名称] 的 Coef

关于vb.net - 范围乘法 VB.NET(这段代码有什么问题?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11385455/

相关文章:

excel - 使用VBA循环遍历每一列并从大到小排序

excel - 如果工作表 ("wsName")存在

python - 如何将电压读数限制在写入日志文件的范围内?

VB.net(桌面)上下文菜单分配给多个控件所有者问题

.net - 处置类 vb.net

excel - 仅复制一个范围中的文本并仅将前三个文本粘贴到另一张纸上

ruby - 使用 Mongoid 和 Ruby 查询最近 30 天的日期范围?

python-3.x - 在 Pandas 中对包含 Python `range` 或类似列表的列执行合并

vb.net - 句柄与 AddHandler

VB.NET 2010 - Process.Start ("filePath\Test.bat")未打开 test.bat?