Страницы: 1
RSS
макрос замены кавычек excel на обычные
 
Добрый день!  
Написал код, который д/заменять в выделенных ячейках кавычки excel на наши. Он почему-то заменяет только первое вхождение.  
Где ошибка?  
С уважением,
 
Четвертый аргумент функции ПОДСТАВИТЬ - не номер символа, а номер вхождения, т.е. не j, а i:  
v = Application.WorksheetFunction.Substitute(v, av, o, i)  
 
Но так тоже не работает до конца, лень разбираться почему. Проще так:  
Mid(v, j) = o
 
i это порядковый номер кавычки в тексте  
j - позиция этой кавычки
 
Так и я о том же.  
Попробуйте - добавил логики на случай непарных кавычек:  
 
Sub kavyc1()  
Dim j&, cell As Range, v$, lr As Boolean 'False - левая кавычка, True - правая  
For Each cell In Selection  
   v = cell.Value  
   j = InStr(v, """")  
   lr = False 'первая кавычка - левая  
   Do Until j = 0  
       If j = Len(v) Then  
           lr = True 'кавычка в конце строки - правая  
       ElseIf j > 1 Then  
           If Mid$(v, j - 1, 1) = " " Then lr = False 'после пробела левая кавычка  
           If Mid$(v, j + 1, 1) = " " Then lr = True 'перед пробелом правая кавычка  
       End If  
       Mid$(v, j) = IIf(lr, "»", "«") 'IIf(lr, Chr$(187), Chr$(171))  
       lr = Not lr  
       j = InStr(j, v, """")  
   Loop  
   cell.Value = v  
Next cell  
End Sub
 
оказывается, Mid можно и так использовать  
Sub kavyc()  
Dim i&, j&  
Dim o, z, v, av  
o = Chr(171)  
z = Chr(187)  
av = Chr(34)  
Dim r As Range  
Dim cell  
Set r = Selection  
 
For Each cell In r  
v = cell.Value  
sss = Application.WorksheetFunction.Trim(v)  
sss = Application.WorksheetFunction.Substitute(v, av, "")  
If Len(sss) < Len(v) Then  
j = 0  
For i = 1 To Len(v) - Len(sss)  
j = InStr(j + 1, v, av)  
If j = 1 Then  
Mid(v, j, 1) = o  
Else  
If Mid(v, j - 1, 1) = " " Or Mid(v, j - 2, 1) = " " Then  
Mid(v, j, 1) = o  
Else  
Mid(v, j, 1) = z  
End If  
End If  
Next i  
cell.Value = v  
End If  
Next cell  
End Sub
 
=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(C4;"""";"«";1);"""";"»";1);"""";"«";1);"""";"»";1)  
 
--  
Можно ли использовать функцию =ПОВТОР для повтора функций, т.е не только для текста и ссылок на ячейки? В данном случае было бы:  
 
=ПОВТОР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(C4;"""";"«";1);"""";"»";1);(ДЛСТР(C4)-ДЛСТР(ПОДСТАВИТЬ(C4;"""";"")))/2)  
 
..но, не получается.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
=ПСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(" "&C4;" "&СИМВОЛ(34);" "&СИМВОЛ(171));СИМВОЛ(34);СИМВОЛ(187));2;ДЛСТР(C4))
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=ikki}{date=18.05.2011 08:04}{thema=}{post}=ПСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(" "&C4;" "&СИМВОЛ(34);" "&СИМВОЛ(171));СИМВОЛ(34);СИМВОЛ(187));2;ДЛСТР(C4)){/post}{/quote}  
 
..ПСТР можно опустить.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Вариант UDF  
Function test(Ren)  
   Dim n, j  
   n = 1  
   test = Ren  
   For j = 1 To Len(test)  
       If Asc(Mid(test, j, 1)) = 34 Then  
           test = Replace(Left(test, j), Chr(34), Chr(IIf(n = 1, 171, 187))) & Right(test, Len(test) - j)  
           n = -1 * n  
       End If  
   Next j  
End Function
 
конечно, надо понимать, что в моей формуле открывающей считается кавычка, либо стоящая первой в ячейке, либо та, перед которой находится пробел. все остальные кавычки считаются закрывающими.  
 
соответствующая UDF:  
 
Function ff(s As String) As String  
 With Application.WorksheetFunction  
   ff = Mid(.Substitute(.Substitute(" " & s, " " & Chr(34), " " & Chr(171)), Chr(34), Chr(187)), 2, Len(s))  
 End With  
End Function
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=Владимир}{date=18.05.2011 08:14}{thema=Re: }{post}  
..ПСТР можно опустить.{/post}{/quote}  
 
так пробел же останется :)  
но можно ПРАВСИМВ(..., ДЛСТР(C4))
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Прошу прощения, пробел не заметил..
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
Страницы: 1
Читают тему
Наверх