Solved Macro to insert a formula in a column

Microsoft Excel 2010 - complete product...
February 23, 2018 at 06:43:12
Specs: Windows 7, 2,4 GHz / 4 GB
Hello,

Me again. I've been struggling today trying to make a macro to insert an INDEX-MATCH formula in a column (since I can't seem to make it work otherwise - but this might just be me.

I will explain what I am trying to do, maybe there is some resolution.

I have a table in which column G contains a certain product code. I need to use an INDEX-MATCH formula to search for this code in another excel document (in the same location of my excel file) and return a corresponding 12 digit number from that other excel document. I need to do this for a used range, which is variable in number of rows (but not in number of columns).

I figured out what INDEX-MATCH formula works:

=INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(F2;[zn.XLSX]Sheet1!$A:$A;0))

I tried to make a vba code to insert this formula to column H in my excel document, but I can't seem to be able to.

Here's the 1st code that I tried:

Sub test()
Dim LastRow As Long

LastRow = ActiveSheet.Range("G" & Rows.Count).End(xlUp).Row
For i = 5 To LastRow
    If IsEmpty(ActiveSheet.Range(i, 7)) = False Then
    ActiveSheet.Range(i, 8).Formula = "=INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(F2;[zn.XLSX]Sheet1!$A:$A;0))"

    End If
Next i
End Sub

And the 2nd one with R1C1 reference:

Sub test()
Dim LastRow As Long

LastRow = Cells(Rows.Count, "G").End(xlUp).Row
For Each i In Range("g5:g" & LastRow)
If Not i.Value = vbNullString Then
        i.Offset(0, 8).Select
        ActiveCell.FormulaR1C1 = "=INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(F2;[zn.XLSX]Sheet1!$A:$A;0))"

    End If
Next i
End Sub

I would love to avoid this and do what I want from VBA directly, but I wouldn't mind if I could do it by inserting formula.

Afterwards I will need to concatenate columns C and H, also by inserting a formula in column C, but I figure I will be able to do that once I manage to do this in column H.

Thanks in advance.


See More: Macro to insert a formula in a column

Reply ↓  Report •

✔ Best Answer
February 28, 2018 at 09:32:53
re: "Whether I have 9 products or 100, still 22 seconds. "

Without access to your actual environment (workbooks, system, network, etc.) it's a little tough for me to diagnose that issue.

A couple of things to try.

1 - Add this to your code somewhere before VBA starts to write anything into the workbook. This line will prevent the destination workbook form displaying any changes until the code is done. It'll sit there looking all original and then POP! all of the changes will appear at once after the code exits.

Application.SceenUpdating = False

2 - In some of your earlier code you had instructions that worked on entire columns, e.g.

Range("C:C").Formula = Range("I:I").Value

Those type of instructions can slow a macro down considerably as VBA processes 1,048,576 rows. You'll notice that I used:

Range("C5:C" & LastRow) = Range("I5:I" & LastRow).Value

No .Formula needed and only the specified Range referenced.

As I was single stepping through your code, I noticed an obvious pause while it executed any line that referenced an entire column.

re: "But I would like for it to work with the file closed, if possible."

I think we have a Catch 22 here. I'll have to play around a bit, but I don't think you can use .Find with a closed file. However, the formula method works because it is creating a Linked reference. So, you may be stuck with the choice of a macro that runs slowly with a closed workbook (the formula route) or a macro that runs fast on an open one (the .Find route).

I can't test anything right now, but maybe this will work:

Add code add the beginning of your macro to open the zn workbook (hidden) and add code on the end to close it. Assuming that works, the user probably won't even know that the zn workbook was opened.

How To Post Data or Code ---> Click Here Before Posting Data or VBA Code



#1
February 23, 2018 at 08:01:06
You are mixing up your VBA syntax's in both sets of codes, but in different manners.

First macro:

You used:

If IsEmpty(ActiveSheet.Range(i, 7)) = False Then

You can't use the RowIndex & ColumnIndex arguments with the Range object. You need to use the Cells object:

If IsEmpty(ActiveSheet.Cells(i, 7)) = False Then

Second macro:

