2

(VB Express レベル: 初級)

私は次のことをしたい、

ワークブック 1
aの列

b

c

d

Workbook2
e の列

g

時間

単一セルへの出力

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 

助けていただければ幸いです。私は今これに2日間苦労しています。

ソースワークシート

必要な出力

4

2 に答える 2

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
于 2012-07-08T21:08:31.453 に答える
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 NOTE : 実際のファイル名が 1.xlsx と 2.xlsx でない場合は、コードのこの部分を変更してください

xlApp.Evaluate("=SUMPRODUCT(([1]Inputs!" & Col1Nm & "1:" & _
Col1Nm & "44)*([2]Coef!" & Col2NM & "1:" & Col2NM & "44))")

交換

  1. [1] by [実際のファイル名]
  2. [2] by [実際のファイル名]
  3. [実際のシート名]による入力と
  4. [実際のシート名] による係数
于 2012-07-08T22:01:12.267 に答える