Използване на Find and Replace в Excel VBA

Този урок ще покаже как да използвате методите Find and Replace в Excel VBA.

VBA Find

Excel има отлично вградено намирам и Намери и замени инструменти.

Те могат да се активират с преките пътища CTRL + F (Намерете) или CTRL + H (Замяна) или през лентата: Начало> Редактиране> Намиране и избор.

Чрез щракване Настроики, можете да видите разширени опции за търсене:

Можете лесно да получите достъп до методите Find and Replace с помощта на VBA. Тези вградени методи са много по-бързи от всичко, което бихте могли да напишете сами във VBA.

Намерете пример за VBA

За да демонстрираме функционалността Find, създадохме следния набор от данни в Sheet1.

Ако искате да следвате, въведете данните в собствената си работна книга.

<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>

VBA Find без незадължителни параметри

Когато използвате метода VBA Find, можете да зададете много незадължителни параметри.

Силно препоръчваме да дефинирате всички параметри винаги, когато използвате метода Find!

Ако не дефинирате незадължителните параметри, VBA ще използва текущо избраните параметри в прозореца Find на Excel. Това означава, че може да не знаете какви параметри за търсене се използват, когато кодът се изпълнява. Find може да се изпълнява върху цялата работна книга или лист. Може да търси формули или стойности. Няма начин да разберете, освен ако не проверите ръчно какво е избрано в момента в прозореца за търсене на Excel.

За простота ще започнем с пример без дефинирани незадължителни параметри.

Пример за просто намиране

Нека разгледаме един прост пример за намиране:

123456789 Sub TestFind ()Dim MyRange As RangeЗадайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("служител")MsgBox MyRange.AddressMsgBox MyRange.ColumnMsgBox MyRange.RowEnd Sub

Този код търси „служител“ в използвания диапазон на лист1. Ако намери „служител“, той ще присвои първия намерен диапазон на променливата на диапазона MyRange.

След това ще се покажат кутии за съобщения с адреса, колоната и реда на намерения текст.

В този пример се използват настройките по подразбиране за намиране (ако приемем, че не са променени в прозореца за търсене на Excel):

  • Текстът за търсене е частично съпоставен със стойността на клетката (не се изисква точно съвпадение на клетката)
  • Търсенето не е чувствително към регистъра.
  • Find само търси в един работен лист

Тези настройки могат да се променят с различни незадължителни параметри (обсъдени по -долу).

Намерете бележки за метода

  • Find не избира клетката, в която е намерен текстът. Той само идентифицира намерения диапазон, който можете да манипулирате във вашия код.
  • Методът Find ще локализира само първия намерен екземпляр.
  • Можете да използвате заместващи знаци (*) напр. потърсете „E*“

Нищо не е намерено

Ако текстът за търсене не съществува, обектът на диапазона ще остане празен. Това причинява голям проблем, когато вашият код се опитва да покаже стойностите на местоположението, защото те не съществуват. Това ще доведе до съобщение за грешка, което не искате.

За щастие можете да тествате за празен обхват в рамките на VBA с помощта на Is Operator:

1 Ако не MyRange е нищо

Добавяне на кода към предишния ни пример:

12345678910111213 Sub TestFind ()Dim MyRange As RangeЗадайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("служител")Ако не MyRange е нищоMsgBox MyRange.AddressMsgBox MyRange.ColumnMsgBox MyRange.RowИначеMsgBox "Не е намерен"Край АкоEnd Sub

Намерете параметри

Досега разглеждахме само основен пример за използване на метода Find. Съществуват обаче редица незадължителни параметри, които да ви помогнат да прецизирате търсенето си

Параметър Тип Описание Стойности
Какво Задължително Стойността за търсене Всеки тип данни, като низ или число
След По избор Единична препратка към клетка, за да започнете търсенето Адрес на клетката
Погледни вътре По избор Използвайте формули, стойности, коментари за търсене xlValues, xlFormulas, xlComments
Погледнете По избор Свържете част или цяла клетка xl Цял, xlЧаст
SearchOrder По избор Редът за търсене в - редове или колони xlByRows, xlByColummns
SearchDirection По избор Посока за търсене, която да влезе - напред или назад xlСледваща, xlПредходна
MatchCase По избор Търсенето е чувствително към регистъра или не Истина или лъжа
MatchByte По избор Използва се само ако сте инсталирали поддръжка на двубайтов език, напр. китайски език Истина или лъжа
Формат за търсене По избор Разрешаване на търсене по формат на клетката Истина или лъжа

След параметър и намиране на множество стойности

Използвате След параметъра за да посочите началната клетка за вашето търсене. Това е полезно, когато има повече от един екземпляр на стойността, която търсите.

Ако едно търсене вече е намерило една стойност и знаете, че ще бъдат намерени още стойности, тогава използвайте метода Find с параметъра „След“, за да запишете първия екземпляр и след това да използвате тази клетка като отправна точка за следващото търсене.

Можете да използвате това, за да намерите множество копия на текста за търсене:

123456789101112131415161718192021222324252627282930313233343536 Sub TestMultipleFinds ()Dim MyRange като Range, OldRange As Range, FindStr As String„Потърсете първия екземпляр на„ „Светлина и топлина“Задайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("Light & Heat")„Ако не бъде намерен, излезтеАко MyRange не е нищо, излезте от Sub„Показване на първия намерен адресMsgBox MyRange.Address„Направете копие на обекта rangeЗадайте OldRange = MyRange'Добавете адреса към низ, разделящ с "|" характерFindStr = FindStr & "|" & MyRange.Address„Повтаряйте обхвата, търсейки други случаиНаправете„Търсете„ Light & Heat “, като използвате предишния намерен адрес като параметър AfterЗадайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("Light & Heat", After: = Range (OldRange.Address))„Ако адресът вече е намерен, излезте от цикъла do - това спира непрекъснатия цикълАко InStr (FindStr, MyRange.Address) След това излезте от Do'Показване на последния намерен адресMsgBox MyRange.Address„Добавете най -новия адрес към низ от адресиFindStr = FindStr & "|" & MyRange.Address'направете копие на текущия диапазонЗадайте OldRange = MyRangeЦикълEnd Sub

Този код ще повтори използвания диапазон и ще показва адреса всеки път, когато намери екземпляр от „Светлина и топлина“

Имайте предвид, че кодът ще продължи да циклира, докато в FindStr не бъде намерен дублиран адрес, в който случай той ще излезе от цикъла Do.

Погледнете параметъра

Можете да използвате Параметър LookIn за да посочите в кой компонент на клетката искате да търсите. Можете да посочите стойности, формули или коментари в клетка.

  • xlValues - Търси стойности на клетката (крайната стойност на клетка след нейното изчисление)
  • xl Формули - Търси в самата формула на клетката (каквото и да е въведено в клетката)
  • xlКоментари - Търси в бележките на клетката
  • xlCommentsThreaded - Търсения в коментарите на клетката

Ако приемем, че формула е въведена в работния лист, можете да използвате този примерен код, за да намерите първото местоположение на всяка формула:

12345678910 Sub TestLookIn ()Dim MyRange As RangeЗадайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("=", LookIn: = xlFormulas)Ако не MyRange е нищоMsgBox MyRange.AddressИначеMsgBox "Не е намерен"Край АкоEnd Sub

Ако параметърът „LookIn“ е зададен на xlValues, кодът ще покаже съобщение „Не е намерено“. В този пример той ще върне B10.

Използване на параметъра LookAt

The Параметър LookAt определя дали find ще търси точно съвпадение на клетка или ще търси всяка клетка, съдържаща стойността на търсене.

  • xl Целият - Изисква цялата клетка да съответства на стойността за търсене
  • xlPart - Търси в клетката низа за търсене

Този пример за код ще намери първата клетка, съдържаща текста „светлина“. С Търсене: = xlPart, той ще върне съвпадение за „Светлина и топлина“.

123456789 Sub TestLookAt ()Dim MyRange As RangeЗадайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("light", Lookat: = xlPart)Ако не MyRange е нищоMsgBox MyRange.AddressИначеMsgBox "Не е намерен"Край АкоEnd Sub

Ако xl Целият е зададено, съвпадение ще се върне само ако стойността на клетката е „светлина“.

Параметър SearchOrder

The Параметър SearchOrder диктува как ще се извършва търсенето в целия диапазон.

  • xlRows - Търсенето се извършва ред по ред
  • xlXolumns - Търсенето се извършва колона по колона
123456789 Sub TestSearchOrder ()Dim MyRange As RangeЗадайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("служител", SearchOrder: = xlColumns)Ако не MyRange е нищоMsgBox MyRange.AddressИначеMsgBox "Не е намерен"Край АкоEnd Sub

Това влияе кое съвпадение ще бъде намерено първо.

Използвайки тестовите данни, въведени в работния лист по -рано, когато редът за търсене е колони, разположената клетка е A5. Когато параметърът на реда за търсене се промени на xlRows, намиращата се клетка е C4

Това е важно, ако имате дублирани стойности в диапазона за търсене и искате да намерите първия екземпляр под определено име на колона.

Параметър SearchDirection

The Параметър SearchDirection диктува в каква посока ще тръгне търсенето - ефективно напред или назад.

  • xlСледваща - Търсете следващата съвпадаща стойност в диапазона
  • xlПредната - Търсете предишна съвпадаща стойност в диапазона

Отново, ако има дублирани стойности в обхвата на търсене, това може да повлияе на това коя да бъде намерена първа.

12345678910 Sub TestSearchDirection ()Dim MyRange As RangeЗадайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("heat", SearchDirection: = xlPrevious)Ако не MyRange е нищоMsgBox MyRange.AddressИначеMsgBox "Не е намерен"Край АкоEnd Sub

Използвайки този код върху тестовите данни, посоката на търсене на xlPrevious ще върне местоположение на C9. Използването на параметъра xlNext ще върне местоположение на A4.

Параметърът Next означава, че търсенето ще започне в горния ляв ъгъл на диапазона за търсене и ще работи надолу. Предишният параметър означава, че търсенето ще започне в долния десен ъгъл на диапазона за търсене и ще работи нагоре.

Параметър на MatchByte

The Параметър MatchBye се използва само за езици, които използват двоен байт за представяне на всеки знак, като китайски, руски и японски.

Ако този параметър е зададен на „True“, Find ще отговаря само на двубайтови знаци с двубайтови знаци. Ако параметърът е зададен на „False“, тогава двубайтов знак ще съвпадне с единични или двубайтови знаци.

Параметър на SearchFormat

The Параметър SearchFormat ви позволява да търсите съвпадащи формати на клетки. Това може да бъде определен шрифт, който се използва, или удебелен шрифт, или цвят на текста. Преди да използвате този параметър, трябва да зададете необходимия формат за търсене, като използвате свойството Application.FindFormat.

Ето пример за това как да го използвате:

12345678910111213 Sub TestSearchFormat ()Dim MyRange As RangeApplication.FindFormat.ClearApplication.FindFormat.Font.Bold = ВярноЗадайте MyRange = Листове ("Sheet1"). UsedRange.Find ("топлина", Формат за търсене: = Вярно)Ако не MyRange е нищоMsgBox MyRange.AddressИначеMsgBox "Не е намерен"Край АкоApplication.FindFormat.ClearEnd Sub

В този пример, FindFormat property е настроен да търси удебелен шрифт. След това изявлението Find търси думата „топлина“, задавайки параметъра SearchFormat на True, така че да върне екземпляр от този текст само ако шрифтът е удебелен.

В примерните данни на работния лист, показани по -рано, това ще върне A9, която е единствената клетка, съдържаща думата „топлина“ с удебелен шрифт.

Уверете се, че свойството FindFormat е изчистено в края на кода. Ако не направите това, следващото ви търсене ще вземе предвид това и ще върне неправилни резултати.

Когато използвате параметър SearchFormat, можете също да използвате заместващ знак (*) като стойност за търсене. В този случай той ще търси всяка стойност с удебелен шрифт:

1 Задайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("*", Формат за търсене: = True)

Използване на множество параметри

Всички дискутирани тук параметри за търсене могат да се използват в комбинация помежду си, ако е необходимо.

Например, можете да комбинирате параметъра „LookIn“ с параметъра „MatchCase“, така че да разгледате целия текст на клетката, но той е чувствителен към регистъра

123456789 Sub TestMultipleParameters ()Dim MyRange As RangeЗадайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("Light & Heat", LookAt: = xlWhole, MatchCase: = True)Ако не MyRange е нищоMsgBox MyRange.AddressИначеMsgBox "Не е намерен"Край АкоEnd Sub

В този пример кодът ще върне A4, но ако сме използвали само част от текста напр. „Топлина“, нищо няма да бъде намерено, защото съвпадаме по цялата стойност на клетката. Също така, той ще се провали поради несъответствие на случая.

1 Задайте MyRange = Sheets ("Sheet1"). UsedRange.Find ("heat", LookAt: = xlWhole, MatchCase: = True)

Заменете в Excel VBA

Както можете да очаквате, има функция Replace в Excel VBA, която работи по много подобен начин на „Find“, но замества стойностите в местоположението на клетката, намерени с нова стойност.

Това са параметрите, които можете да използвате в инструкция Replace method. Те работят по абсолютно същия начин, както при инструкцията Find method. Единствената разлика от „Намери“ е, че трябва да посочите параметър за замяна.

Име Тип Описание Стойности
Какво Задължително Стойността за търсене Всеки тип данни, като низ или число
Замяна Задължително Заменящият низ. Всеки тип данни, като низ или число
Погледнете По избор Свържете част или цяла клетка xlPart или xlWhole
SearchOrder По избор Редът за търсене в - Редове или Колони xlByRows или xlByColumns
MatchCase По избор Търсенето е чувствително към регистъра или не Истина или лъжа
MatchByte По избор Използва се само ако сте инсталирали поддръжка на двубайтови езици Истина или лъжа
Формат за търсене По избор Разрешаване на търсене по формат на клетката Истина или лъжа
ReplaceFormat По избор Форматът за замяна на метода. Истина или лъжа

Параметърът Замяна на формат търси клетка с определен формат, напр. удебелен по същия начин, както параметърът SearchFormat работи в метода Find. Първо трябва да настроите свойството Application.FindFormat, както е показано в кода Find example, показан по -рано

Смяна без допълнителни параметри

Най -простото, трябва само да посочите какво търсите и с какво искате да го замените.

123 Sub TestReplace ()Листове ("Sheet1"). UsedRange.Replace What: = "Light & Heat", Замяна: = "L & H"End Sub

Обърнете внимание, че методът Find ще върне само първия екземпляр на съответстващата стойност, докато методът Replace работи през целия посочен диапазон и замества всичко, на което намери съвпадение.

Кодът за подмяна, показан тук, ще замени всеки екземпляр от „Light & Heat“ с „L & H“ през целия диапазон от клетки, дефиниран от обекта UsedRange

Използване на VBA за намиране или замяна на текст в текстов низ на VBA

Горните примери работят чудесно, когато използвате VBA за взаимодействие с данни на Excel. За взаимодействие с низове VBA обаче можете да използвате вградени VBA функции като INSTR и REPLACE.

Можете да използвате INSTR функция за намиране на низ от текст в по -дълъг низ.

123 Sub TestInstr ()MsgBox InStr ("Това е MyText низ", "MyText")End Sub

Този примерен код ще върне стойността на 9, което е позицията на числото, където „MyText“ е намерен в низа за търсене.

Имайте предвид, че той е чувствителен към регистър. Ако „MyText“ е с малки букви, тогава ще бъде върната стойност 0, което означава, че низът за търсене не е намерен. По-долу ще обсъдим как да деактивирате чувствителността към регистър.

INSTR - Старт

Налични са още два незадължителни параметъра. Можете да посочите началната точка за търсене:

1 MsgBox InStr (9, "Това е низ MyText", "MyText")

Началната точка е посочена като 9, така че тя все още ще върне 9. Ако началната точка е 10, тогава тя ще върне 0 (без съвпадение), тъй като началната точка ще бъде твърде далеч напред.

INSTR - Чувствителност към регистъра

Можете също да зададете параметър Сравни на vbBinaryCompare или vbTextCompare. Ако зададете този параметър, изявлението трябва да има начална стойност на параметъра.

  • vbBinaryCompare - Чувствителни към главни букви (по подразбиране)
  • vbTextCompare - Не са чувствителни към малки и големи букви
1 MsgBox InStr (1, "Това е MyText низ", "mytext", vbTextCompare)

Това изявление ще върне 9, въпреки че текстът за търсене е с малки букви.

За да деактивирате чувствителността към регистър, можете също да декларирате Option Compare Text в горната част на вашия кодов модул.

Функция за смяна на VBA

Ако искате да замените символи в низ с различен текст в кода си, тогава методът Replace е идеален за това:

123 Sub TestReplace ()MsgBox Replace ("Това е низ MyText", "MyText", "Моят текст")End Sub

Този код заменя „MyText“ с „My Text“. Обърнете внимание, че низът за търсене е чувствителен към регистъра, тъй като двоичното сравнение е по подразбиране.

Можете също така да добавите други незадължителни параметри:

  • Старт - определя позиция в първоначалния низ, от която трябва да започне подмяната. За разлика от метода Find, той връща отсечен низ, започващ от номера на знака, определен от параметъра Start.
  • Броя - определя броя на замените, които трябва да бъдат направени. По подразбиране Replace ще промени всеки екземпляр от намерения текст за търсене, но можете да ограничите това до единична подмяна, като зададете параметъра Count на 1
  • Сравнете - както в метода Find, можете да зададете двоично търсене или текстово търсене с помощта vbBinaryCompare или vbTextCompare. Двоичният регистър е чувствителен, а текстът не е чувствителен към регистъра
1 MsgBox Replace ("Това е MyText низ (mytext)", "MyText", "My Text", 9, 1, vbTextCompare)

Този код връща „Моят текстов низ (митекст)“. Това е така, защото дадената начална точка е 9, така че новият върнат низ започва от символ 9. Само първият „MyText“ е променен, тъй като параметърът Count е зададен на 1.

Методът Replace е идеален за решаване на проблеми като имена на хора, съдържащи апострофи, напр. О’Флин. Ако използвате единични кавички за дефиниране на стойност на низ и има апостроф, това ще доведе до грешка, тъй като кодът ще интерпретира апострофа като края на низ и няма да разпознае остатъка от низ.

Можете да използвате метода Replace, за да замените апострофа с нищо, като го премахнете напълно.

Така ще помогнете за развитието на сайта, сподели с приятелите си

wave wave wave wave wave