Are You Trendy? (Part 2)

Share

Facebook
Twitter
LinkedIn

Forecasting using Excel Functions

“Todays forecast will be Hot and Humid with a Chance of Snow?”

(Even the experts with big computers get it wrong)

In the previous post we looked at Manual Forecasting techniques and how Excel can be used to assist. In this post we will look at how we can use Excel built in functions to aid us in forecasting.

This post is going to delve slowly at first and then deeper into some of Excels Statistical Functions. Readers are encouraged to follow along at your own pace and use the examples in the Examples Workbook attached.

All charts, tables and diagrams in this post with the associated Excel formulas are included in the Example workbook.

In this post I will be using the following nomenclature

^ means raise to the power eg: 10^2 = Power(10,2) = 100

.  means multiply eg 10.2.M.X = 10.2 * m * x

Why do we need to use Excel Functions?

In the first post we looked at some simple data with only a few points and a trend that was very fairly obvious or was it.

A number of other linear trends could have equally been used and all look about right.

However in real life data is rarely this simple.

Fortunately Excel has a Number of Functions and Tools that allow us to look for trends and use the data natively for forecasting purposes.

There are a number of standard types of trends which can be classified as:

Linear – Approximating a straight line

Polynomial – Approximating a Polynomial function to a power

Power – Approximating a power function

Logarithmic – Approximating a Logarithmic line

Exponential – Approximating an Exponential line

Excel supports the use of these trend types in a number of ways.

Excel Functions and Tools

Excel has a number of Worksheet functions specifically designed to assist us with analysing various trends.

They are categorised by type below

Excel Functions for Linear Trends

  • Slope
  • Intercept
  • Linest
  • Trend
  • Forecast

Excel Functions for Exponential Trends

  • Logest
  • Growth

Other Excel Tools

  • Excel Chart + Trendline


USING EXCELS WORKSHEET FUNCTIONS


Linear Estimates

In the first Post we looked at using a linear equation in the form Y=mX + c to express our estimated line of best fit which we manual estimated was linear.

Excel has 2 functions which we can use to calculate the actual slope (m) and intercept (c) for the above equation.

Slope

The Slope function returns the slope or gradient of the linear regression line through data points in Known_Y’s and Known_X’s.

eg: =SLOPE(Known Y values, Known X values)

Intercept

The Intercept function calculates the point at which a linear regression line will intersect the Y-axis by using existing X-values and Y-values.

eg: = INTERCEPT (Known Y values, Known X values)

Use

To use the above 2 equations we simply enter 2 equations in cells

m = SLOPE(C47:C51, B47:B51)                     = 1.298

c = INTERCEPT(C47:C51, B47:B51)            = 0.140

We can now use our revised linear equation to plot a line of best fit

Y = m.X + c

Y = 1.298.X + 0.140

So for

X = 5, Y= 6.63 &

X = 30, Y = 39.07

Which we can plot as a new series on our chart


Linest

The Linest function can be used to calculate the Slope and Intercept parameters for a linear function

Linest is an array formula which must be entered as an array formula to return all the values that it can return.

Eg:   = LINEST(Known Y Values, Known X Values,Const , Stats)

=LINEST(C47:C51,B47:B51,TRUE,FALSE) will return the Slope (m) component of the equation

Const = True b parameter is calculated

False b is set to 0 (zero)

Stats =  True Return additional regression statistics

False Return the m co-efficient and const b

To return both components you must enter the same formula in adjacent cells in the same row

and the equation must be entered as an array formula

Eg: = LINEST(C47:C51, B47:B51, TRUE, FALSE) Ctrl Shift Enter

Slope (m) Intercept (c)
Linest 1.298 0.140

Alternatively the values can be retrieved from the Linest array function using the Index function

Gradient m =INDEX(LINEST(C47:C51, B47:B51, TRUE, FALSE),1)

Intercept c =INDEX(LINEST(C47:C51, B47:B51, TRUE, FALSE),2)

The use of the Index function negates the requirement to use an Array Entered formula.

Stats

Linest can also return a number of statistics when Stats parameter is set to True

Eg: =LINEST(C47:C51, B47:B51, TRUE,TRUE) Ctrl Shift Enter

This must be entered as an array formula of 2 columns by 5 rows

The formula can also be entered as a normal equation also using the Index function to extract the array values

Eg:          = INDEX( LINEST($C$47:$C$51, $B$47:$B$51, TRUE, TRUE), Row ,Column)

