Pull data (sumif?) from an external workbook

S

Simon

I have a workbook "report". Col A has contains products. The number of
products in column A may vary but each product features only once.
eg:
TOTAL SALES FOR JANUARY
ColA ColB
ItemX 4
ItemY 5
ItemZ 4

Another workbook "sales" contains the individual sales of these items in one
month. So Col A contains the products which may feature once or several
times. Col B contains the Qty.
eg:
SALES FOR JANUARY
ColA ColB
ItemX 1
ItemX 3
ItemY 5
ItemZ 2
ItemZ 2

Both workbooks reside in the same folder.

I want to write vba code which will populate the sum of sales for each
product for the month into Col B of "report".
I think a SumIf might be the way to go except for the following issues:
"Sales" is an external workbook which is not open.
The rows in each workbook can vary depending on the number of products or
the number of sales. "Sales" may contain 5, 10 rows of data or even 100.
"Report" may contain 5, 10 individual products or even 88.

Can anyone suggest code which will pull data from the closed workbook
"Sales" and populate ColB in "Report"

Hope this makes sense. In case you cant tell I'm a beginner.
Cheers
Simon
 
J

Jacob Skaria

Try the below macro...Edit the path and Sheet name for Sales.xls

Sub MyMacro()
Dim wb As Workbook, lngRow As Long
Dim ws1 As Worksheet, ws2 As Worksheet

Application.ScreenUpdating = False
Set ws1 = ActiveSheet
Set wb = Workbooks.Open("d:\Sales.xls")
Set ws2 = wb.Sheets("Sheet1")

For lngRow = 1 To ws1.Cells(Rows.Count, "A").End(xlUp).Row
ws1.Range("B" & lngRow) = Application.SumIf(ws2.Range("A:A"), _
ws1.Range("A" & lngRow), ws2.Range("b:b"))
Next

wb.Close False
Application.ScreenUpdating = True
End Sub
 
T

teylyn

Instead of SUMIF you can use SUMPRODUCT, which works on close
workbooks. With regards to the varying numbers of rows, you can us
dynamic range names that grow and shrink with the data.

To define a dynamic range name for all the numeric values in column A
use in your Sales file

MyRange =$A$1:index($A:$A,match(99^99,$A:$A,1))

Create a similar range for your numbers
MyNumberRange =$B$1:index($B:$B,match(99^99,$A:$A,1))

Note: Anchor the Match function on the same column, so the ranges ar
the same size.

Then reference these ranges in a SUMPRODUCT formula in your Repor
workbook

=Sumproduct(--([Sales.xls]'Sheet1'!MyRange=A1),[Sales.xls]'Sheet1'!MyNumberRange)

regards, teylyn


I have a workbook "report". Col A has contains products. The number of
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top