You used the Formula method:

        ActiveCell.FormulaR1C1 = "=INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(F2;[zn.XLSX]Sheet1!$A:$A;0))"

You can't use the FormulaR1C1 method unless you use R1C1 notation in the formula.

Just use:

        ActiveCell.Formula = "=INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(F2;[zn.XLSX]Sheet1!$A:$A;0))"


In addition, you don't have to Select the cell, you can refer to it directly:

i.Offset(0, 8).Formula = "=INDEX([zn.XLSX]Sheet1!$G:$G,MATCH(F2,[zn.XLSX]Sheet1!$A:$A,0))"

How To Post Data or Code ---> Click Here Before Posting Data or VBA Code


Reply ↓  Report •

#2
February 25, 2018 at 22:45:44
Hey, thanks for the answer.

Made the changes, using either of the two, but I'm getting the same error on the formula line: error 1004.
I noticed and corrected an error in my formula, which is replacing F2 with G5. Unrelated to the error though. I even changed from xlUp to xlDown, because down is where I want it to look.

I think I must give a bit more details on my files and what I'm trying to do, it usually helps.
- I use an ERP software from which I will automatically generate the zn.xlsx file, weekly in the same folder as the export.xlsx file, which is the file that must be printed and the file I'm working on with macros. Thing is, export.xlsx is also a generated file, but manually, so I must use macros in the personal.xlsb file to be able to work with daily / weekly generated files that replace their previous versions each time.
- Export.xlsx file's structure is a material code in column G, for which I try to import a barcode in column H, from zn.xlsx file's column G. Material code in zn.xlsx is in column A.
- Both excel files (export and zn) have 1 sheet each, called Sheet1.
Note: I keep saying macros and not "the macro" because I already asked about another function in a previous post, which you solved. To test, I am using the current macro separately, in another module.

I tried to add formula only to H5 using

Sub test()
Range("H5").Formula = "=INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(G5;[zn.XLSX]Sheet1!$A:$A;0))"
End Sub

Even adding it as a single line in the macro, as above, I got the same 1004 error on that line, but upon modifying the formula a bit and adding FormulaLocal:
    Range("H5").FormulaLocal = "=INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(G5;[zn.XLSX]Sheet1!$A:$A;0))"
    Range("H5").Copy
    Range("H5:H12").PasteSpecial (xlPasteAll)

it works like a charm, even though I need variable ranges so this last method is a no go, I guess.

But if I try to put the formulalocal on my offset:

i.Offset(0, 8).FormulaLocal = "=INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(G5;[zn.XLSX]Sheet1!$A:$A;0))"

even if I don't receive that 1004 error anymore, that vba does nothing, no formula added in cells.

So... what am I still doing wrong?

Thanks in advance.

message edited by Mrrrr


Reply ↓  Report •

#3
February 26, 2018 at 08:12:06
Let's start with these 2 items, just so that we are on the same page.

1 - You are using semi-colons in your formulas which I assume is based on your location. My version of Excel uses commas, so I need to edit your code and formulas to make anything work for me. I noticed that in my previous response I "mixed and matched" using semi-colons in part of my response and commas in others. That's my bad. I'll leave it up to you to make sure that you change any of my commas back to semicolons if I forget to. I can't test anything with semi-colons so if I just copy/paste my version of the formula or code into a response, you are going to get commas.

2 - A 1004 error in these situations is typically caused by incorrect syntax within the formula string that you are trying to write to a cell. However, the error is actually being thrown by Excel, not by VBA. Let me explain what I mean with an example.

If you tried to use this formula in the formula bar, you would get an error message pop-up from Excel because it is not a formula that Excel knows what to do with:

=IF(A1,,,D3)

If you then tried to use this instruction in VBA, VBA would "see" the error that Excel (the "application") is trying to display and in turn produce a "1004 - Application defined" error.

Range("H5").Formula = "=IF(A1,,,D3)"

VBA isn't going to show you the exact Excel error, it's just going to tell you that an error occurred within the "application", i.e. Excel. Keep in mind that the formula is enclosed in quotes within VBA therefore VBA sees it as Text string and doesn't care what the syntax is or whether it's a properly written formula or not. It's only if Excel doesn't like the syntax that you'll get the 1004 error.