If you want to know the r2 value (discussed later) it is in the 3rd row, 1st column.

Eg:          = INDEX( LINEST($C$47:$C$51, $B$47:$B$51, TRUE, TRUE), 3 , 1)

The above table shows the statistic and the value for our example above using both array entered and Index formulas

The r2 parameter highlighted will be discussed later.

Trend

The Trend function is used to calculate a straight line best fit line based on a number of known X & Y values.

Values of Y can be calculated for values of X inside or outside the know range of X values and so Trend can be used to interpolate or extrapolate data.

eg:          = INTERCEPT (known Y values, known X values, New X Value, Const)

Const    = True; Calculate the Intercept value

= False; Set the Intercept value c = 0

If for example you are using this to model your power cost.

If you have a fixed monthly cost plus a cost per kW, you would set Const to True

If you have no fixed monthly cost and are only charged per kW set Const to false

eg:          =TREND($C$101:$C$105,$B$101:$B$105,B106,TRUE)

Forecast

The Forecast function is used to calculate a straight line best fit line based on a number of known X & Y values.

Values of Y can be calculated for values of X inside or outside the know range of X values and so Trend can be used to interpolate or extrapolate data.

eg:      = FORECAST (New X Value, Known Y values, Known X values)

= FORECAST(B129, $C$124:$C$128, $B$124:$B$128)


Non-Linear Estimates

So far our examination of trends has revolved around the use of linear estimates and the Excel functions that support that.

But as we saw above there are lots of cases where non-linear estimates are required.

This section will deal with the following estimate types.

  • Polynomial – Approximating a Polynomial function, a.x^n + b.x^(n-1) + c.x^(n-2) + … + m = 0
  • Power – Approximating a Power function, y = a.x^b
  • Logarithmic – Approximating a Logarithmic line, y = b.ln(x) + a
  • Exponential – Approximating an Exponential line, y = b.m^x

Luckily Excel has a number of function and some tools to assist us here as well.

Exponential Functions

Exponential functions are based around the formula y = b.m^x

Excel has one function specific to growth estimates and that is the Logest function.

As with Linest, Logest is an array function.

eg:     =LOGEST(Known Y’s, Known X’s, Const, Stats)

=LOGEST(C6:C13, B6:B13, true, false)  Ctrl Shift Enter

Const = True or omitted b parameter is calculated

False b is set to 1

Stats =  True Return additional regression statistics in an array

False Return the m co-efficient and const b

Alternatively the values can be retrieved from the Logest array function using the Index function

B = INDEX( LOGEST( C6:C13, B6:B13, True, False), 1)

X = INDEX( LOGEST(C6:C13, B6:B13, True, False), 2)

The use of the Index function negates the requirement to use an Array Entered formula.1

However Logest, is a tricky function as it actually just passes values to the Linest function!

So we can actually use the Linest function for doing nearly all of our Exponential, Logarithmic and Power function trends.

But you ask “Doesn’t Linest give us the parameters for a straight line?”

Absolutely.

To use Linest to analyse an Exponential function we need to unwrap it so to speak and that is done by taking the Log of the Y values prior to putting them into the Linest equation, like this:

Form:    = LINEST( LN(Known Y Values), Known X Values)

eg:          = LINEST( LN(C32:C39), B32:B39) Which is an array formula

or            = INDEX( LINEST( LN(C32:C39), B32:B39), 1) as a normal formula

Now the tricky part is that the m component or array parameter 2 must now be converted back to an exponential so we can use exp(m component) or  =EXP( INDEX( LINEST( LN(C32:C39), B32:B39),2))

This is difficult to explain but is shown in a worked example on the Exponential Functions section of the Non-linear Functions page of the example workbook attached.

Growth

The Growth function can be used to calculate an exponential curve that best fits your data based on a number of known X & Y values.

Form:    = LINEST(Known Y Values, Known X Values, New X Values)

eg:          = GROWTH($C$32:$C$39, $B$32:$B$39, B40) as a normal formula

This is also shown in a worked example on the Exponential Functions section of the Non-linear Functions page of the example workbook attached.

Logarithmic Functions

Logarithmic functions are based around the formula y = b.LN(x)+a

Excel doesn’t have a specific function dealing with Logarithmic functions, however we can use the Linest function as previously described by first converting the data from a Logarithmic to Straight line and this is done by talking the LN of the X values.

