Excel macro refresh data then format cells - excel

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

Related

VBA Range.Replace does not work second time

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

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

Returning the Number of Replacements done in a Search & Replace within Excel

I am trying to locate the top 10 in a list of thousands of entries, to create an ongoing report of failures of hardware. The report displays a top 10 for various things. For example top 10 errors, top 10 downtime etc. It is used to target engineers to the most critical machines in a manufacturing facility.
Our macro has worked OK for when we have had 255 errors. We have now extended our error list to 2048, and we envisage that our macros will run incredibly slowly.
I have an idea to utilise the Search and Replace function, and utilise the number of replacements to achieve the top 10. Manually a message box is displayed giving this number. When recording this macro, no message box is seen (which is good) but I cannot locate where the number is.
The function returns a Boolean.
Macro recorded looks like this.
Sub searchmacrotest()
' searchmacrotest Macro
Cells.Replace What:="a", Replacement:="AZ", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="AZ", Replacement:="a", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub
The first line simply changes the a to Az, and the second changes it back to a. They run quickly and gave a number of 75 with my list.
Logic:
Use a unique word to replace. While choosing ensure that there is no possibility of the word to occur.
Use Countif to count the occurrences of this unique word after replacing
Code: Try this
Sub GetReplaceCount()
Dim ws As Worksheet
'~~> Set this to a word which is unique
Dim magicword As String: magicword = "Sid" & Format(Now, ddmmyyhhmmss)
'~~> This is what you want to replace
Dim searchText As String: searchText = "a"
Set ws = ThisWorkbook.Sheets("Sheet1")
With ws
.Cells.Replace What:=searchText, Replacement:=magicword, LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
'~~> This will give you the number of occurences
Debug.Print Application.WorksheetFunction.CountIf(.UsedRange, "*" & magicword & "*")
.Cells.Replace What:=magicword, Replacement:=searchText, LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End With
End Sub

Resources