So keeping that in mind, I edited your "test" macro to use commas. If I didn't, I would get a 1004 error because my Excel application doesn't know what to do with semi-colons once VBA attempts to write the formula into H5.

Sub test()
Range("H5").Formula = "=INDEX([zn.XLSX]Sheet1!$G:$G,MATCH(G5,[zn.XLSX]Sheet1!$A:$A,0))"
End Sub

It works just fine for me. No VBA error, just a #N/A error in the cell since I don't have any data for the formula to use. In fact it works so well, that even if zn.xlsx isn't open, Excel automatically modifies the formula to include the entire path to where zn.xlsx is stored.

=INDEX('\\server_name\folder_name\username\My Documents\[zn.xlsx]Sheet1'!$G:$G,MATCH(G5,'\\server_name\folder_name\username\My Documents\[zn.xlsx]Sheet1'!$A:$A,0))

With all that out of the way, let's see if we can't narrow this down a little further.

What language is your system and/or version of Excel set up for? The fact that FormulaLocal partially solved the issue (and your use of semi-colons) leads me to wonder if you are running into something related to your regional settings.

As far as this instruction not working correctly, I have a question:

i.Offset(0, 8).FormulaLocal = "=INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(G5;[zn.XLSX]Sheet1!$A:$A;0))"

Have you tried single stepping through the code to make sure that VBA is actually executing that instruction? You have a loop with an IF instruction. If the IF is FALSE, then VBA won't execute that instruction so the cells will remain empty and you'll never see a VBA error even if the syntax of the formula was wrong.

In other words, basing "success" simply on the fact that you aren't getting a VBA error may not be valid assumption. You may think that you aren't getting an error because VBA is happy with the syntax, when in fact you may not be getting the error because VBA is not even executing that instruction. I'm not saying that you will get an error if VBA tries to execute that instruction, just that not seeing the error may be taking you down the wrong path. Does that make sense? I mention that because your original loop works fine for me (after changing the semi-colons to commas) even when I use FormulaLocal.

Single stepping through that loop might reveal something that you didn't expect.

How To Post Data or Code ---> Click Here Before Posting Data or VBA Code


Reply ↓  Report •

Related Solutions

#4
February 27, 2018 at 01:16:49
My regional settings are set to Romania, that's why the semicolon use on my case. Never been a problem so far, thinking it still isn't.

Using the following lines to find and use last row took me to an endless loop and freeze of Excel:

LastRow = Cells(Rows.Count, "G").End(xlDown).Row
For Each i In Range("G5:G" & LastRow)

I tried your Debugging VBA Code 101 Tut and upon hovering on value of LastRow in the 2nd line of code above, I noticed that LastRow was something in the hundred thousands - hence the freeze.

I made it work by changing the LastRow syntax and removing the loop entirely. I replaced the loop with AutoFill in range.

Thing is that the final purpose of all this is to display the bar code in column H, then concatenate columns C and H into column C. I did all that in the vba-newbie kind of way, and this is the result:

Sub test()
Dim LastRow As Long
With ActiveSheet

LastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "G").End(xlUp).Row
    Range("H5").FormulaLocal = "=INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(G5;[zn.XLSX]Sheet1!$A:$A;0))"
    Range("H5").AutoFill Destination:=Range("H5:H" & LastRow)
    
Range("C:C").WrapText = True
    Range("I5").FormulaLocal = "=IF(ISNA(H5);C5;If(H5="""";C5;C5&"" ""&H5))"
    Range("I5").AutoFill Destination:=Range("I5:I" & LastRow)

Range("C:C").Formula = Range("I:I").Value
Range("G:I").Value = ""

End With
End Sub

I end up removing all those values from columns G:I because I actually need none of them in those columns. My goal (*) from the beginning was to find the bar code in another xls for the product in column C but using its product code from column G to search, then merge that bar code to column C, next to the product name.

Could you suggest something to make the above code simpler and safer?
Or maybe a suggestion to make the bar code extraction without using that many formulas in all those columns?

Or do you think this is as safe as it could get and it's a good solution to achieving my goal (*)?

Thank you for everything! Especially for teaching me how to fish, rather than feeding me with the solution.

message edited by Mrrrr


Reply ↓  Report •

#5
February 27, 2018 at 07:39:16
re: "My regional settings are set to Romania, that's why the semicolon use on my case. Never been a problem so far, thinking it still isn't."

We may have a slight misunderstanding here. Allow me to clarify what I was trying to say.

I did not mean to imply that the semi-colons were part of the problem. What I meant was this:

1 - Your first post had some syntax errors in the formulas that would cause a 1004 error, totally unrelated to semi-colons or commas, such as your R1C1 usage.
2 - In order for me to test any suggestions/solutions, I have to change the semi-colons to commas.
3 - If I then post my suggested fix with the commas still in the formula, and you use exactly what I post, you are still going to get a 1004 error, but for a different reason.

When you came back and said that you were still getting a 1004 error after trying my suggestions, all I wanted to do was to ensure that you noticed the commas and changed them to semi-colons.

re:

LastRow = Cells(Rows.Count, "G").End(xlDown).Row
For Each i In Range("G5:G" & LastRow)

I can certainly see how that would be an issue. ;-)

By changing xlDown to xlUp you solved the issue. What you want VBA to do is start at the bottom of the column [Cells(Rows.Count, "G").End] and look up until it finds a Row with data.

BTW, here's a little trip down Nostalgia Lane:

Back in good ole days, the syntax used to be:

LastRow = Cells(65536, "G").End(xlUp).Row

or

LastRow = Range("G65536").End(xlUp).Row

That's because prior to Excel 2007, there were only 65,536 rows in a worksheet. Once Excel 2007 was introduced, people moved to the Rows.Count syntax since it was compatible all versions because we are then letting VBA itself determine how many rows are in the sheet it is looking at.

OK, as for getting to your final goal, I'm a little confused. I'm not sure what you mean by making the code "safer". Simpler, yes. I have a few suggestion for that, but what is your "safety" concern?

Here is what I would consider a "simpler" use of VBA, but it still uses the formulas and then clears them. The main difference is that instead of writing the formula into one cell and then using AutoFill, it writes the formulas directly into the entire Range in one instruction. The interface between VBA and Excel is smart enough to use relative references and update the formulas in each cell.

Note: I didn't use FormulaLocal and I'm not sure why you did. If you have to, then obviously use it. I think I replaced all comma with semi-colons, but I would check that if I was you.

Following this code, I am going to include a totally different way to get the same result. It uses the .Find method and takes care of the Concatenation all within VBA. No formulas are written into the spreadsheet.

Worksheet Formula Option:

Sub Concatenate_Formulas()
Dim LastRow As Long
 With ActiveSheet
 
'Determine last row with data in Column G
  LastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "G").End(xlUp).Row
  
'Fill Column H:! range with formula
    Range("H5:H" & LastRow).Formula = _
       "=IFERROR(INDEX([zn.XLSX]Sheet1!$G:$G;MATCH(G5;[zn.XLSX]Sheet1!$A:$A;0));"""")"
    Range("I5:I" & LastRow).Formula = "=If(H5=0;C5;C5&"" ""&H5)"

'Replace Column C values with concatenated values
    Range("C5:C" & LastRow).WrapText = True
    Range("C5:C" & LastRow) = Range("I5:I" & LastRow).Value
    
'Clear Columns G:I (Remove comment marker below after testing)
    'Range("G:I").ClearContents
    
 End With
End Sub

All VBA Option:

Sub Concatenate_Find()
Dim LastRow As Long, rw As Long
Dim pc As Range

  With ActiveSheet
 
'Determine last row with data in ActiveSheet Column G
   LastRow = .Cells(Rows.Count, "G").End(xlUp).Row
  
'Set format of ActiveSheet Column C
  .Range("C5:C" & LastRow).WrapText = True
  
'Find ActiveSheet Product Code in zn sheet
     With Workbooks("zn.XLSX").Sheets(1).Columns(1)
        For rw = 5 To LastRow
          Set pc = .Find(Cells(rw, "G"), LookIn:=xlValues, lookat:=xlWhole)
            If Not pc Is Nothing Then
              ActiveSheet.Cells(rw, "C") = ActiveSheet.Cells(rw, "C") & " " & .Cells(pc.Row, "G")
            End If
        Next
     End With

'Clear ActiveSheet Column G (Remove comment marker below after testing)
  '.Range("G:G").ClearContents
    
  End With
End Sub

How To Post Data or Code ---> Click Here Before Posting Data or VBA Code


Reply ↓  Report •

#6
February 28, 2018 at 06:45:35
I understood semicolons were not a problem, I was saying my regional settings use semicolons in excel formulas, while yours use commas. But I must have misunderstood this line: "What language is your system and/or version of Excel set up for? The fact that FormulaLocal partially solved the issue (and your use of semi-colons) leads me to wonder if you are running into something related to your regional settings."

My issue with 1004 stopped when I added FormulaLocal. With Formula, even if I used my semicolons it would still show 1004.

I think I've seen that 65536 posted somewhere while searching for alternatives for LastRow. :)

When I said I want it safer I meant so that there is no room for error. Because I can see how putting formulas into cells can lead to errors sometimes, because a space or a comma is "misplaced". Anyway, maybe it's not the case.

Thing is, all my modifications to that exported file take 22 seconds to complete. Whether I have 9 products or 100, still 22 seconds. So I thought maybe a full VBA would be simpler and maybe take less when I don't have to autofill cells with formulas inserted from VBA. It's half VBA. I was looking for the thing you send me last, an ALL-VBA solution.

Thing is, I am having some error with it, specifically on line:

     With Workbooks("zn.XLSX").Sheets(1).Columns(1)

where I receive error 9 - Subscript out of range.

I tried entering the full zn.xlsx address, same error. Zn.xlsx is located in the same folder as the activesheet and also in the Documents folder, just in case.

Then I opened the zn.xlsx file and it worked, fast too. But I would like for it to work with the file closed, if possible.

Thanks so far, we're almost done!


Reply ↓  Report •

#7
February 28, 2018 at 09:32:53
✔ Best Answer
re: "Whether I have 9 products or 100, still 22 seconds. "

Without access to your actual environment (workbooks, system, network, etc.) it's a little tough for me to diagnose that issue.

A couple of things to try.

1 - Add this to your code somewhere before VBA starts to write anything into the workbook. This line will prevent the destination workbook form displaying any changes until the code is done. It'll sit there looking all original and then POP! all of the changes will appear at once after the code exits.

Application.SceenUpdating = False

2 - In some of your earlier code you had instructions that worked on entire columns, e.g.

Range("C:C").Formula = Range("I:I").Value

Those type of instructions can slow a macro down considerably as VBA processes 1,048,576 rows. You'll notice that I used:

Range("C5:C" & LastRow) = Range("I5:I" & LastRow).Value

No .Formula needed and only the specified Range referenced.

As I was single stepping through your code, I noticed an obvious pause while it executed any line that referenced an entire column.

re: "But I would like for it to work with the file closed, if possible."

I think we have a Catch 22 here. I'll have to play around a bit, but I don't think you can use .Find with a closed file. However, the formula method works because it is creating a Linked reference. So, you may be stuck with the choice of a macro that runs slowly with a closed workbook (the formula route) or a macro that runs fast on an open one (the .Find route).

I can't test anything right now, but maybe this will work:

Add code add the beginning of your macro to open the zn workbook (hidden) and add code on the end to close it. Assuming that works, the user probably won't even know that the zn workbook was opened.

How To Post Data or Code ---> Click Here Before Posting Data or VBA Code


Reply ↓  Report •

#8
February 28, 2018 at 22:45:41
I think I might have more lines slowing down my macro. I added multiple sections to one big macro, of course, I want the users to click a button and have everything arranged then printed. It doesn't help them much if it's not fully automated. At first, they asked for something, then more, then more and I get it, they realized what would also be useful when they worked with the printouts for a while.

Anyway, with your suggestions and help I will hopefully manage to speed things up some more, because I have more Range.EntireRow selections that might get faster if I limit them to LastRow rather than EntireRow.

I think I will try both options, open the file hidden vs use of the formula method and see which is faster.

Oh, and I added

Application.SceenUpdating = False

thanks to a previous suggestion you made, a while back.

I will update and better my lines as much as possible from now on using all your suggestions.

