Вопрос или проблема
У меня есть таблица Excel с некоторыми именами в ячейках. В одной ячейке может быть как одно имя, так и несколько имен.
Например: Ячейка A5 содержит “Joe”, ячейка BD54 содержит “Joe;Harry;Molly”, ячейка YY1 содержит “Harry;Butch”.
Что я хочу сделать, так это заменить значения всех ячеек, содержащих “Joe” или “Molly”, на “1”, независимо от того, что еще находится в этих ячейках, а ячейки, содержащие только “Harry” или “Butch”, будут заменены на “0”, если они не содержат “Joe” или “Molly”. Для вышеуказанного примера результат должен быть следующим: A5 содержит “1”, BD54 содержит “1”, YY1 содержит “0”.
Я полный новичок в VBA – не могли бы вы, джентльмены, помочь мне с этим? Я подозреваю, что здесь следует использовать Cells.Replace, однако, я не уверен, как передать список имен в него
Dim Findtext As String
Dim Replacetext As String
Findtext = "Joe","Molly"
Replacetext = "1"
Findtext = "Harry","Butch"
Replacetext = "0"
Cells.Replace What:=Findtext, Replacement:=Replacetext, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Вы на правильном пути, но вместо этого можно сделать что-то такое, используя instr –
Sub test()
Dim check1 As Integer
Dim check2 As Integer
Dim find1 As String
find1 = "a"
Dim find2 As String
find2 = "b"
For Each c In Range("A:A")
check1 = InStr(1, c, find1, 1)
check2 = InStr(1, c, find2, 1)
If check1 > 0 Then
c.Value = 1
End If
If check2 > 0 Then
c.Value = 2
End If
Next
End Sub
В основном, она ищет в ячейке положение строки поиска. Если она не находит его, она возвращается к 0
. Таким образом, если она его находит, то check1 или check2 будут больше 0. Если она находит обе строки, то возвращается к последнему if
.
Чтобы сделать это немного более универсальным… вы могли бы иметь список имен для поиска, которые нужно заменить, где-то на вашем листе. Вы бы получили каждый из диапазонов для замены на Один и Нуль соответственно, затем прошлись бы по (выбранному) целевому диапазону, выполняя замены.
У меня были данные такого вида:
Option Explicit
Public Sub DirtyHarry()
Dim target_range As Range
Dim search_names_range As Range
'select the range you want to do the replace on before you start!
Set target_range = Selection
'do the ones first
Set search_names_range = Sheet1.Range("E2:E" & Sheet1.Range("E2").End(xlDown).Row)
BinaryReplaceBleepBloop search_names_range, target_range, 1
'now do the zeroes
Set search_names_range = Sheet1.Range("G2:G" & Sheet1.Range("G2").End(xlDown).Row)
BinaryReplaceBleepBloop search_names_range, target_range, 0
End Sub
Private Function BinaryReplaceBleepBloop(search_names As Range, target_range As Range, replacement_value As Integer)
Dim search_string_cell As Object
Dim target_cell As Object
Dim this_name As String
Debug.Print "Searching " & target_range.AddressLocal & " for the names in " & search_names.AddressLocal & " to replace with " & replacement_value
'loop through each of the search names
For Each search_string_cell In search_names.Cells
this_name = search_string_cell.Value
Debug.Print "..." & this_name
'loop through each of the cells in the selected target range
For Each target_cell In target_range.Cells
Debug.Print "......target_cell value is " & target_cell.Value
If InStr(1, target_cell.Value, this_name) > 0 Then
Debug.Print "......Found it! Replacing " & target_cell.Value & " with " & replacement_value
target_cell.Value = replacement_value
Else
Debug.Print "......Didn't find it. Nothing to see here."
End If
Next target_cell
Next search_string_cell
End Function
Ответ или решение
Конечно, я помогу вам с написанием подробного ответа на вопрос о том, как заменить значения ячеек в Excel на основе их содержимого, используя VBA. Вопрос, который вы подняли, касается обработки и замены ячеек с именами в Excel, что требует использования макросов языка VBA (Visual Basic for Applications). Ниже вы найдете полное объяснение подхода и реализацию кода.
Теория
VBA предоставляет отличные возможности для автоматизации задач в Excel, позволяя создавать макросы для выполнения различных операций, таких как поиск и замена значений. Однако, в данном случае речь идет не о простой замене, а о замене на основе условий, где значение может быть заменено, если встречается определенное слово или слова в ячейке.
Основные функции и структуры, которые будут использованы в решении, включают:
-
Циклы и условия:
For Each...Next
цикл будет использоваться для перебора каждой ячейки в диапазоне, а условиеIf...Then
— для проверки содержания ячейки. -
Функция
InStr
: Она позволяет определить, присутствует ли подстрока в строке, и возвращает позицию, с которой подстрока начинается. Если подстрока не найдена, функция возвращает 0. -
Замена значений: Мы будем заменять значения ячеек на "1" или "0" в зависимости от условий.
Пример
Рассмотрим пример задачи:
- У вас есть таблица с именами, и необходимо заменить содержимое ячеек, если они содержат "Joe" или "Molly", заменить содержимое того, что остается, на "1". В случае, если ячейка содержит только "Harry" или "Butch", и не содержат "Joe" или "Molly", заменить значение на "0".
Применение
Ниже приведен пример кода, который решает поставленную задачу:
Option Explicit
Sub ReplaceNames()
Dim cell As Range
Dim targetRange As Range
Dim containsJoeMolly As Boolean
Dim containsHarryButch As Boolean
' Укажите диапазон, в котором вы хотите произвести замену
Set targetRange = Range("A1:Z100") ' Измените диапазон на нужный вам
For Each cell In targetRange
' Проверка на содержимое ячейки
containsJoeMolly = (InStr(1, cell.Value, "Joe", vbTextCompare) > 0) Or _
(InStr(1, cell.Value, "Molly", vbTextCompare) > 0)
containsHarryButch = (InStr(1, cell.Value, "Harry", vbTextCompare) > 0) Or _
(InStr(1, cell.Value, "Butch", vbTextCompare) > 0)
' Замена на основе условия
If containsJoeMolly Then
cell.Value = "1"
ElseIf containsHarryButch Then
cell.Value = "0"
End If
Next cell
End Sub
Описание кода
-
Цикл For Each…Next: Этот цикл проходит по каждой ячейке в указанном диапазоне
targetRange
. -
Определение условий: Мы устанавливали два логических значения
containsJoeMolly
иcontainsHarryButch
, которые определяют, содержится ли одно из указанных имен в текущей обрабатываемой ячейке. -
Замена на основе проверки: Если
containsJoeMolly
истинно, значение ячейки заменяется на "1". ЕслиcontainsHarryButch
истинно, заменяем значение на "0".
Заключение
Использование VBA в Excel для замены значений на основе условий – мощный инструмент для автоматизации и упрощения работы с данными. Этот пример кода поможет решить задачу замены значений на основе сложных условий, что особенно полезно в случае работы с большими объемами данных. Это решение легко адаптируется для более сложных сценариев, включая дополнительные условия или другие диапазоны данных.