Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2019, 05:09   #11
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Здравствуйте.
Цитата:
на работе озадачили изучить vba, разбираюсь понемногу в маленьких задачках
Если так, то зачем ограничиваться конкретным набором используемых функций?
Решение данной задачи только оговоренными Вами функциями будет очень не рациональное. Я бы сделал так:
Код:
Sub qq()
    Dim s As String, i As Long, q, z
    If [A1] = "" Then Exit Sub
    s = Replace(Replace(LCase([A1]), ",", " , "), ".", "")
    q = Split(Application.Trim(s))
    Set z = CreateObject("Scripting.Dictionary")
    For i = LBound(q) To UBound(q)
        If z.Exists(q(i)) Then z(q(i)) = z(q(i)) + 1 Else z(q(i)) = 1
    Next
    Range("A2:B" & Rows.Count).ClearContents
    [A2].Resize(z.Count).Value = Application.Transpose(z.Keys)
    [B2].Resize(z.Count).Value = Application.Transpose(z.Items)
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 21.05.2019, 08:41   #12
Damlbdor
Пользователь
 
Регистрация: 20.05.2019
Сообщений: 15
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Решение данной задачи только оговоренными Вами функциями будет очень не рациональное.
Но нужно только ими.
Damlbdor вне форума Ответить с цитированием
Старый 21.05.2019, 09:17   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Damlbdor Посмотреть сообщение
Но нужно только ими.
вот, не пользы дела, а только из любопытства - а чем это ограничение вызвано?
Вот реально непонятно, зачем пытаться "забить гвоздь шуруповёртом"?

ну и тогда вопрос - а что не получается? какую помощь Вы ожидаете получить?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.05.2019, 09:52   #14
Damlbdor
Пользователь
 
Регистрация: 20.05.2019
Сообщений: 15
По умолчанию

в мой код поставить условие: если увидели запятую, ее копировать в отдельную строку, если увидели точку, она означает, что предложение закончено, но точка никуда не копируется и повторяющиеся слова чтоб не выносились в отдельные ячейки
Damlbdor вне форума Ответить с цитированием
Старый 21.05.2019, 10:28   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Damlbdor Посмотреть сообщение
в мой код поставить условие: если увидели запятую, ее копировать в отдельную строку, если увидели точку, она означает, что предложение закончено, но точка никуда не копируется и повторяющиеся слова чтоб не выносились в отдельные ячейки
продолжаем разговор... (c) Карлсон

1) обязательно поставьте опцию "Requare Variable Declaration"
см. меню "Tools" - "Options..." - закладка "Editor"

в начале модуля должно быть
Код:
Option Explicit

у Вас это не установлено. судя по тому, что переменная J из вашего кода не описана.




2) попробуйте такой код
Код:
Option Explicit

Sub xxx()
Dim A As String, j As Integer, i As Integer, k1 As Integer, k2 As Integer
 A = Trim(Range("A1"))
 k1 = InStr(1, A, ".")
 If k1 = 0 Then
    MsgBox "Нет точки в конце"
    Exit Sub
 End If
 A = Trim(Left(A, k1 - 1))
 If A = "" Then
    MsgBox "Пустой текст до первой точки. Нечего делать"
    Exit Sub
 End If
 
 A = Replace(A, ",", " , ") & " "

 Range("A2:B" & Rows.Count).ClearContents ' очистить старое

 k1 = 0
 i = 0
Do
    k2 = InStr(k1 + 1, A, " ")
     If k2 = 0 Then Exit Do
      If k2 - k1 > 1 Then
        i = i + 1
      Cells(1 + i, 1) = Mid(A, k1 + 1, k2 - k1 - 1)
    End If
    k1 = k2
Loop
k2 = i + 2
For i = 2 To k2 - 1
  If Cells(i, 2) <> -1 Then
    A = Cells(i, 1): k1 = 1
    For j = i + 1 To k2
      If A = Cells(j, 1) Then Cells(j, 2) = -1: k1 = k1 + 1
    Next
    Cells(i, 2) = k1
  End If
Next
For i = 2 To k2
  If Cells(i, 2) = -1 Then Cells(i, 2) = ""
