Консультация № 179758
22.08.2010, 00:16
0.00 руб.
0 3 1
Здравствуйте, эксперты.

Может ли кто-то помочь написать или может у кого-то уже есть готовая программа, чтобы в тексте в каждом слове оставлять только первую букву, заменяя все остальные точками.

Вот так:
М.... л. к..... п..... н....... и.. м.... у к...... у.. е... г...... п........

Количество точек соответствует количеству удаляемых букв.
Я пытался написать сам на VBA, но у меня выдает ошибку Invalid Procedure Call or Argument на строчке "d(j) = f & String$(e - 1, ".")", причем выполняется код какое-то время, а потом выдается ошибка. В отладчике видно, что переменная konez не пустая.

Приложение:
Sub Макрос6()
Dim c() As String
Dim d() As String
'Dim Probely() As Byte
Dim e As Long

Dim i As Long
Dim j As Long

'Выделяем текст
Selection.WholeStory
' Selection.MoveRight Unit:=wdCharacter, Count:=1
a = Selection.Text

'Узнаем сколько абзацев в тексте
b = CountDelimeter(a, vbCrLf)

ReDim c(1 To b) As String
' ReDim Probely(1 To b) As Byte

'Распределяем абзацы по элементам массива c(i)
For i = 1 To b
c(i) = GetSubString(a, vbCr, i)
Next i

'Находим слова в каждом абзаце и распределяем по элементам массива d(j)
For i = 1 To b
Probely = CountDelimeter(c(i), " ") + 1

ReDim d(1 To Probely) As String

For j = 1 To Probely
d(j) = GetSubString(c(i), " ", j)

'Замена всех букв в слове на точки, кроме первой
If (d(j) <> "-") Then
e = Len(d(j))
f = Left(d(j), 1)
d(j) = f & String$(e - 1, ".")
End If
konez = konez & d(j) & " "
Next j
konez = konez & vbCrLf
Next i
Debug.Print konez

End Sub

Обсуждение

Неизвестный
22.08.2010, 01:54
общий
это ответ
Здравствуйте, Puma.

Программа для VB6. На форме должно быть 2 текстбокса и кнопка. Различается только пробел, все остальные символы распознаются как буквы. Если надо еще различать пунктуацию и перенос строк - придется доделать.

Функция просто проходит по всем буквам и замещает на точку, если нужно. В ВБА, по идее, должно работать без изменений.

Приложение:
Option Explicit

Private Sub Command1_Click()
Text2.Text = Convert(Text1.Text)
End Sub

Function Convert(S As String) As String
Dim i As Integer
Dim c As String
Dim WasSpace As Boolean
WasSpace = True

For i = 1 To Len(S)
c = Mid(S, i, 1)
If c = " " Then
WasSpace = True
Else
If Not WasSpace Then
Mid(S, i, 1) = "."
End If
WasSpace = False
End If
Next i

Convert = S
End Function
5
Ответ оказался полезным. Спасибо.
Неизвестный
22.08.2010, 08:38
общий
Спасибо Evgenijm.

С пунктуацией хотел сделать через оператор like, но как мне записать само выражения для сравнения?
Например, if (Mid(S,i,1) Like [!,.:;-()], т.е. все знаки препинания, кроме восклицательного и вопросительного знаков, т.к. они используются как внутренние управляющие оператора Like. Эта конструкция не работает, выдает ошибку Internal Operator Not Defined.
Неизвестный
23.08.2010, 04:04
общий
Like никогда не использовал, так что не в курсе его возможностей. Вроде, он не поддерживает конструкцию "или". Тогда он бесполезен в данном случае. В любом случае, такое написание неправильно: он же стринг использует, справа все надо в кавычки взять и в квадратные скобки надо заключить каждый отдельный символ.

Можно использовать каскад выражений типа If c = " " Then для каждого спецсимвола, или переписать его как Select Case. Если используется только один или 2 алфавита, то можно наоборот ифами искать буквы if UCase(c)>="A" and UCase(c)<="Z")
Форма ответа