Form:    = LINEST( Known Y Values, LN(Known X Values))

eg:          = LINEST( LN(C32:C39), B32:B39) as an array formula

or            = INDEX( LINEST( LN(C32:C39), B32:B39), 1) as a normal formula

This is shown in a worked example on the Logarithmic Functions section of the Non-linear Functions page of the example workbook attached.

Power Functions

Power functions are based around the formula y = a.x^b

Excel doesn’t have a specific function dealing with Power functions, however we can again use the Linest function as previously described by first converting the data from a Power function to Straight line and this is done by talking the LN of the X and Y values.

Form:    =LINEST( LN(Known Y Values), LN(Known X Values))

eg:          =LINEST( LN(C58:C65), LN(B58:B65)) as an array formula

or            =INDEX( LINEST( LN(C58:C65), LN(B58:B65)), 1) as a normal formula

The above equations return Parameter 1 as b and Parameter 2 as LN(a)

LN(a) must be converted back to Parameter a by taking the Exp(a)

This is shown in a worked example on the Power Functions section of the Non-linear Functions page of the example workbook attached.

Polynomial Functions

Polynomial functions are based around the formula y = a.x^n + b.x^(n-1) + c.x^(n-2) + … + m

Which typically looks like  y = a.x^5 + b.x^4 + c.x^3 + d.x^2 + e.x +m

And if any of the parameters a to m are zero that part of the function will be zero and not shown.

Excel does have a specific function dealing with Polynomial functions, and you guessed it, it is the Linest function. The Linest function must be told that it is dealing with a polynomial function and this is done by adding another parameter to it’s input. The extra parameter is added by raising the know X values to the power of an array of number 1..n, where n is the power of the polynomial you want to use.

Form:  = LINEST( Known Y Values, Known X Values^{1,2,3,..n})

eg:     for a polynomial of power 3

= LINEST(C84:C94, B84:B94^{1,2,3}) as an array formula

or      =INDEX( LINEST(C84:C94, B84:B94^{1,2,3}), 1) as a normal formula

The above equations return Parameter 1 as a, Parameter 2 as b, Parameter 3 as c if a power 3 polynomial is used.

This is shown in a worked example on the Power Functions section of the Non-linear Functions page of the example workbook attached.


Multiple Variable Linear Regressions

The Linest function is able to be used to determine the regressions of multiple input variables (X1, X2, … Xn)  that may contribute to a single output variable (Y).

This is best demonstrated with a simple example:

Hui’s Fruit Shop

Say we have a Fruit Shop and we only sell Apples & Oranges and we know how many Staff and what our Overhead Costs were and how much Profit we have made each year for the past decade.

This could be tabulated below:

We can use Linest to work out a regression for this model. That is what is the relationship between the output and all the inputs.

The format of this will be

Form:    = LINEST(Known Y values, Known X Values, TRUE, TRUE) as an Array Formula

eg:          = LINEST(E122:E132, A122:D132, TRUE, TRUE)

Note that the Known X Values of this example is a 4 column wide area representing the 4 variables.

This must be array entered in an area Xn + 1 columns wide and 5 rows deep, in our case a 5 column x 5 row area.

Note that the equation for then profit is made up of the array values from the first row of the answer array in reverse order

Y = 18.84.X1 + 27.98.X2 + 3851.79.X3 -0.26.X4 -15406.84

And that the parameters are in highest X4 to lowest X1 order followed by b at the end

You can also see the other parameters of the array of which the most important is the r2 factor which in this example is 0.90 indicating that there is a good fit between the Inputs and the Profit. Hence we could be relatively comfortable using our profit equation for the estimate of future profits.

Measuring the accuracy of the Estimation.

In the linear Linest section at the start and in the previous example we briefly mentioned a measure called the r2 parameter and said that because it had a value of 0.90 we would be comfortable using our estimation parameters to estimate future profits.

r2 is a measure of the error between the data points and the estimated values.

Its values vary between 0 = no relationship and 1 = a perfect relationship.

For example here are 3 charts based on the equation of Y = 3 X + 5

The equations of the lines of best fit and the r2 values are shown on each chart.

You can see that the data of Chart Y1 has a very close fit to the equation both visually and through a very high r2 value of 0.9962, where as at Y3 there is a very loose relationship between the data and the estimate which is shown visually as well as a low r2 value of 0.2552.

The derivation and use of this is beyond this post and I would refer you to the Excel Help of the Linest function, where it is discussed or Wikipedia.

How Does All This Work ?

The Excel Linest, Logest and Growth Functions all use a technique called “Least Squares Approximation”.

This is an iterative process which minimises the sum of the square of the distance from the estimated line to the actual data for all known data points. Once this is minimised the parameters which define the estimated line are returned to the user.

The scope of how Least Squares works is beyond the scope of this post, but if you are interested have a read at Wikipedia.

There are a number of other estimation techniques available which excel doesn’t support.

One should never assume that “just because Excel gave me the answer – it is correct” and this applies to the use of statistics more than any other area in maths or Excel usage.

Limitations:

The above techniques need to be used with a degree of caution.

Often a trend will exactly mathematically fit the data but in reality you wouldn’t use the equations.

In the picture below (courtesy of Wikipedia) 10 data points are exactly matched by a Polynomial function , whereas the linear estimate misses every point.

Which estimate would you choose to use?  The linear function I hope.

This is discussed in more detail at Wikipedia.

Disclaimer

It should be noted that just because Excel returns an estimated line of best fit to your data, it doesn’t mean that your data actually follows that trend, it just may be coincidental and that user discretion is advised in all cases, refer Limitations above.

There are a number of other estimation techniques available and users interested should discuss these if required with a person expert in their data distribution.

Excel Functions Referred to in this Post

Exp – Return the exponential value of the input

Forecast – Forecast intermediate or future values based on known X and Y values

Growth – Derive an exponential estimate for a known set of X & Y values

Index – Lookup a value at row/column intercept from a table or array of data

Intercept – Return the intercept of a linear estimate

Linest – Derive a linear estimate for a known set of X & Y values

LN – Return the Natural Log value of the input

Logest – Derive an exponential estimate for a known set of X & Y values

Power – Returns the value of a number raised to a power

Slope – Return the slope of a linear estimate

Trend – Forecast intermediate or future values based on known X and Y values

Further Readings

Excel has a number of extra Statistical functions hidden in the Data Analysis addin.

I have not discussed or used these tools here as not all users will have access to them and the post is getting longish already.

Functions you may want to have a look at include:

Correl & Pearson: Both functions allow the calculation of correlation coefficients between variables.

Exponential Smoothing: The Exponential Smoothing analysis tool predicts a value that is based on the forecast for the prior period, adjusted for the error in that prior forecast

Fourier Analysis: The Fourier Analysis tool solves problems in linear systems and analyzes periodic data by using the Fast Fourier Transform (FFT) method to transform data, great for analysing periodic and frequency based data.

I would direct readers who are interested in using these techniques to look at the following sources

Microsoft Excel Help – Statistical Functions

Wikipedia

Physics Labs Tutorials

Newton Excel Bach, not (just) an Excel Blog

 

Further Readings

Are You Trendy (Part 1)

Are You Trendy (Part 3)

 

What’s Next ?

In the next post we will looks at some Tools that Excel has to assist us in quickly determining which estimate method we can use.

I will also give you a neat little UDF to assist in your interpolations/extrapolations of your data which was used to make the animated GIF at the top of the first post.

ps: Happy Australia Day Everyone 🙂 !

Facebook
Twitter
LinkedIn

Share this tip with your colleagues

Excel and Power BI tips - Chandoo.org Newsletter

Get FREE Excel + Power BI Tips

Simple, fun and useful emails, once per week.

Learn & be awesome.

Welcome to Chandoo.org

Thank you so much for visiting. My aim is to make you awesome in Excel & Power BI. I do this by sharing videos, tips, examples and downloads on this website. There are more than 1,000 pages with all things Excel, Power BI, Dashboards & VBA here. Go ahead and spend few minutes to be AWESOME.

Read my storyFREE Excel tips book

Overall I learned a lot and I thought you did a great job of explaining how to do things. This will definitely elevate my reporting in the future.
Rebekah S
Reporting Analyst
Excel formula list - 100+ examples and howto guide for you

From simple to complex, there is a formula for every occasion. Check out the list now.

Calendars, invoices, trackers and much more. All free, fun and fantastic.

Advanced Pivot Table tricks

Power Query, Data model, DAX, Filters, Slicers, Conditional formats and beautiful charts. It's all here.

Still on fence about Power BI? In this getting started guide, learn what is Power BI, how to get it and how to create your first report from scratch.

