VBA Range.Replace does not work second time - excel

I am very new in VBA. I created 2 buttons. Buttons are just for changing the sheets where the data in the cells come from. For example, I pull the numbers from sheet "ecommerce(D2C)" and when I click the button SaaS, it will pull the data from sheet "SaaS". And for Ecommerce button vice versa. I simply used Range.Raplace method for this. But the problem, SaaS button works, taking the numbers from sheet "SaaS", but when I click Ecommerce, it doesn't change the numbers back from "SaaS" sheet to "Ecommerce" sheet. I would be glad if you can help me with this issue. I don't know where I am making the mistake since I am using almost the same code for both of them.
Sub SaaS()
Cells.Select
Selection.Replace What:="ecommerce(D2C)", Replacement:="SaaS", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Range("A1").Select
End Sub
Sub Ecommerce()
Cells.Select
Selection.Replace What:="SaaS", Replacement:="ecommerce(D2C)", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Range("A2").Select
End Sub ```

I think I could reproduce the behaviour you was getting. What I had to do is to change from ecommerce(D2C) to Ecommerce (considering that this is the worksheet name). If you try to use the Replace method with something that would result in an incorrect formula, it just does nothing.
Sub SaaS()
Cells.Select
Selection.Replace What:="Ecommerce", Replacement:="SaaS", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Range("A1").Select
End Sub
Sub Ecommerce()
Cells.Select
Selection.Replace What:="SaaS", Replacement:="Ecommerce", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Range("A2").Select
End Sub

This method is failing for "ecommerce(D2C)" because Excel requires you to put a sheet name of this type within single quotes for use in a formula: e.g. "='ecommerce(D2C)'!A1".
Once you click the "Saas" button, this becomes "='SaaS'!A1", but that one does not require the single quotes, so that Excel automatically adjusts it to "=SaaS!A1". So, now, when you try to switch it back again, it will fail, because you are asking Excel to create a reference to "=ecommerce(D2C)!A1", and it won't allow that.
Hence, the fix is simple, add two single quotes:
Sub Ecommerce()
Cells.Select
Selection.Replace What:="SaaS", Replacement:="'ecommerce(D2C)'", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Range("A2").Select
End Sub

Related

VBA replacement not working for specific input

I am trying to make a VBA macro in excel which searches for a heading (succeeded at that), then selects the column of the heading (succeeded at that too) to finally do a replacement through the selected column (only partly succeeded in this).
I want to replace e.g SUM(C22:G22) with SUM(C22:INDIRECT(ADDRESS(ROW(); COLUMN()-1; 4))). It works just fine in excel when I select a column and then ctrl+H and find what :*) replace with :INDIRECT(ADDRESS(ROW(); COLUMN()-1; 4))).
Below is the code I tried that works:
Sub FindString_Search_Replace_Column()
Rows("1:1").Select
Selection.Find(What:="XTOTAL 2021", After:=ActiveCell, LookIn:= _
xlFormulas2, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.EntireColumn.Select
Selection.Replace What:=":*)", Replacement:=":A3)", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
End Sub
It does exactly what I want when it "just" needs to replace with e.g. A3. However, when the code replacement bit gets a bit longer, see below code, with what I actually need, it seems like it stops right after ActiveCell.EntireColumn.Select. It never actually changes anything.
Sub FindString_Search_Replace_Column()
Rows("1:1").Select
Selection.Find(What:="XTOTAL 2021", After:=ActiveCell, LookIn:= _
xlFormulas2, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.EntireColumn.Select
Selection.Replace What:=":*)", Replacement:=":INDIRECT(ADDRESS(ROW(); COLUMN()-1; 4)))", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
End Sub
I am thinking it is the inside ADDRESS bit it kind of chokes on but here my google skills cannot help me any further (no results suiting my problem).
Any ideas? :)
Try replacing the ; separators in your formula with , - when adding a formula in VBA typically you use "US-style" separator (unless assigning the formula via FormulaLocal).
Possibly that also applies to updating an existing formula.

Replace all instances of something in Excel formulas in the entire book using VBA?

In every formula of every cell of every sheet, the entire book, I want to replace part of the formula string, changing all "+" to "-", is there an easy way to do this in VBA if I have a particular workbook object xlWb?
I am trying:
xlWb.Cells.Replace What:="+", Replacement:="-", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
but get "Object does not support this property or method"
A workbook has not cells, only worksheets have. This causes your runtime error. Your Replace-command itself looks okay to me.
Simply loop over all the worksheets of your workbook should do the trick:
Dim ws As Worksheet
For Each ws In xlWb.Worksheets
ws.Cells.Replace What:="-", Replacement:="+", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False _
, FormulaVersion:=xlReplaceFormula2
Next
(If I where you, I would make a backup of the workbook before running the macro...)

Replacing individual characters in excel worksheet

I have the Following code following recording a macro:
Sub RemoveLetters()
Cells.Replace What:="C ", Replacement:="", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False, _
FormulaVersion:=xlReplaceFormula2
End Sub
Which works fine to remove a single character from an active worksheet. The problem I have is that C is just one of a handful of common individual characters I wish to remove How can I modify this or improve upon this to remove a list of given characters instead of just having to copy this for each?
Update:
Some of the data also contains units such as °C. The macro above unfortunately the above code recognises these characters as independent and therefore returns ° only. Does anyone know how I can get around this?
Add some parameters to your Sub and allow passing in an array of text items to be replaced:
Sub Tester()
RemoveLetters ActiveSheet, Array("C ","D ","E ")
End Sub
Sub RemoveLetters(ws As Worksheet, arrTxt)
dim i As Long
for i=lbound(arrTxt) to ubound(arrTxt)
ws.Cells.Replace What:=arrTxt(i), Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
MatchCase:=True, SearchFormat:=False
next i
End Sub

How to reference a cell into a replacement code in a recorded macro

I'm trying to make code that transforms a list of positions titles into standard positions predefined, an IF function would be too big.
The only way I thought of is to record a macro by replacing "this" for "that" and do this for all positions, but it would be a lot easier if it's possible to reference a cell instead of a text string inside the code:
What:="Field Installation Supervisor" (This part should be a cell reference from another sheet)
Replacement:= _ "Installation Supervisor" (This part is also a referenced cell from the same sheet as the above)
Don't know if it is possible to use cell reference inside this replacement code
Sub replacing()
Sheets("Active Employees June 01 2019").Select
Cells.Replace What:="Field Installation Supervisor", Replacement:= _
"Installation Supervisor", LookAt:=xlPart, SearchOrder:=xlByRows, _
MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub
I expect to use reference cells to make update/maintenance of the file easier
Just reference the cells in the normal way (and no need to select the sheet).
Sheets("Active Employees June 01 2019").Cells.Replace _
What:=Sheets("this").Range("A1").Value, _
Replacement:=Sheets("this").Range("A2").Value, _
LookAt:=xlPart, SearchOrder:=xlByRows, _
MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

Excel macro refresh data then format cells

I have a worksheet which contains a Pivot Table, the data is populated from a file output by another system.
Within Power Query I transform the data, specifically I use one of the fields to construct a URL.
"'=HYPERLINK(""" & "https://website.com/"&[Code] & """, """ & [Code] & """) "
When the data is in the Pivot Table, I need to manipulate the formatting to get it to display correctly.
In Excel I use a find and replace to convert the string into a proper URL showing the friendly name (and I resize the column).
Sub Macro1()
Cells.Replace What:="'=", Replacement:="=", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Columns("A:A").EntireColumn.AutoFit
End Sub
Refreshing the data means that the macro above needs running again.
I was keen to automate this for the users. However, running the following macro looks to do the formatting first THEN the refresh, what am I doing wrong?
Sub Macro2()
ActiveWorkbook.Connections("Query - XXX"). _
Refresh
'
Cells.Replace What:="'=", Replacement:="=", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Columns("A:A").EntireColumn.AutoFit
End Sub
NOTE the two parts of the macro work correctly independently, just not when combined as above.
If you find the query in the "Connections" sections on the Data ribbon, open it's properties, and uncheck the "Background Refresh" option, it will pause any VBA code until it is done refreshing. This property can also be set in VBA.
Sub Macro2()
ActiveWorkbook.Connections("Query - XXX").OLEDBConnection.BackgroundQuery = False
ActiveWorkbook.Connections("Query - XXX").Refresh
Cells.Replace What:="'=", Replacement:="=", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Columns("A:A").EntireColumn.AutoFit
End Sub

Resources