PowerShell Excel search replace issue with loop
What I'm doing here is to search excel sheet for a value, if value matches it will be replaced by first value in a given text file:
example:
search for value text find the first instance replace with first value in a given text file which is "read", search again for text find again replace with "read" until can't find "text", now search for second value in array "text1", search in excel sheet find it replace with second line in given text value, which is "read1" and so on.
I have the script that is working somewhat, issue is it will replace all array values with only first line of text file which is "read", it is not looping through the second line of text file.
Can someone please help.
code:
test.txt file read as:
read
read1
read2
$text = "text","text1","text2","text3"
$replace=get-content C:scripttest.txt
$File = "C:scripttest.xlsx"
# Setup Excel, open $File and set the the first worksheet
$i=0
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.Range("A1","Z10").EntireColumn
Foreach($SearchString in $text){
$Search = $Range.find($SearchString)
if ($search -ne $null){
$SearchString
$replace[$i]
$FirstAddress = $search.Address
do {
$Search.value() = $replace[$i]
$search = $Range.FindNext($search)
} while ( $search -ne $null -and $search.Address -ne $FirstAddress )
$i++
}
}
$WorkBook.Save()
$WorkBook.Close()
[void]$excel.quit()
microsoft-excel powershell
add a comment |
What I'm doing here is to search excel sheet for a value, if value matches it will be replaced by first value in a given text file:
example:
search for value text find the first instance replace with first value in a given text file which is "read", search again for text find again replace with "read" until can't find "text", now search for second value in array "text1", search in excel sheet find it replace with second line in given text value, which is "read1" and so on.
I have the script that is working somewhat, issue is it will replace all array values with only first line of text file which is "read", it is not looping through the second line of text file.
Can someone please help.
code:
test.txt file read as:
read
read1
read2
$text = "text","text1","text2","text3"
$replace=get-content C:scripttest.txt
$File = "C:scripttest.xlsx"
# Setup Excel, open $File and set the the first worksheet
$i=0
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.Range("A1","Z10").EntireColumn
Foreach($SearchString in $text){
$Search = $Range.find($SearchString)
if ($search -ne $null){
$SearchString
$replace[$i]
$FirstAddress = $search.Address
do {
$Search.value() = $replace[$i]
$search = $Range.FindNext($search)
} while ( $search -ne $null -and $search.Address -ne $FirstAddress )
$i++
}
}
$WorkBook.Save()
$WorkBook.Close()
[void]$excel.quit()
microsoft-excel powershell
add a comment |
What I'm doing here is to search excel sheet for a value, if value matches it will be replaced by first value in a given text file:
example:
search for value text find the first instance replace with first value in a given text file which is "read", search again for text find again replace with "read" until can't find "text", now search for second value in array "text1", search in excel sheet find it replace with second line in given text value, which is "read1" and so on.
I have the script that is working somewhat, issue is it will replace all array values with only first line of text file which is "read", it is not looping through the second line of text file.
Can someone please help.
code:
test.txt file read as:
read
read1
read2
$text = "text","text1","text2","text3"
$replace=get-content C:scripttest.txt
$File = "C:scripttest.xlsx"
# Setup Excel, open $File and set the the first worksheet
$i=0
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.Range("A1","Z10").EntireColumn
Foreach($SearchString in $text){
$Search = $Range.find($SearchString)
if ($search -ne $null){
$SearchString
$replace[$i]
$FirstAddress = $search.Address
do {
$Search.value() = $replace[$i]
$search = $Range.FindNext($search)
} while ( $search -ne $null -and $search.Address -ne $FirstAddress )
$i++
}
}
$WorkBook.Save()
$WorkBook.Close()
[void]$excel.quit()
microsoft-excel powershell
What I'm doing here is to search excel sheet for a value, if value matches it will be replaced by first value in a given text file:
example:
search for value text find the first instance replace with first value in a given text file which is "read", search again for text find again replace with "read" until can't find "text", now search for second value in array "text1", search in excel sheet find it replace with second line in given text value, which is "read1" and so on.
I have the script that is working somewhat, issue is it will replace all array values with only first line of text file which is "read", it is not looping through the second line of text file.
Can someone please help.
code:
test.txt file read as:
read
read1
read2
$text = "text","text1","text2","text3"
$replace=get-content C:scripttest.txt
$File = "C:scripttest.xlsx"
# Setup Excel, open $File and set the the first worksheet
$i=0
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.Range("A1","Z10").EntireColumn
Foreach($SearchString in $text){
$Search = $Range.find($SearchString)
if ($search -ne $null){
$SearchString
$replace[$i]
$FirstAddress = $search.Address
do {
$Search.value() = $replace[$i]
$search = $Range.FindNext($search)
} while ( $search -ne $null -and $search.Address -ne $FirstAddress )
$i++
}
}
$WorkBook.Save()
$WorkBook.Close()
[void]$excel.quit()
microsoft-excel powershell
microsoft-excel powershell
edited Apr 23 '15 at 6:02
Karan
49.2k1489160
49.2k1489160
asked Apr 23 '15 at 5:39
dino110dino110
111
111
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
I think the problem is that by default it's searching for "text" anywhere in the cell, which matches "text", "text1", "text2", etc. You could rearrange things so that "text" is the last one it searches for, but that's not ideal. Really, we need to get it to match the entire cell.
Thankfully there's a parameter in Range.Find() that allows us to do exactly that: LookAt (https://msdn.microsoft.com/en-us/library/office/ff839746.aspx).
Unfortunately it's a bit of a pain to access named parameters in COM objects in PowerShell, so the easier thing is to just specify the preceding parameters specifically:
$First = $Worksheet.Range("A1")
$Search = $Range.find($SearchString,$First,-4163,1)
$First is A1, -4163 is the enum value for look in values, and 1 is the enum value for whole.
The PS-COM interop for Excel is real finicky about data types. Where I would normally expect to be able to pick out the first cell from the range and pass it to the function, it doesn't seem to like that, so I specified it manually in $First.
I looked up the enums and hard-coded them because that's another thing that's painful in PowerShell - hopefully someone might be able to suggest a nice way of doing that.
So the whole script ends up being:
$text = "text","text1","text2","text3"
$replace=get-content C:scripttest.txt
$File = "C:scripttest.xlsx"
# Setup Excel, open $File and set the the first worksheet
$i=0
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.Range("A1","Z10").EntireColumn
$First = $Worksheet.Range("A1")
Foreach($SearchString in $text){
$Search = $Range.find($SearchString,$First,-4163,1)
if ($search -ne $null){
$SearchString
$replace[$i]
$FirstAddress = $search.Address
do {
$Search.value() = $replace[$i]
$search = $Range.FindNext($search)
} while ( $search -ne $null -and $search.Address -ne $FirstAddress )
$i++
}
}
$WorkBook.Save()
$WorkBook.Close()
[void]$excel.quit()
It will remember the find settings for the FindNext() calls, so no need to change anything there.
Hope that helps!
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "3"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f905017%2fpowershell-excel-search-replace-issue-with-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I think the problem is that by default it's searching for "text" anywhere in the cell, which matches "text", "text1", "text2", etc. You could rearrange things so that "text" is the last one it searches for, but that's not ideal. Really, we need to get it to match the entire cell.
Thankfully there's a parameter in Range.Find() that allows us to do exactly that: LookAt (https://msdn.microsoft.com/en-us/library/office/ff839746.aspx).
Unfortunately it's a bit of a pain to access named parameters in COM objects in PowerShell, so the easier thing is to just specify the preceding parameters specifically:
$First = $Worksheet.Range("A1")
$Search = $Range.find($SearchString,$First,-4163,1)
$First is A1, -4163 is the enum value for look in values, and 1 is the enum value for whole.
The PS-COM interop for Excel is real finicky about data types. Where I would normally expect to be able to pick out the first cell from the range and pass it to the function, it doesn't seem to like that, so I specified it manually in $First.
I looked up the enums and hard-coded them because that's another thing that's painful in PowerShell - hopefully someone might be able to suggest a nice way of doing that.
So the whole script ends up being:
$text = "text","text1","text2","text3"
$replace=get-content C:scripttest.txt
$File = "C:scripttest.xlsx"
# Setup Excel, open $File and set the the first worksheet
$i=0
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.Range("A1","Z10").EntireColumn
$First = $Worksheet.Range("A1")
Foreach($SearchString in $text){
$Search = $Range.find($SearchString,$First,-4163,1)
if ($search -ne $null){
$SearchString
$replace[$i]
$FirstAddress = $search.Address
do {
$Search.value() = $replace[$i]
$search = $Range.FindNext($search)
} while ( $search -ne $null -and $search.Address -ne $FirstAddress )
$i++
}
}
$WorkBook.Save()
$WorkBook.Close()
[void]$excel.quit()
It will remember the find settings for the FindNext() calls, so no need to change anything there.
Hope that helps!
add a comment |
I think the problem is that by default it's searching for "text" anywhere in the cell, which matches "text", "text1", "text2", etc. You could rearrange things so that "text" is the last one it searches for, but that's not ideal. Really, we need to get it to match the entire cell.
Thankfully there's a parameter in Range.Find() that allows us to do exactly that: LookAt (https://msdn.microsoft.com/en-us/library/office/ff839746.aspx).
Unfortunately it's a bit of a pain to access named parameters in COM objects in PowerShell, so the easier thing is to just specify the preceding parameters specifically:
$First = $Worksheet.Range("A1")
$Search = $Range.find($SearchString,$First,-4163,1)
$First is A1, -4163 is the enum value for look in values, and 1 is the enum value for whole.
The PS-COM interop for Excel is real finicky about data types. Where I would normally expect to be able to pick out the first cell from the range and pass it to the function, it doesn't seem to like that, so I specified it manually in $First.
I looked up the enums and hard-coded them because that's another thing that's painful in PowerShell - hopefully someone might be able to suggest a nice way of doing that.
So the whole script ends up being:
$text = "text","text1","text2","text3"
$replace=get-content C:scripttest.txt
$File = "C:scripttest.xlsx"
# Setup Excel, open $File and set the the first worksheet
$i=0
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.Range("A1","Z10").EntireColumn
$First = $Worksheet.Range("A1")
Foreach($SearchString in $text){
$Search = $Range.find($SearchString,$First,-4163,1)
if ($search -ne $null){
$SearchString
$replace[$i]
$FirstAddress = $search.Address
do {
$Search.value() = $replace[$i]
$search = $Range.FindNext($search)
} while ( $search -ne $null -and $search.Address -ne $FirstAddress )
$i++
}
}
$WorkBook.Save()
$WorkBook.Close()
[void]$excel.quit()
It will remember the find settings for the FindNext() calls, so no need to change anything there.
Hope that helps!
add a comment |
I think the problem is that by default it's searching for "text" anywhere in the cell, which matches "text", "text1", "text2", etc. You could rearrange things so that "text" is the last one it searches for, but that's not ideal. Really, we need to get it to match the entire cell.
Thankfully there's a parameter in Range.Find() that allows us to do exactly that: LookAt (https://msdn.microsoft.com/en-us/library/office/ff839746.aspx).
Unfortunately it's a bit of a pain to access named parameters in COM objects in PowerShell, so the easier thing is to just specify the preceding parameters specifically:
$First = $Worksheet.Range("A1")
$Search = $Range.find($SearchString,$First,-4163,1)
$First is A1, -4163 is the enum value for look in values, and 1 is the enum value for whole.
The PS-COM interop for Excel is real finicky about data types. Where I would normally expect to be able to pick out the first cell from the range and pass it to the function, it doesn't seem to like that, so I specified it manually in $First.
I looked up the enums and hard-coded them because that's another thing that's painful in PowerShell - hopefully someone might be able to suggest a nice way of doing that.
So the whole script ends up being:
$text = "text","text1","text2","text3"
$replace=get-content C:scripttest.txt
$File = "C:scripttest.xlsx"
# Setup Excel, open $File and set the the first worksheet
$i=0
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.Range("A1","Z10").EntireColumn
$First = $Worksheet.Range("A1")
Foreach($SearchString in $text){
$Search = $Range.find($SearchString,$First,-4163,1)
if ($search -ne $null){
$SearchString
$replace[$i]
$FirstAddress = $search.Address
do {
$Search.value() = $replace[$i]
$search = $Range.FindNext($search)
} while ( $search -ne $null -and $search.Address -ne $FirstAddress )
$i++
}
}
$WorkBook.Save()
$WorkBook.Close()
[void]$excel.quit()
It will remember the find settings for the FindNext() calls, so no need to change anything there.
Hope that helps!
I think the problem is that by default it's searching for "text" anywhere in the cell, which matches "text", "text1", "text2", etc. You could rearrange things so that "text" is the last one it searches for, but that's not ideal. Really, we need to get it to match the entire cell.
Thankfully there's a parameter in Range.Find() that allows us to do exactly that: LookAt (https://msdn.microsoft.com/en-us/library/office/ff839746.aspx).
Unfortunately it's a bit of a pain to access named parameters in COM objects in PowerShell, so the easier thing is to just specify the preceding parameters specifically:
$First = $Worksheet.Range("A1")
$Search = $Range.find($SearchString,$First,-4163,1)
$First is A1, -4163 is the enum value for look in values, and 1 is the enum value for whole.
The PS-COM interop for Excel is real finicky about data types. Where I would normally expect to be able to pick out the first cell from the range and pass it to the function, it doesn't seem to like that, so I specified it manually in $First.
I looked up the enums and hard-coded them because that's another thing that's painful in PowerShell - hopefully someone might be able to suggest a nice way of doing that.
So the whole script ends up being:
$text = "text","text1","text2","text3"
$replace=get-content C:scripttest.txt
$File = "C:scripttest.xlsx"
# Setup Excel, open $File and set the the first worksheet
$i=0
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.Range("A1","Z10").EntireColumn
$First = $Worksheet.Range("A1")
Foreach($SearchString in $text){
$Search = $Range.find($SearchString,$First,-4163,1)
if ($search -ne $null){
$SearchString
$replace[$i]
$FirstAddress = $search.Address
do {
$Search.value() = $replace[$i]
$search = $Range.FindNext($search)
} while ( $search -ne $null -and $search.Address -ne $FirstAddress )
$i++
}
}
$WorkBook.Save()
$WorkBook.Close()
[void]$excel.quit()
It will remember the find settings for the FindNext() calls, so no need to change anything there.
Hope that helps!
answered Apr 24 '15 at 6:27
Evan CottleEvan Cottle
261
261
add a comment |
add a comment |
Thanks for contributing an answer to Super User!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f905017%2fpowershell-excel-search-replace-issue-with-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown