pankajjadhav83 Ответов: 2

У меня есть некоторые символы, которые нуждаются в пространстве до и после в excel VBA


Я искал ответ несколько дней, но пока ничего.
В случае, если какой-либо заглавный или мелкий текст и число являются тогда требованием пространства ниже там. Макрос VBA работает только с учетом регистра только [a . &ампер; на . &ампер; 1 .] должно быть [А. &амп; на. &ампер; 1.] удаление пустого пространства

1	. 	 DOT	              No Space Before & After Single Space
2	: 	 Colon	              No Space Before & After Single Space
3	, 	 Comma	              No Space Before & After Single Space
4	( 	 Opening Parenthesis  Before Single Space & No Space After
5	) 	 Closing Parenthesis  No Space Before & After Single Space
6	/ 	 Slash	              No Space Before & After
7	- 	 Hyphen	              Before & After Single Space
8	" 	 Left double quote    Before Single Space & No Space After
9	" 	 Right double quote   No Space Before & After Single Space
10	! 	 Exclamation point    No Space Before & After
11	# 	 Number sign	      No Space Before & After
12	* 	 Asterisk	      No Space Before & After
13	; 	 Semicolon	      No Space Before & After Single Space
14	_ 	 Underscore	      No Space Before & After
15	{ 	 Opening Brace	      Before Single Space & No Space After
16	} 	 Closing Brace	      No Space Before & After Single Space
17	‘ 	 Left Single Quote    No Space Before & After
18	’ 	 Right Single Quote   No Space Before & After

В случае конфликта 2 символов у нас есть макрос VBA.

Что я уже пробовал:

У меня есть начало кодирования:


Sub Multi_FindReplace()

Dim sht As Worksheet
Dim fndList As Variant
Dim rplcList As Variant
Dim x As Long

fndList = Array(":.", ",.")
rplcList = Array(": .", ", .")

'but there is limits of replacing only 50


For x = LBound(fndList) To UBound(fndList)
For Each sht In ActiveWorkbook.Worksheets
sht.Cells.Replace What:=fndList(x), Replacement:=rplcList(x), _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
SearchFormat:=False, ReplaceFormat:=False
Next sht

Next x

End Sub

CHill60

Раздел "Что я пробовал" предназначен для того, чтобы вы опубликовали код, который вы пробовали. Мы не собираемся писать весь код для вас

pankajjadhav83

У меня есть начало кодирования

Суб Multi_FindReplace()

Дим шт Как лист
Dim fndList как вариант
Dim rplcList как вариант
Тусклый x как долго

fndList = Array (":.",",.")
rplcList = Array (": .",",.")

"но есть пределы замены только 50


Для x = LBound(fndList) To UBound(fndList)
Для каждого sht в ActiveWorkbook.Рабочий лист
шт.Клетки.Заменить что:=fndList(x), замена:=rplcList(x), _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
SearchFormat:=False, ReplaceFormat:=False
Следующая шт

Далее х

Конец Подводной Лодки

2 Ответов

Рейтинг:
1

CHill60

Я сделал это как упражнение. Я не уверен, что мой подход особенно хорош, и это потенциально может занять некоторое время для обработки, но вот идет...

Я настроил пару массивов. Один содержит символ, который может быть затронут, а другой содержит правила, изложенные в вашем вопросе. Индексы каждого элемента каждого массива должны совпадать.

Dim arrSymbols(19) As String
Dim arrCorrect(19) As String
Public Sub SetUp()
    arrSymbols(1) = ".": arrCorrect(1) = ". "
    arrSymbols(2) = ":": arrCorrect(2) = ": "
    arrSymbols(3) = ",": arrCorrect(3) = ", "
    arrSymbols(4) = "(": arrCorrect(4) = " ("
    arrSymbols(5) = ")": arrCorrect(5) = ") "
    arrSymbols(6) = "/": arrCorrect(6) = "/"
    arrSymbols(7) = "-": arrCorrect(7) = " - "
    arrSymbols(8) = "!": arrCorrect(8) = "!"
    arrSymbols(9) = "#": arrCorrect(9) = "#"
    arrSymbols(10) = "*": arrCorrect(10) = "*"
    arrSymbols(11) = ";": arrCorrect(11) = "; "
    arrSymbols(12) = "_": arrCorrect(12) = "_"
    arrSymbols(13) = "{": arrCorrect(13) = " {"
    arrSymbols(14) = "}": arrCorrect(14) = "} "
    arrSymbols(15) = "'": arrCorrect(15) = "'"
    arrSymbols(16) = Chr$(145): arrCorrect(16) = Chr$(145)  'Left single quote
    arrSymbols(17) = Chr$(146): arrCorrect(17) = Chr$(146)  'Right single quote
    arrSymbols(18) = Chr$(147): arrCorrect(18) = " " & Chr$(147)  'Left double quote
    arrSymbols(19) = Chr$(148): arrCorrect(19) = " " & Chr$(148)  'Right double quote
End Sub
Я включил функцию, чтобы увидеть, действительно ли какие-либо символы появляются в любом месте входной строки. Чтобы попытаться улучшить производительность, он возвращается сразу же, как только находит любой из символов...
Public Function Contains(Test As String, Against() As String) As Boolean

    Dim i As Integer
    Contains = False
    
    For i = 1 To UBound(Against)
    
        If InStr(Test, Against(i)) Then
            Contains = True
            Exit For
        End If
    
    Next

End Function
Фактическая функция, которая выполняет эту работу, сначала проверяет, нужно ли что-то делать (а если нет, то просто возвращает исходную строку ввода).
Для каждого из рассматриваемых символов и только в том случае, если этот символ появляется во входной строке, он заменяет все экземпляры символа пробел + только символом, а также заменяет все экземпляры символа пробел + только символом.
Наконец, он заменяет символ соответствующим содержанием arrCorrect, только если в правилах есть пробелы.
Public Function AdjustSymbols(ByVal sInput As String) As String

    'Exit if the string does not contain any of the symbols
    If Not Contains(sInput, arrSymbols) Then
        AdjustSymbols = sInput
        Exit Function
    End If
    
    Dim sOut As String
    sOut = sInput
    Dim i As Integer
    For i = 1 To UBound(arrSymbols)
        If InStr(sOut, arrSymbols(i)) Then
            While InStr(sOut, " " + arrSymbols(i)) > 0
                sOut = Replace(sOut, " " + arrSymbols(i), arrSymbols(i))
            Wend
            While InStr(sOut, arrSymbols(i) + " ") > 0
                sOut = Replace(sOut, arrSymbols(i) + " ", arrSymbols(i))
            Wend
            If Not arrSymbols(i) = arrCorrect(i) Then
                sOut = Replace(sOut, arrSymbols(i), arrCorrect(i))
            End If
        End If
    Next
    
    AdjustSymbols = sOut
    
End Function
И пример из моего тестирования
Call SetUp   'Call on sheet load or similar

Dim aStringTest As String
aStringText = "i**!   _          (,."
Debug.Print "!" + AdjustSymbols(aStringText) + "!"
'Output is !i**!_(, . !
Вы бы передали каждую ячейку, которую хотите рассмотреть, в эту функцию.


Maciej Los

5ед!

Рейтинг:
0

Patrice T

Вам нужно использовать RegEx (регулярные выражения), потому что для каждого символа вам нужно получить все окружающие пробелы, а затем заменить их тем, что вы хотите, используя функцию RegEx replace.
Это Регулярное Выражение

"\s*,\s*"

найдите комы и окружающие их пространства.
Excel Regex Tutorial (регулярные выражения) - The Analyst Cave | Excel, VBA, программирование и многое другое[^]

Несколько интересных ссылок, помогающих создавать и отлаживать регулярные выражения.
Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
Это показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]


Maciej Los

5ед!

Patrice T

Спасибо