Thanks for everything!

LATER EDIT:
For me it won't work without FormulaLocal. If I use Formula, there's error 1004. I also tested the full VBA code, I added a code to open a hidden zn.xlsx but I haven't found the right code yet - there are of course more possibilities to do it.

I tested my updated LastRow macro for concatenating, as per your suggestions and also modified other Ranges to take LastRow into consideration and it took 11 seconds to process (half of what it did before).

Then I replaced my concatenating section with yours and it took about 6 seconds to load, whoo hoo! Thanks again for making times even shorter!

message edited by Mrrrr


Reply ↓  Report •

#9
March 1, 2018 at 04:00:38
I'm glad you got working to your satisfaction.

Just about anytime you can get VBA to do the work and then write the results as values into the spreadsheet it's going to be faster than writing in the formulas. It saves a lot of spreadsheet calculating time.

As far as users requesting more "features", I feel your pain. I see it in this forum all of the time as people ask a simple question then keep adding on requirements after the original question is answered. What ends up happening in many cases is that you either end up with inefficient code because all you do is bolt on new sections of code to add the features or you throw away most of the previous work and rewrite everything so it flows correctly. It can get very frustrating, especially when you can tell that they wanted all of the other stuff from the start, they just didn't bring it up.

At least in your case, you did most of the "combining", so good for you. ;-)

How To Post Data or Code ---> Click Here Before Posting Data or VBA Code


Reply ↓  Report •

#10
March 1, 2018 at 12:37:48
Went in the field today to set everything up. 2 PCs next to each other, one used commas in formulas, the other used semicolons. Great. I had to make 2 versions of the macro with those few changes to them :)
But the people are happy and that's what counts. They said it's perfect now. I made a few more aesthetic modifications from last time they've seen it and now they were thrilled.

I will be back one day with more questions, I'm sure. VBA is a nice thing to learn. My mom wants to use a few things too so I must teach her basic stuff of the basic stuff I know.

Thanks again for everything. I've learned a lot!


Reply ↓  Report •

#11
March 1, 2018 at 20:08:25
re: VBA is a nice thing to learn

I find that once I realize that I'm doing the same thing over and over again, I write a macro for it and add an icon to the Quick Access toolbar. I have at least 20 icons on that toolbar and a half dozen more in the mouse's Right-Click context menu.

I have hundreds of client worksheets and often have to perform the same tasks, whether it's place a specific formula, highlight a cell with a specific color or font, etc. Some stuff is simple (2 or 3 manual steps) other things are more complicated like moving multiple columns around and changing headings on older sheets to fit the new format. All I do is click an icon and the tasks are completed instantly.

All of the code is stored in a personal.xlsm workbook. If you are not familiar with the use of a personal.xlsm workbook, Google it. You can store macros in that workbook and they will be available for use in any workbook that you have open. That's why the macros behind my Quick Access toolbar icons always work, regardless of what workbook I have open.

How To Post Data or Code ---> Click Here Before Posting Data or VBA Code


Reply ↓  Report •

#12
March 2, 2018 at 01:44:40
re: If you are not familiar with the use of a personal.xlsm workbook...

Oh, but I am. This is the method I used with all the macros I asked for help with (well except for the email sending one). It's very useful using personal.xlsb and searching for how to use it was the first thing I've done when I started working at this table formatting macro. I added the macro there, made a nice printer looking button in Quick Access toolbar on every end user's Excel and they have easy access to multiple editing, extracting bar codes, concatenating - then printing, in 1 click.

re: ...highlight a cell with a specific color or font, etc. Some stuff is simple (2 or 3 manual steps)...

It was more than once that I needed to just add predefined color swatches to my toolbars, and not depend on shading every time. I mean I work in 2-3 different excel files and I want to color green in one, red in the 2nd and yellow in the other. I wanted and couldn't add predefined green, red, yellow buttons. But this is a great idea and I will proceed in doing said buttons in VBA and add them to my Quick Access toolbar. How to add them to right click I don't know yet, but will find out when my Quick Access toolbar gets full, I still have about 20 positions in it. Unless you are willing to share :)

Thanks for all the tips!


Reply ↓  Report •

Ask Question