Next
End Sub

Последний раз редактировалось Serge_Bliznykov; 21.05.2019 в 10:36. Причина: добавил очистку старого вывода
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.05.2019, 09:30   #16
Damlbdor
Пользователь
 
Регистрация: 20.05.2019
Сообщений: 15
По умолчанию

Код:
Sub xxx()
Dim A As String, j As Integer, i As Integer, k1 As Integer, k2 As Integer
 A = Trim(Range("A1")) ' убираем пробелы в начале и в конце строки
 k1 = InStr(1, A, ".") ' сравнение строк(положение символа в А с которого начинается проверка, содержится ли А в "."
 If k1 = 0 Then ' если k1=0 тоесть проверка посимвольно закончилась
Exit Sub 'выйти из процедуры
 End If ' закончить условие
 A = Trim(Left(A, k1 - 1))' переменной А присвоить значение, убрать пробелы вначале и в конце строки(возращает копию части строки А начиная с первого символа, количество символов до точки минус 1)
If A = "" Then  ' если А равно значению в кавычках тогда
Exit Sub ' выйти из процедуры
 End If ' закончить условие
 A = Replace(A, ",", " , ") & " " ' присвоить переменной А, вернуть исходную строку с замененным строковым фрагментом(строка А, подстрока которую нужно заменить ",", " , ") соединить с пробелом
 k1 = 0 ' присвоить переменной k1 значение 0
 i = 0 'присвоить переменной i значение 0
Do
    k2 = InStr(k1 + 1, A, " ")
    ' присвоить переменной k2 значение равное сравнение строк(положение символа к1+1, строка А, пробел)
     If k2 = 0 Then Exit Do
     ' если к2 присвоить значение 0 тогда выйти из цикла
      If k2 - k1 > 1 Then
      ' если к2-к1 больше 1 тогда
        i = i + 1
        ' i присвоть значение i+1
      Cells(1 + i, 1) = Mid(A, k1 + 1, k2 - k1 - 1)
      ' ячейке(строка 1 + i, столбец 1) присвоить значение извлеченное из (строки А, положение символа k1+1, количество копирумеых символов к2-к1-1)
    End If
    ' закончить условие
    k1 = k2
    ' присвоить к1 значение к2
Loop
' повтор цикла
k2 = i + 2
'присвоить к2 значение i+2
For i = 2 To k2 - 1 '
  If Cells(i, 2) <> -1 Then
  ' если ячейка(строка i, столбец 2) не равно -1 тогда
    A = Cells(i, 1): k1 = 1
    ' присвоить А значение ячейка( строка i, столбец 1) НЕ ЗНАЮ ЧТО ЗНАЧИТ ДВОЕТОЧИЕ присвоить к1 значение 1
    For j = i + 1 To k2
    ' счетчик цикла от i+1 до к2
      If A = Cells(j, 1) Then Cells(j, 2) = -1: k1 = k1 + 1
      ' если присвоить А значение равное ячейка(строка j, столбец 1) тогда ячейке(строка j, столбец 2) присвоить значение -1 НЕ ЗНАЮ ЧТО ЗНАЧИТ ДВОЕТОЧИЕ присвоить к1 значение к1+ 1
    Next ' повтор цикла
    Cells(i, 2) = k1 ' ячейке(строка i, столбец 2) присвоить значение к1
  End If ' закончить условие
Next ' повтор цикла
For i = 2 To k2 ' счетчик цикла рт 2 до к2
  If Cells(i, 2) = -1 Then Cells(i, 2) = ""
  ' если ячейка(строка i, столбец 2) присвоить значение -1 тогда ячейка(строка i, столбец 2) присвоить значение равное в кавычках
Next ' повтор цикла
End Sub 'выход из процедуры
Доброе утро, я все же правильно понимаю?
Damlbdor вне форума Ответить с цитированием
Старый 22.05.2019, 09:33   #17
Damlbdor
Пользователь
 
Регистрация: 20.05.2019
Сообщений: 15
По умолчанию