38 Responses to “Time to showoff your VBA skills – Help me fix ActiveSheet.Pictures.Insert snafu”

  1. shokks says:

    I tried your code with 2003, it works.

    But, I know Addpicture does not take URLs anymore with 2007 onwards, perhaps its the same with picture.insert as well.

    http://support.microsoft.com/kb/928983/en-us

    The above link gives the solution as "picture fill in a shape such as a rectangle".

  2. Vince E. says:

    Tried to recreate this, but it worked fine for me. I just took the image of the error you showed in the post. Is there more info that can narrow this down a bit?

  3. Ian Hinckley says:

    Hi

    Not sure if this is what you're after, but I just tried this

    Sub Macro1()
    ActiveSheet.Pictures.Insert("http://www.google.co.uk/intl/en_uk/images/logo.gif").Select
    End Sub

    Tied a button to it on the sheet and it seems to work; hope this helps a little

    Ian

  4. Chandoo says:

    @All.. the issue is in Excel 2007. In 2003 ActiveSheet.Pictures.Insert seems to work fine. Unfortunately, I have design this in Excel 2007.. that is why I posted it here..

  5. Ian Hinckley says:

    v2

    Sub Macro1()
    Set n = ActiveSheet.Pictures.Insert("http://www.google.co.uk/intl/en_uk/images/logo.gif")
    With Range("c12")
    t = .Top
    l = .Left
    End With
    With n
    .Top = t
    .Left = l
    End With
    End Sub

    Ian

  6. Ian Hinckley says:

    That didn't come out very well. This positions at c12, so can change easily:
    Sub Macro1()
    Set n = ActiveSheet.Pictures.Insert("http://www.google.co.uk/intl/en_uk/images/logo.gif")
    With Range("c12")
    t = .Top
    l = .Left
    End With
    With n
    .Top = t
    .Left = l
    End With
    End Sub

    Works OK in 2007

    Ian

  7. Chandoo:
    Try 'ActiveSheet.Pictures.Insert'

    With ActiveSheet.Pictures.Insert("C:\Example.png")
    .Left = ActiveSheet.Range("A1").Left
    .Top = ActiveSheet.Range("A1").Top
    End With

  8. Jon Peltier says:

    activesheet.pictures.insert "C:\Documents and Settings\Jon Peltier\Desktop\2007 stuff\insert_charts_2007.png"

    Works for me in 2003 SP3 and in 2007 SP2.

    Check the URL, and make sure you have internet connectivity.

    What also works, and is newer (pictures.insert was supposedly deprecated in '97):

    activesheet.shapes.addpicture "C:\Documents and Settings\Jon Peltier\Desktop\2007 stuff\insert_charts_2007.png", false, true, 200,200,100,100

    Unfortunately you must specify dimensions (the last four arguments) and you don't necessarily know them. But the picture size is still related back to the original picture size, so you could use scaleheight and scalewidth to fix this.

  9. Chandoo: I just re-read your post.

    The code I posted works for me. However, I'm using a local picture. If you try to add a picture from the web, this won't work.

    I remember solving this problem before by adding a rectangle shape first, then using the Shapes.AddPicture method to get a picture from the web.

    I'll find that code and post it here.

  10. Chandoo says:

    Some more updates... The code "ActiveSheet.Pictures.Insert (path)" works fine in Excel 2007 at home. Strange it failed miserably on my work laptop. Do you think this has got something to do with SP2 of MS Office 2007 or something like that?

    @Ian, Jon: Thanks for the code snippets. I guess I will use my home installation of excel to do this.

  11. Chandoo:

    Try this on your work laptop:

    Sub test()
    ActiveSheet.Shapes.AddShape msoShapeRectangle, 50, 50, 100, 200
    ActiveSheet.Shapes(1).Fill.UserPicture _
    "http://www.datapigtechnologies.com/images/dpwithPig6.png"
    End Sub

  12. Jon Peltier says:

    I didn't mean to post code with a local file, because both approaches worked with an internet image as well. This is in Excel 2007 SP2.

    activesheet.pictures.insert "http://peltiertech.com/images/2009-07/col_area_noblanks.png"

  13. Jon: Looks like I have SP1 on my client machine! I wasn't paying attention.

    Just checked my home computer where I have SP2, and you're right...looks like they fixed it.

  14. Jon Peltier says:

    I didn't even bother testing in SP1, though I could if anyone cares enough.

  15. teylyn says:

    I'm afraid I don't have a solution, but I find it remarkable that after attaining a certain status in the Excel world, Chandoo does not need to post on an Excel discussion forum to get help for an Excel problem. Instead, he posts on his blog and all the gurus come rushing to his help.

    Isn't Web 2.0 great?

  16. Jon Peltier says:

    Teylyn - I saw Chandoo's tweet first, and followed the link back to his blog.

  17. Chandoo says:

    @Mike.. thank you. I have seen the fill rectangle solution before posting the query here. For that matter, I have also tried the solution of embedding a browser control on a spreadsheet. both of these seemed a bit extreme. That is why I have asked it here.

    But I guess I will end up using it if I had to build this in work laptop.

    @Teylyn: I have thought of posting this in a forum. (Unfortunately I have not been to any excel group in the last 5 years. Last time I was active was when I built a jave based excel sheet construction solution using POI.HSSF classes of Apache... ) After searching for a few hours, I found several forum posts where others had same problem and the solution recommended (using .left and .top parameters) is not working for me. Incidentally most of these solutions are from a certain Jon Peltier 😛

    I thought may be the problem is interesting for fellow blog readers. So I posted it here.

  18. Justin B says:

    Hi,
    Adapting the code in the question,

    [code]
    Sub InsPicture()
    pPath = "http://chandoo.org/images/pointy-haired-dilbert-excel-charts-tips.png"
    With ActiveSheet.Pictures.Insert(pPath)
    .Left = Range("a1").Left
    .Top = Range("a1").Top
    End With
    End Sub
    [/code]

    Seems to work fine

  19. Jon Peltier says:

    Looks like it was a problem in 2007 up to SP1, which was corrected in SP2.

  20. Chandoo says:

    @Jon.. seems like the case. I just checked the version at work laptop. it is 12.0.6331.5000 (SP1).

    Thank you so much every one. I really appreciate your time and suggestions in solving this.

  21. Jon Peltier says:

    Glad to help. I couldn't understand why something so straightforward wasn't working.

  22. Kieranz says:

    Hi All
    Is there a way of inserting a motion clip eg animated gif or swf or flv?
    Thks

    • Chandoo says:

      You can insert animated GIFs by inserting them in a browser control through VBA. For other types of movies, I can guess you can insert them as clip art.

  23. ashvini says:

    I WANT THE INSERT PICTURE BY USING COADING

  24. Lutz says:

    so currently i was struggling same as you, chandoo, with the insert picture method in excel 2007/10 from an url and came along your thread here.

    so i re-designed the code on the addshape method as mike was suggesting it and all of the sudden it works just fine.

    thanks alot to you guys, you were a great help
    a big salut from switzerland

  25. Santiago says:

    Hi guys,

    I need help copying and pasting an image with the path in a cell.
    I leave the code.

    And thank you very much!

    Sub Copiarimg()

    Dim pic As Picture

    With ActiveSheet

    Set pic = .Pictures.Insert(Range("f2").Value)

    With .Range("e9:g22")
    pic.Top = .Top
    pic.Left = .Left
    pic.Width = .Width
    pic.Height = .Height
    End With
    End Sub

  26. I've played around with the approaches in these comments, and the code below is what I've come up with. The ImagePath can be a local file or a URL. As Jon mentioned above, the trick is to set an arbitrary value for the width and height, then call the ScaleWidth and ScaleHeight methods afterward to reset the picture to its original size. Once the LockAspectRatio property is set, you can change the picture width and the height will automatically scale (or vice-versa).

    Sub AddPictureToRange(TopLeftCellAddress As String, ImagePath As String)

    Dim pic As Shape
    Dim l As Single, t As Single
    Dim temp As Single

    l = Me.Range(TopLeftCellAddress).Left
    t = Me.Range(TopLeftCellAddress).Top
    temp = 10# ' arbitrary value

    Set pic = Me.Shapes.AddPicture(ImagePath, msoFalse, msoTrue, l, t, temp, temp)
    pic.ScaleHeight 1#, msoTrue
    pic.ScaleWidth 1#, msoTrue
    pic.LockAspectRatio = msoTrue

    End Sub

  27. dip says:

    I need some help with inserting pictures. I have an excel file with a column of item numbers next to this row I want to insert a picture of this item. The pictures are coded with the item number so I tried to insert it with one of the codes above:

    Sub InsPicture()
    pPath = "http://img.bricklink.com/P/80/55236.gif"
    With ActiveSheet.Pictures.Insert(pPath)
    End With
    End Sub

    That worked but I need to do that for every row separtly.
    So I tried in the code
    pPath = "http://img.bricklink.com/P/80/"&Text(a1;"#")&".gif"

    But that gives errors.

    Anybody ideas?

  28. alex says:

    Hi Nicholas, I used your solution in a related problem in Excel 2003 and it worked flawlessly..thank you!

  29. Richard says:

    Hi Mike Alexander,

    Your solution with some changes was helpful in my problem in XL 2007, thanks.

  30. seejay says:

    Hi,

    thanks all. In addition, I had a problem with multiple pictures inserting (every new picture replaced the prior one). I've changed it a bit, may be helpful..

    Sub test()
    ActiveSheet.Shapes.AddShape msoShapeRectangle, 50 , 50, 100, 200
    ActiveSheet.Shapes(1).Fill.UserPicture _
    "http://www.datapigtechnologies.com/images/dpwithPig6.png"
    ActiveSheet.Shapes(1).Copy
    ActiveSheet.Paste
    End Sub

  31. Jon Peltier says:

    Try this instead:
     
    Sub test()
    ActiveSheet.Shapes.AddShape msoShapeRectangle, 50 , 50, 100, 200
    ActiveSheet.Shapes(ActiveSheet.Shapes.Count).Fill.UserPicture _
    "http://www.datapigtechnologies.com/images/dpwithPig6.png"
    End Sub

    • Kez says:

      Thanks to everyone, this thread has been very helpful. However, image inserting still doesn't work quite as expect for me.

      While I can get a picture inserted into an Excel 2010 worksheet using either:

      1) ActiveSheet.Shapes(ActiveSheet.Shapes.Count).Fill.UserPicture...
      2) ActiveSheet.Pictures.Insert(pPath), and
      3) Shapes.AddPicture...

      unfortunately the images all insert with a display size determined not by the actual pixel dimensions of the image but by the dpi resolution.

      So for example, if I insert two copies of the exact same 600x600 pixel image, one with a 300dpi resolution and the other with 72dpi, they display at vastly different sizes on screen.

      While this might be intended behaviour for Excel in order to maintain a WSYWIG printing layout, I actually need a way to insert the image based on the the actual pixel dimesnsions and ignoring the dpi resolution.

      Any help appreciated.

      Thanks
      Kez

  32. Kez says:

    Not doing an intentional bump, but realised I posted in rely to one of the repsonses here instead of to the main thread, so reposting.
    =====

    Thanks to everyone, this thread has been very helpful. However, image inserting still doesn’t work quite as expected for me.

    While I can get a picture inserted into an Excel 2010 worksheet using any of the below methods:

    1) ActiveSheet.Shapes(ActiveSheet.Shapes.Count).Fill.UserPicture....
    2) ActiveSheet.Pictures.Insert(pPath), and
    3) Shapes.AddPicture....

    unfortunately the images all insert with a display size determined not by the actual pixel dimensions of the image but by the dpi resolution.

    So for example, if I insert two copies of the exact same 600×600 pixel image, one with a 300dpi resolution and the other with 72dpi, they display at vastly different sizes in Excel on screen.

    While this might be intended behaviour for Excel in order to maintain a WYSIWYG printing layout, I actually need a way to insert the images based on the the actual pixel dimesnsions and ignoring the dpi resolution.

    Any help appreciated.

    Thanks
    Kez

  33. Kez says:

    Well, answered my own question 🙂

    For those who might be interested, you can use this function:

    Public Function GetPicDims(strFilePath As String, strFileName As String) As String
    GetPicDims = CreateObject("Shell.Application").Namespace((strFilePath)). _
    ParseName(strFileName).ExtendedProperty("Dimensions")
    End Function

    to get the dimensions of the image you want to insert. Then you can parse the return string and use the width and height values to add a rectangle shape of the appropraite size, like:

    ActiveSheet.Shapes.AddShape msoShapeRectangle 50, 50, iWidth, iHeight

    which you then fill with the picture:

    ActiveSheet.Shapes(ActiveSheet.Shapes.Count).Fill.UserPicture "c:\temp\test.jpg"

    This way the picture gets inserted using the pixel dimensions and the (print) resolution gets ignored.

    If desired, the GetPicDims function can be made more generic to get other ExtendedProperties.

    Regards
    Kez

Leave a Reply