#excel #vba
Вопрос:
прикрепленный макрос используется для поиска значений с
xFind = Приложение.Поле ввода(«код / слово для поиска:», «поиск»)
и замените их на
RepWith = Заявка.Поле ввода(«Заменить на :», «заменить»)
Это не работает должным образом
если значения вводятся с клавиатуры компьютера, они заменяются
если значения вставлены с помощью копирования / вставки, они не заменяются
Option Explicit
Sub cell_all_new_2() 'celle colonna
Dim FoundCell As Range
Dim FirstFound As Range
Dim xFind As Variant
Dim ResultRange As Range
Dim RepWith As Variant
Dim anser As Integer
Dim CellsToRep As Variant
Dim j As Long
Dim mAdrs As String
Dim Col As Variant
Dim avviso As String
xFind = Application.InputBox("code / word to search:", "search")
If xFind = False Then Exit Sub
RepWith = Application.InputBox("Replace with :", "replace")
If RepWith = False Then Exit Sub
Set FoundCell = Cells.Find(What:=xFind, _
After:=ActiveCell, _
LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False)
If Not FoundCell Is Nothing Then
Set FirstFound = FoundCell
Do Until False
If ResultRange Is Nothing Then
Set ResultRange = FoundCell
Else
Set ResultRange = Application.Union(ResultRange, FoundCell)
End If
Set FoundCell = Cells.FindNext(After:=FoundCell)
If (FoundCell Is Nothing) Then
Exit Do
End If
If (FoundCell.Address = FirstFound.Address) Then
Exit Do
End If
Loop
End If
If ResultRange Is Nothing Then
anser = MsgBox("no occurrence found! ", vbCritical vbDefaultButton2, "notice!")
Exit Sub
End If
Dim loopCell As Range
Dim colDict As Object
Set colDict = CreateObject("Scripting.Dictionary")
'Loop through each cell and assign the column letter from its address to the dictionary (to remove duplicate)
For Each loopCell In ResultRange.Cells
colDict(Split(loopCell.Address, "$")(1)) = 1
Next loopCell
'Assign an array from the dictionary keys
Dim colArr As Variant
colArr = colDict.Keys
Set colDict = Nothing
'Sort the array alphabetically
Quicksort colArr, LBound(colArr), UBound(colArr)
anser = MsgBox("found " amp; ResultRange.Count amp; "" amp; vbCr amp; _
"<" amp; xFind amp; ">" amp; vbCr amp; _
"in column <" amp; Join(colArr, " / ") amp; ">" amp; vbCr amp; _
"code / word" amp; vbCr amp; _
"replace with" amp; vbCr amp; _
"<" amp; RepWith amp; ">?", vbInformation vbYesNo, "NOTICE!")
If anser = vbNo Then Exit Sub
mAdrs = ResultRange.Address
mAdrs = Replace(mAdrs, ":", ",")
CellsToRep = Split(mAdrs, ",")
For j = 0 To UBound(CellsToRep)
Range(CellsToRep(j)) = Replace(Range(CellsToRep(j)), xFind, RepWith)
Next
End Sub
Sub Quicksort(vArray As Variant, arrLbound As Long, arrUbound As Long)
'Sorts a one-dimensional VBA array from smallest to largest
'using a very fast quicksort algorithm variant.
Dim pivotVal As Variant
Dim vSwap As Variant
Dim tmpLow As Long
Dim tmpHi As Long
tmpLow = arrLbound
tmpHi = arrUbound
pivotVal = vArray((arrLbound arrUbound) 2)
While (tmpLow <= tmpHi) 'divide
While (vArray(tmpLow) < pivotVal And tmpLow < arrUbound)
tmpLow = tmpLow 1
Wend
While (pivotVal < vArray(tmpHi) And tmpHi > arrLbound)
tmpHi = tmpHi - 1
Wend
If (tmpLow <= tmpHi) Then
vSwap = vArray(tmpLow)
vArray(tmpLow) = vArray(tmpHi)
vArray(tmpHi) = vSwap
tmpLow = tmpLow 1
tmpHi = tmpHi - 1
End If
Wend
If (arrLbound < tmpHi) Then Quicksort vArray, arrLbound, tmpHi 'conquer
If (tmpLow < arrUbound) Then Quicksort vArray, tmpLow, arrUbound 'conquer
End Sub
Комментарии:
1. Сравните значения xFind и RepWith при вводе значений и при их копировании/вставке. Часто при копировании/вставке вы можете выделить начальные или конечные пробелы, разрывы строк и другие непечатаемые символы. Вы должны сравнить LEN между этими двумя. Вы также можете попробовать использовать функцию ОЧИСТКИ, чтобы удалить их перед поиском.
2. в копипасте нет пробелов или чего-либо еще
3. Введите значение для
xFind
и вставьте значениеRepWith
, затем послеIf RepWith = False Then Exit Sub, insert
MsgBox xFind = RepWith` и запустите подменю. Что говорит MsgBox? @maxma624. значения в msgbox являются точными, но не заменяются
5. пример : запишите в ячейку A10 = 123456
Ответ №1:
Ваша логика для ввода ячеек ResultRange
ошибочна, если есть непрерывный диапазон, например, диапазон A1:A10
означает, что есть 10 ячеек, но mAdrs = Replace(mAdrs, ":", ",")
A1:A10
A1,A10
они будут совершенно разными (2 ячейки).
Замените этот блок кодов:
mAdrs = ResultRange.Address
mAdrs = Replace(mAdrs, ":", ",")
CellsToRep = Split(mAdrs, ",")
For j = 0 To UBound(CellsToRep)
Range(CellsToRep(j)) = Replace(Range(CellsToRep(j)), xFind, RepWith)
Next
Для:
For Each loopCell In ResultRange.Cells
loopCell.Value = Replace(loopCell.Value, xFind, RepWith)
Next loopCell
Комментарии:
1. я Рэймонд Ву, теперь ваша копипаста работает
2. Я не понимаю, почему другие клетки не меняются
3. как я могу отправить образец файла, если это возможно?
4. o.k. on «.filedropper.com » ?
5. @maxma62 пожалуйста, опишите, что вы подразумеваете под другими ячейками, которые не меняются, когда в вашем предыдущем комментарии говорится, что это работает. Так сработало это или нет?