И как в здравом уме все это из головы брать и писать такой код который будет выполнять то что мне нужно?
Damlbdor вне форума Ответить с цитированием
Старый 22.05.2019, 09:46   #18
Damlbdor
Пользователь
 
Регистрация: 20.05.2019
Сообщений: 15
По умолчанию

я правда убрал то, что не нужно
Damlbdor вне форума Ответить с цитированием
Старый 22.05.2019, 09:51   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

оффтоп
Цитата:
Сообщение от Damlbdor Посмотреть сообщение
И как в здравом уме все это из головы брать и писать такой код который будет выполнять то что мне нужно?
Программисты все психи раз берут все это из головы в здравом уме. А может и не в здравом ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.05.2019, 09:51   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Damlbdor Посмотреть сообщение
сравнение строк(положение символа в А с которого начинается проверка, содержится ли А в "."
поиск подстроки в строке - возвращается позиция первого вхождения подстроки или 0, если нет такой подстроки в строке


Цитата:
Сообщение от Damlbdor Посмотреть сообщение
Код:
If k1 = 0 Then ' если k1=0 тоесть проверка посимвольно закончилась
нет. k1=0 если в строке не найдена точка (см. сообщение пользователю ниже)


Цитата:
Сообщение от Damlbdor Посмотреть сообщение
Код:
A = Trim(Left(A, k1 - 1))
в переменную A поместить часть строки A до первой точки (обрезав ведущие и конечные пробелы)


Цитата:
Сообщение от Damlbdor Посмотреть сообщение
Код:
If A = "" Then  ' если А равно значению в кавычках тогда
если после обрезки осталась пустая строка (это значит, что до первой точки в строке либо пробелы, либо ничего вообще нет


Цитата:
Сообщение от Damlbdor Посмотреть сообщение
Код:
If k2 = 0 Then Exit Do
     ' если к2 присвоить значение 0 тогда выйти из цикла
нет тут никакого присваивания. знак "=" в условных операторах означает сравнение (читаем, ЕСЛИ K2 равно 0 ТОГДА <что то делать>...)
и вообще - это же строчка кода из вашего кода. Вы взяли чужой код и не понимаете, что там происходит? Тогда надо разобраться.

Цитата:
Сообщение от Damlbdor Посмотреть сообщение
Код:
A = Cells(i, 1): k1 = 1
' присвоить А значение ячейка( строка i, столбец 1) НЕ ЗНАЮ ЧТО ЗНАЧИТ ДВОЕТОЧИЕ присвоить к1 значение 1
двоеточие позволяет записать несколько команд в одну строчку
это полностью эквивалентно коду
Код:
A = Cells(i, 1)
k1 = 1

остальное более-менее.
При разборе кода старайтесь понимать не буквально, что означает каждая строчка,
а для чего она нужна.
для чего нужны переменные A k1 k2, что в них находится.
почему мы проверяем на ноль, что это означает,
что означает If k2 - k1 > 1 Then почему разница должна быть больше единицы
k1 = k2 ' присвоить к1 значение к2
что находится в k1 и k2 и для чего мы присваиваем k1 значение k2
и т.д.
для понимания нарисуйте блок-схему алгоритма (можно даже обобщённую)


Да. не забудьте ещё обязательно вставить команду очистки старого содержимого
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Код:
Range("A2:B" & Rows.Count).ClearContents ' очистить старое
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дано предложение. Удалить из каждого слова повторяющиеся буквы staccy Помощь студентам 0 14.03.2017 20:32
Из текстового файла прочитать предложение, первую букву каждого слова сделать большой romaust C# (си шарп) 0 04.05.2016 10:51
в заданной строке символов (отдельные слова, разделенные пробелом) найти слова с совпадающими первой и последней буквами (С++) T_h_i_s Помощь студентам 0 19.11.2012 18:37
Вывести слова предложения в таком порядке, чтобы последняя буква каждого слова совпадала с первой буквой следующего слова ( java ) huhu Помощь студентам 0 06.04.2012 19:42
В заданном текстовом файле подсчитать частоту использования каждого слова из словаря (другого текстового lineico Помощь студентам 4 09.05.2011 19:35